blob: c8d84f685e3b0c8491a3c4c5cac55597fa7b1491 [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
Yves Gerey3e707812018-11-28 16:47:49 +010011#include <stddef.h>
12#include <cstdint>
kwibergd1fe2812016-04-27 06:47:29 -070013#include <memory>
deadbeef70ab1a12015-09-28 16:53:55 -070014#include <string>
Tommif888bb52015-12-12 01:37:01 +010015#include <utility>
Yves Gerey3e707812018-11-28 16:47:49 +010016#include <vector>
deadbeef70ab1a12015-09-28 16:53:55 -070017
Amit Hilbuch2297d332019-02-19 12:49:22 -080018#include "absl/algorithm/container.h"
Yves Gerey3e707812018-11-28 16:47:49 +010019#include "absl/memory/memory.h"
20#include "absl/types/optional.h"
21#include "api/audio_options.h"
Steve Anton10542f22019-01-11 09:11:00 -080022#include "api/crypto/crypto_options.h"
23#include "api/crypto/frame_decryptor_interface.h"
24#include "api/crypto/frame_encryptor_interface.h"
25#include "api/dtmf_sender_interface.h"
26#include "api/media_stream_interface.h"
27#include "api/rtc_error.h"
28#include "api/rtp_parameters.h"
Mirko Bonadeid9708072019-01-25 20:26:48 +010029#include "api/scoped_refptr.h"
Benjamin Wright84583f62018-10-04 14:22:34 -070030#include "api/test/fake_frame_decryptor.h"
31#include "api/test/fake_frame_encryptor.h"
Yves Gerey3e707812018-11-28 16:47:49 +010032#include "logging/rtc_event_log/rtc_event_log.h"
33#include "media/base/codec.h"
Steve Anton10542f22019-01-11 09:11:00 -080034#include "media/base/fake_media_engine.h"
35#include "media/base/media_channel.h"
36#include "media/base/media_config.h"
37#include "media/base/media_engine.h"
38#include "media/base/rtp_data_engine.h"
39#include "media/base/stream_params.h"
40#include "media/base/test_utils.h"
41#include "media/engine/fake_webrtc_call.h"
42#include "p2p/base/dtls_transport_internal.h"
43#include "p2p/base/fake_dtls_transport.h"
44#include "p2p/base/p2p_constants.h"
Ruslan Burakov501bfba2019-02-11 10:29:19 +010045#include "pc/audio_rtp_receiver.h"
Steve Anton10542f22019-01-11 09:11:00 -080046#include "pc/audio_track.h"
Yves Gerey3e707812018-11-28 16:47:49 +010047#include "pc/channel.h"
Steve Anton10542f22019-01-11 09:11:00 -080048#include "pc/channel_manager.h"
49#include "pc/dtls_srtp_transport.h"
50#include "pc/local_audio_source.h"
51#include "pc/media_stream.h"
Ruslan Burakov7ea46052019-02-16 02:07:05 +010052#include "pc/remote_audio_source.h"
Steve Anton10542f22019-01-11 09:11:00 -080053#include "pc/rtp_receiver.h"
54#include "pc/rtp_sender.h"
55#include "pc/rtp_transport_internal.h"
56#include "pc/test/fake_video_track_source.h"
Ruslan Burakov501bfba2019-02-11 10:29:19 +010057#include "pc/video_rtp_receiver.h"
Steve Anton10542f22019-01-11 09:11:00 -080058#include "pc/video_track.h"
Yves Gerey3e707812018-11-28 16:47:49 +010059#include "rtc_base/checks.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020060#include "rtc_base/gunit.h"
Yves Gerey3e707812018-11-28 16:47:49 +010061#include "rtc_base/third_party/sigslot/sigslot.h"
62#include "rtc_base/thread.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020063#include "test/gmock.h"
64#include "test/gtest.h"
deadbeef70ab1a12015-09-28 16:53:55 -070065
66using ::testing::_;
Amit Hilbuch2297d332019-02-19 12:49:22 -080067using ::testing::ContainerEq;
deadbeef70ab1a12015-09-28 16:53:55 -070068using ::testing::Exactly;
deadbeef5dd42fd2016-05-02 16:20:01 -070069using ::testing::InvokeWithoutArgs;
skvladdc1c62c2016-03-16 19:07:43 -070070using ::testing::Return;
Amit Hilbuch2297d332019-02-19 12:49:22 -080071using RidList = std::vector<std::string>;
deadbeef70ab1a12015-09-28 16:53:55 -070072
deadbeef20cb0c12017-02-01 20:27:00 -080073namespace {
74
Seth Hampson845e8782018-03-02 11:34:10 -080075static const char kStreamId1[] = "local_stream_1";
deadbeef70ab1a12015-09-28 16:53:55 -070076static const char kVideoTrackId[] = "video_1";
77static const char kAudioTrackId[] = "audio_1";
Peter Boström0c4e06b2015-10-07 12:23:21 +020078static const uint32_t kVideoSsrc = 98;
deadbeeffac06552015-11-25 11:26:01 -080079static const uint32_t kVideoSsrc2 = 100;
Peter Boström0c4e06b2015-10-07 12:23:21 +020080static const uint32_t kAudioSsrc = 99;
deadbeeffac06552015-11-25 11:26:01 -080081static const uint32_t kAudioSsrc2 = 101;
Florent Castelli892acf02018-10-01 22:47:20 +020082static const uint32_t kVideoSsrcSimulcast = 102;
83static const uint32_t kVideoSimulcastLayerCount = 2;
deadbeef20cb0c12017-02-01 20:27:00 -080084static const int kDefaultTimeout = 10000; // 10 seconds.
deadbeef20cb0c12017-02-01 20:27:00 -080085} // namespace
deadbeef70ab1a12015-09-28 16:53:55 -070086
87namespace webrtc {
88
Amit Hilbuch2297d332019-02-19 12:49:22 -080089class RtpSenderReceiverTest
90 : public testing::Test,
91 public testing::WithParamInterface<std::pair<RidList, RidList>>,
92 public sigslot::has_slots<> {
tkchin3784b4a2016-06-24 19:31:47 -070093 public:
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070094 RtpSenderReceiverTest()
Steve Anton47136dd2018-01-12 10:49:35 -080095 : network_thread_(rtc::Thread::Current()),
96 worker_thread_(rtc::Thread::Current()),
97 // Create fake media engine/etc. so we can create channels to use to
98 // test RtpSenders/RtpReceivers.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070099 media_engine_(new cricket::FakeMediaEngine()),
Karl Wiberg918f50c2018-07-05 11:40:33 +0200100 channel_manager_(absl::WrapUnique(media_engine_),
101 absl::make_unique<cricket::RtpDataEngine>(),
Steve Anton47136dd2018-01-12 10:49:35 -0800102 worker_thread_,
103 network_thread_),
Sebastian Jansson8f83b422018-02-21 13:07:13 +0100104 fake_call_(),
Seth Hampson845e8782018-03-02 11:34:10 -0800105 local_stream_(MediaStream::Create(kStreamId1)) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700106 // Create channels to be used by the RtpSenders and RtpReceivers.
107 channel_manager_.Init();
deadbeef7af91dd2016-12-13 11:29:11 -0800108 bool srtp_required = true;
Karl Wiberg918f50c2018-07-05 11:40:33 +0200109 rtp_dtls_transport_ = absl::make_unique<cricket::FakeDtlsTransport>(
Zhi Huange830e682018-03-30 10:48:35 -0700110 "fake_dtls_transport", cricket::ICE_CANDIDATE_COMPONENT_RTP);
111 rtp_transport_ = CreateDtlsSrtpTransport();
112
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700113 voice_channel_ = channel_manager_.CreateVoiceChannel(
Zhi Huange830e682018-03-30 10:48:35 -0700114 &fake_call_, cricket::MediaConfig(), rtp_transport_.get(),
Anton Sukhanov98a462c2018-10-17 13:15:42 -0700115 /*media_transport=*/nullptr, rtc::Thread::Current(), cricket::CN_AUDIO,
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800116 srtp_required, webrtc::CryptoOptions(), &ssrc_generator_,
117 cricket::AudioOptions());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700118 video_channel_ = channel_manager_.CreateVideoChannel(
Zhi Huange830e682018-03-30 10:48:35 -0700119 &fake_call_, cricket::MediaConfig(), rtp_transport_.get(),
Niels Möller46879152019-01-07 15:54:47 +0100120 /*media_transport=*/nullptr, rtc::Thread::Current(), cricket::CN_VIDEO,
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800121 srtp_required, webrtc::CryptoOptions(), &ssrc_generator_,
122 cricket::VideoOptions());
deadbeef20cb0c12017-02-01 20:27:00 -0800123 voice_channel_->Enable(true);
124 video_channel_->Enable(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700125 voice_media_channel_ = media_engine_->GetVoiceChannel(0);
126 video_media_channel_ = media_engine_->GetVideoChannel(0);
127 RTC_CHECK(voice_channel_);
128 RTC_CHECK(video_channel_);
129 RTC_CHECK(voice_media_channel_);
130 RTC_CHECK(video_media_channel_);
131
132 // Create streams for predefined SSRCs. Streams need to exist in order
133 // for the senders and receievers to apply parameters to them.
134 // Normally these would be created by SetLocalDescription and
135 // SetRemoteDescription.
136 voice_media_channel_->AddSendStream(
137 cricket::StreamParams::CreateLegacy(kAudioSsrc));
138 voice_media_channel_->AddRecvStream(
139 cricket::StreamParams::CreateLegacy(kAudioSsrc));
140 voice_media_channel_->AddSendStream(
141 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
142 voice_media_channel_->AddRecvStream(
143 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
144 video_media_channel_->AddSendStream(
145 cricket::StreamParams::CreateLegacy(kVideoSsrc));
146 video_media_channel_->AddRecvStream(
147 cricket::StreamParams::CreateLegacy(kVideoSsrc));
148 video_media_channel_->AddSendStream(
149 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
150 video_media_channel_->AddRecvStream(
151 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
tkchin3784b4a2016-06-24 19:31:47 -0700152 }
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700153
Zhi Huange830e682018-03-30 10:48:35 -0700154 std::unique_ptr<webrtc::RtpTransportInternal> CreateDtlsSrtpTransport() {
Karl Wiberg918f50c2018-07-05 11:40:33 +0200155 auto dtls_srtp_transport = absl::make_unique<webrtc::DtlsSrtpTransport>(
156 /*rtcp_mux_required=*/true);
Zhi Huange830e682018-03-30 10:48:35 -0700157 dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport_.get(),
158 /*rtcp_dtls_transport=*/nullptr);
159 return dtls_srtp_transport;
160 }
161
deadbeef20cb0c12017-02-01 20:27:00 -0800162 // Needed to use DTMF sender.
163 void AddDtmfCodec() {
164 cricket::AudioSendParameters params;
165 const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000,
166 0, 1);
167 params.codecs.push_back(kTelephoneEventCodec);
168 voice_media_channel_->SetSendParameters(params);
169 }
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700170
pbos5214a0a2016-12-16 15:39:11 -0800171 void AddVideoTrack() { AddVideoTrack(false); }
172
173 void AddVideoTrack(bool is_screencast) {
perkja3ede6c2016-03-08 01:27:48 +0100174 rtc::scoped_refptr<VideoTrackSourceInterface> source(
pbos5214a0a2016-12-16 15:39:11 -0800175 FakeVideoTrackSource::Create(is_screencast));
perkj773be362017-07-31 23:22:01 -0700176 video_track_ =
177 VideoTrack::Create(kVideoTrackId, source, rtc::Thread::Current());
deadbeefe814a0d2017-02-25 18:15:09 -0800178 EXPECT_TRUE(local_stream_->AddTrack(video_track_));
deadbeef70ab1a12015-09-28 16:53:55 -0700179 }
180
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700181 void CreateAudioRtpSender() { CreateAudioRtpSender(nullptr); }
182
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +0100183 void CreateAudioRtpSender(
184 const rtc::scoped_refptr<LocalAudioSource>& source) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700185 audio_track_ = AudioTrack::Create(kAudioTrackId, source);
deadbeefe814a0d2017-02-25 18:15:09 -0800186 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
Steve Anton47136dd2018-01-12 10:49:35 -0800187 audio_rtp_sender_ =
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800188 AudioRtpSender::Create(worker_thread_, audio_track_->id(), nullptr);
Steve Anton111fdfd2018-06-25 13:03:36 -0700189 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_));
190 audio_rtp_sender_->set_stream_ids({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800191 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
deadbeeffac06552015-11-25 11:26:01 -0800192 audio_rtp_sender_->SetSsrc(kAudioSsrc);
deadbeef20cb0c12017-02-01 20:27:00 -0800193 audio_rtp_sender_->GetOnDestroyedSignal()->connect(
194 this, &RtpSenderReceiverTest::OnAudioSenderDestroyed);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700195 VerifyVoiceChannelInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700196 }
197
Steve Anton02ee47c2018-01-10 16:26:06 -0800198 void CreateAudioRtpSenderWithNoTrack() {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800199 audio_rtp_sender_ =
200 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800201 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
Steve Anton02ee47c2018-01-10 16:26:06 -0800202 }
203
deadbeef20cb0c12017-02-01 20:27:00 -0800204 void OnAudioSenderDestroyed() { audio_sender_destroyed_signal_fired_ = true; }
205
Seth Hampson2d2c8882018-05-16 16:02:32 -0700206 void CreateVideoRtpSender(uint32_t ssrc) {
207 CreateVideoRtpSender(false, ssrc);
208 }
209
pbos5214a0a2016-12-16 15:39:11 -0800210 void CreateVideoRtpSender() { CreateVideoRtpSender(false); }
211
Amit Hilbuch2297d332019-02-19 12:49:22 -0800212 cricket::StreamParams CreateSimulcastStreamParams(int num_layers) {
Florent Castelli892acf02018-10-01 22:47:20 +0200213 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +0100214 ssrcs.reserve(num_layers);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800215 for (int i = 0; i < num_layers; ++i) {
Florent Castelli892acf02018-10-01 22:47:20 +0200216 ssrcs.push_back(kVideoSsrcSimulcast + i);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800217 }
218 return cricket::CreateSimStreamParams("cname", ssrcs);
219 }
220
221 uint32_t CreateVideoRtpSender(const cricket::StreamParams& stream_params) {
Florent Castelli892acf02018-10-01 22:47:20 +0200222 video_media_channel_->AddSendStream(stream_params);
223 uint32_t primary_ssrc = stream_params.first_ssrc();
224 CreateVideoRtpSender(primary_ssrc);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800225 return primary_ssrc;
226 }
227
228 uint32_t CreateVideoRtpSenderWithSimulcast(
229 int num_layers = kVideoSimulcastLayerCount) {
230 return CreateVideoRtpSender(CreateSimulcastStreamParams(num_layers));
231 }
232
233 uint32_t CreateVideoRtpSenderWithSimulcast(
234 const std::vector<std::string>& rids) {
235 cricket::StreamParams stream_params =
236 CreateSimulcastStreamParams(rids.size());
237 std::vector<cricket::RidDescription> rid_descriptions;
238 absl::c_transform(
239 rids, std::back_inserter(rid_descriptions), [](const std::string& rid) {
240 return cricket::RidDescription(rid, cricket::RidDirection::kSend);
241 });
242 stream_params.set_rids(rid_descriptions);
243 return CreateVideoRtpSender(stream_params);
Florent Castelli892acf02018-10-01 22:47:20 +0200244 }
245
Seth Hampson2d2c8882018-05-16 16:02:32 -0700246 void CreateVideoRtpSender(bool is_screencast, uint32_t ssrc = kVideoSsrc) {
pbos5214a0a2016-12-16 15:39:11 -0800247 AddVideoTrack(is_screencast);
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800248 video_rtp_sender_ =
249 VideoRtpSender::Create(worker_thread_, video_track_->id());
Steve Anton111fdfd2018-06-25 13:03:36 -0700250 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
251 video_rtp_sender_->set_stream_ids({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800252 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Seth Hampson2d2c8882018-05-16 16:02:32 -0700253 video_rtp_sender_->SetSsrc(ssrc);
254 VerifyVideoChannelInput(ssrc);
deadbeef70ab1a12015-09-28 16:53:55 -0700255 }
Steve Anton02ee47c2018-01-10 16:26:06 -0800256 void CreateVideoRtpSenderWithNoTrack() {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800257 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, /*id=*/"");
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800258 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Steve Anton02ee47c2018-01-10 16:26:06 -0800259 }
260
deadbeef70ab1a12015-09-28 16:53:55 -0700261 void DestroyAudioRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700262 audio_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700263 VerifyVoiceChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700264 }
265
266 void DestroyVideoRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700267 video_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700268 VerifyVideoChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700269 }
270
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100271 void CreateAudioRtpReceiver(
272 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
Mirko Bonadei05cf6be2019-01-31 21:38:12 +0100273 audio_rtp_receiver_ =
274 new AudioRtpReceiver(rtc::Thread::Current(), kAudioTrackId, streams);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800275 audio_rtp_receiver_->SetMediaChannel(voice_media_channel_);
Steve Antond3679212018-01-17 17:41:02 -0800276 audio_rtp_receiver_->SetupMediaChannel(kAudioSsrc);
perkjd61bf802016-03-24 03:16:19 -0700277 audio_track_ = audio_rtp_receiver_->audio_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700278 VerifyVoiceChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700279 }
280
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100281 void CreateVideoRtpReceiver(
282 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
Mirko Bonadei05cf6be2019-01-31 21:38:12 +0100283 video_rtp_receiver_ =
284 new VideoRtpReceiver(rtc::Thread::Current(), kVideoTrackId, streams);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800285 video_rtp_receiver_->SetMediaChannel(video_media_channel_);
Steve Antond3679212018-01-17 17:41:02 -0800286 video_rtp_receiver_->SetupMediaChannel(kVideoSsrc);
perkjf0dcfe22016-03-10 18:32:00 +0100287 video_track_ = video_rtp_receiver_->video_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700288 VerifyVideoChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700289 }
290
Florent Castelli38332cd2018-11-20 14:08:06 +0100291 void CreateVideoRtpReceiverWithSimulcast(
292 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {},
293 int num_layers = kVideoSimulcastLayerCount) {
294 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +0100295 ssrcs.reserve(num_layers);
Florent Castelli38332cd2018-11-20 14:08:06 +0100296 for (int i = 0; i < num_layers; ++i)
297 ssrcs.push_back(kVideoSsrcSimulcast + i);
298 cricket::StreamParams stream_params =
299 cricket::CreateSimStreamParams("cname", ssrcs);
300 video_media_channel_->AddRecvStream(stream_params);
301 uint32_t primary_ssrc = stream_params.first_ssrc();
302
Mirko Bonadei05cf6be2019-01-31 21:38:12 +0100303 video_rtp_receiver_ =
304 new VideoRtpReceiver(rtc::Thread::Current(), kVideoTrackId, streams);
Florent Castelli38332cd2018-11-20 14:08:06 +0100305 video_rtp_receiver_->SetMediaChannel(video_media_channel_);
306 video_rtp_receiver_->SetupMediaChannel(primary_ssrc);
307 video_track_ = video_rtp_receiver_->video_track();
308 }
309
deadbeef70ab1a12015-09-28 16:53:55 -0700310 void DestroyAudioRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700311 audio_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700312 VerifyVoiceChannelNoOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700313 }
314
315 void DestroyVideoRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700316 video_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700317 VerifyVideoChannelNoOutput();
318 }
319
320 void VerifyVoiceChannelInput() { VerifyVoiceChannelInput(kAudioSsrc); }
321
322 void VerifyVoiceChannelInput(uint32_t ssrc) {
323 // Verify that the media channel has an audio source, and the stream isn't
324 // muted.
325 EXPECT_TRUE(voice_media_channel_->HasSource(ssrc));
326 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(ssrc));
327 }
328
329 void VerifyVideoChannelInput() { VerifyVideoChannelInput(kVideoSsrc); }
330
331 void VerifyVideoChannelInput(uint32_t ssrc) {
332 // Verify that the media channel has a video source,
333 EXPECT_TRUE(video_media_channel_->HasSource(ssrc));
334 }
335
336 void VerifyVoiceChannelNoInput() { VerifyVoiceChannelNoInput(kAudioSsrc); }
337
338 void VerifyVoiceChannelNoInput(uint32_t ssrc) {
339 // Verify that the media channel's source is reset.
340 EXPECT_FALSE(voice_media_channel_->HasSource(ssrc));
341 }
342
343 void VerifyVideoChannelNoInput() { VerifyVideoChannelNoInput(kVideoSsrc); }
344
345 void VerifyVideoChannelNoInput(uint32_t ssrc) {
346 // Verify that the media channel's source is reset.
347 EXPECT_FALSE(video_media_channel_->HasSource(ssrc));
348 }
349
350 void VerifyVoiceChannelOutput() {
351 // Verify that the volume is initialized to 1.
352 double volume;
353 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
354 EXPECT_EQ(1, volume);
355 }
356
357 void VerifyVideoChannelOutput() {
358 // Verify that the media channel has a sink.
359 EXPECT_TRUE(video_media_channel_->HasSink(kVideoSsrc));
360 }
361
362 void VerifyVoiceChannelNoOutput() {
363 // Verify that the volume is reset to 0.
364 double volume;
365 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
366 EXPECT_EQ(0, volume);
367 }
368
369 void VerifyVideoChannelNoOutput() {
370 // Verify that the media channel's sink is reset.
371 EXPECT_FALSE(video_media_channel_->HasSink(kVideoSsrc));
deadbeef70ab1a12015-09-28 16:53:55 -0700372 }
373
Amit Hilbuch2297d332019-02-19 12:49:22 -0800374 // Verifies that the encoding layers contain the specified RIDs.
375 bool VerifyEncodingLayers(const VideoRtpSender& sender,
376 const std::vector<std::string>& rids) {
377 bool has_failure = HasFailure();
378 RtpParameters parameters = sender.GetParameters();
379 std::vector<std::string> encoding_rids;
380 absl::c_transform(
381 parameters.encodings, std::back_inserter(encoding_rids),
382 [](const RtpEncodingParameters& encoding) { return encoding.rid; });
383 EXPECT_THAT(rids, ContainerEq(encoding_rids));
384 return has_failure || !HasFailure();
385 }
386
387 // Runs a test for disabling the encoding layers on the specified sender.
388 void RunDisableEncodingLayersTest(
389 const std::vector<std::string>& all_layers,
390 const std::vector<std::string>& disabled_layers,
391 VideoRtpSender* sender) {
392 std::vector<std::string> expected;
393 absl::c_copy_if(all_layers, std::back_inserter(expected),
394 [&disabled_layers](const std::string& rid) {
395 return !absl::c_linear_search(disabled_layers, rid);
396 });
397
398 EXPECT_TRUE(VerifyEncodingLayers(*sender, all_layers));
399 sender->DisableEncodingLayers(disabled_layers);
400 EXPECT_TRUE(VerifyEncodingLayers(*sender, expected));
401 }
402
403 // Runs a test for setting an encoding layer as inactive.
404 // This test assumes that some layers have already been disabled.
405 void RunSetLastLayerAsInactiveTest(VideoRtpSender* sender) {
406 auto parameters = sender->GetParameters();
407 if (parameters.encodings.size() == 0) {
408 return;
409 }
410
411 RtpEncodingParameters& encoding = parameters.encodings.back();
412 auto rid = encoding.rid;
413 EXPECT_TRUE(encoding.active);
414 encoding.active = false;
415 auto error = sender->SetParameters(parameters);
416 ASSERT_TRUE(error.ok());
417 parameters = sender->GetParameters();
418 RtpEncodingParameters& result_encoding = parameters.encodings.back();
419 EXPECT_EQ(rid, result_encoding.rid);
420 EXPECT_FALSE(result_encoding.active);
421 }
422
423 // Runs a test for disabling the encoding layers on a sender without a media
424 // channel.
425 void RunDisableSimulcastLayersWithoutMediaEngineTest(
426 const std::vector<std::string>& all_layers,
427 const std::vector<std::string>& disabled_layers) {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800428 auto sender = VideoRtpSender::Create(rtc::Thread::Current(), "1");
Amit Hilbuch2297d332019-02-19 12:49:22 -0800429 RtpParameters parameters;
430 parameters.encodings.resize(all_layers.size());
431 for (size_t i = 0; i < all_layers.size(); ++i) {
432 parameters.encodings[i].rid = all_layers[i];
433 }
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800434 sender->set_init_send_encodings(parameters.encodings);
435 RunDisableEncodingLayersTest(all_layers, disabled_layers, sender.get());
436 RunSetLastLayerAsInactiveTest(sender.get());
Amit Hilbuch2297d332019-02-19 12:49:22 -0800437 }
438
439 // Runs a test for disabling the encoding layers on a sender with a media
440 // channel.
441 void RunDisableSimulcastLayersWithMediaEngineTest(
442 const std::vector<std::string>& all_layers,
443 const std::vector<std::string>& disabled_layers) {
444 uint32_t ssrc = CreateVideoRtpSenderWithSimulcast(all_layers);
445 RunDisableEncodingLayersTest(all_layers, disabled_layers,
446 video_rtp_sender_.get());
447
448 auto channel_parameters = video_media_channel_->GetRtpSendParameters(ssrc);
449 ASSERT_EQ(channel_parameters.encodings.size(), all_layers.size());
450 for (size_t i = 0; i < all_layers.size(); ++i) {
451 EXPECT_EQ(all_layers[i], channel_parameters.encodings[i].rid);
452 bool is_active = !absl::c_linear_search(disabled_layers, all_layers[i]);
453 EXPECT_EQ(is_active, channel_parameters.encodings[i].active);
454 }
455
456 RunSetLastLayerAsInactiveTest(video_rtp_sender_.get());
457 }
458
Ruslan Burakov493a6502019-02-27 15:32:48 +0100459 void VerifyTrackLatencyBehaviour(cricket::Delayable* media_channel,
460 MediaStreamTrackInterface* track,
461 MediaSourceInterface* source,
462 uint32_t ssrc) {
463 absl::optional<int> delay_ms; // In milliseconds.
464 double latency_s = 0.5; // In seconds.
465
466 source->SetLatency(latency_s);
467 delay_ms = media_channel->GetBaseMinimumPlayoutDelayMs(ssrc);
468 EXPECT_DOUBLE_EQ(latency_s, delay_ms.value_or(0) / 1000.0);
469
470 // Disabling the track should take no effect on previously set value.
471 track->set_enabled(false);
472 delay_ms = media_channel->GetBaseMinimumPlayoutDelayMs(ssrc);
473 EXPECT_DOUBLE_EQ(latency_s, delay_ms.value_or(0) / 1000.0);
474
475 // When the track is disabled, we still should be able to set latency.
476 latency_s = 0.3;
477 source->SetLatency(latency_s);
478 delay_ms = media_channel->GetBaseMinimumPlayoutDelayMs(ssrc);
479 EXPECT_DOUBLE_EQ(latency_s, delay_ms.value_or(0) / 1000.0);
480
481 // Enabling the track should take no effect on previously set value.
482 track->set_enabled(true);
483 delay_ms = media_channel->GetBaseMinimumPlayoutDelayMs(ssrc);
484 EXPECT_DOUBLE_EQ(latency_s, delay_ms.value_or(0) / 1000.0);
485
486 // We still should be able to change latency.
487 latency_s = 0.0;
488 source->SetLatency(latency_s);
489 delay_ms = media_channel->GetBaseMinimumPlayoutDelayMs(ssrc);
490 EXPECT_EQ(0, delay_ms.value_or(-1));
491 EXPECT_DOUBLE_EQ(latency_s, delay_ms.value_or(0) / 1000.0);
492 }
493
deadbeef70ab1a12015-09-28 16:53:55 -0700494 protected:
Steve Anton47136dd2018-01-12 10:49:35 -0800495 rtc::Thread* const network_thread_;
496 rtc::Thread* const worker_thread_;
skvlad11a9cbf2016-10-07 11:53:05 -0700497 webrtc::RtcEventLogNullImpl event_log_;
Zhi Huange830e682018-03-30 10:48:35 -0700498 // The |rtp_dtls_transport_| and |rtp_transport_| should be destroyed after
499 // the |channel_manager|.
500 std::unique_ptr<cricket::DtlsTransportInternal> rtp_dtls_transport_;
501 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport_;
deadbeef112b2e92017-02-10 20:13:37 -0800502 // |media_engine_| is actually owned by |channel_manager_|.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700503 cricket::FakeMediaEngine* media_engine_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700504 cricket::ChannelManager channel_manager_;
505 cricket::FakeCall fake_call_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700506 cricket::VoiceChannel* voice_channel_;
507 cricket::VideoChannel* video_channel_;
508 cricket::FakeVoiceMediaChannel* voice_media_channel_;
509 cricket::FakeVideoMediaChannel* video_media_channel_;
deadbeef70ab1a12015-09-28 16:53:55 -0700510 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
511 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
512 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
513 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
deadbeefe814a0d2017-02-25 18:15:09 -0800514 rtc::scoped_refptr<MediaStreamInterface> local_stream_;
deadbeef70ab1a12015-09-28 16:53:55 -0700515 rtc::scoped_refptr<VideoTrackInterface> video_track_;
516 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
deadbeef20cb0c12017-02-01 20:27:00 -0800517 bool audio_sender_destroyed_signal_fired_ = false;
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800518 rtc::UniqueRandomIdGenerator ssrc_generator_;
deadbeef70ab1a12015-09-28 16:53:55 -0700519};
520
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700521// Test that |voice_channel_| is updated when an audio track is associated
deadbeef70ab1a12015-09-28 16:53:55 -0700522// and disassociated with an AudioRtpSender.
523TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
524 CreateAudioRtpSender();
525 DestroyAudioRtpSender();
526}
527
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700528// Test that |video_channel_| is updated when a video track is associated and
deadbeef70ab1a12015-09-28 16:53:55 -0700529// disassociated with a VideoRtpSender.
530TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
531 CreateVideoRtpSender();
532 DestroyVideoRtpSender();
533}
534
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700535// Test that |voice_channel_| is updated when a remote audio track is
deadbeef70ab1a12015-09-28 16:53:55 -0700536// associated and disassociated with an AudioRtpReceiver.
537TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
538 CreateAudioRtpReceiver();
539 DestroyAudioRtpReceiver();
540}
541
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700542// Test that |video_channel_| is updated when a remote video track is
543// associated and disassociated with a VideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700544TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
545 CreateVideoRtpReceiver();
546 DestroyVideoRtpReceiver();
547}
548
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100549TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiverWithStreams) {
550 CreateAudioRtpReceiver({local_stream_});
551 DestroyAudioRtpReceiver();
552}
553
554TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiverWithStreams) {
555 CreateVideoRtpReceiver({local_stream_});
556 DestroyVideoRtpReceiver();
557}
558
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700559// Test that the AudioRtpSender applies options from the local audio source.
560TEST_F(RtpSenderReceiverTest, LocalAudioSourceOptionsApplied) {
561 cricket::AudioOptions options;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100562 options.echo_cancellation = true;
deadbeef757146b2017-02-10 21:26:48 -0800563 auto source = LocalAudioSource::Create(&options);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700564 CreateAudioRtpSender(source.get());
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700565
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100566 EXPECT_EQ(true, voice_media_channel_->options().echo_cancellation);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700567
568 DestroyAudioRtpSender();
569}
570
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700571// Test that the stream is muted when the track is disabled, and unmuted when
572// the track is enabled.
573TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) {
574 CreateAudioRtpSender();
575
576 audio_track_->set_enabled(false);
577 EXPECT_TRUE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
578
579 audio_track_->set_enabled(true);
580 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
581
582 DestroyAudioRtpSender();
583}
584
585// Test that the volume is set to 0 when the track is disabled, and back to
586// 1 when the track is enabled.
deadbeef70ab1a12015-09-28 16:53:55 -0700587TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
588 CreateAudioRtpReceiver();
589
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700590 double volume;
591 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
592 EXPECT_EQ(1, volume);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700593
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700594 audio_track_->set_enabled(false);
595 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
596 EXPECT_EQ(0, volume);
597
deadbeef70ab1a12015-09-28 16:53:55 -0700598 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700599 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
600 EXPECT_EQ(1, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700601
602 DestroyAudioRtpReceiver();
603}
604
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700605// Currently no action is taken when a remote video track is disabled or
606// enabled, so there's nothing to test here, other than what is normally
607// verified in DestroyVideoRtpSender.
deadbeef70ab1a12015-09-28 16:53:55 -0700608TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
609 CreateVideoRtpSender();
610
deadbeef70ab1a12015-09-28 16:53:55 -0700611 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700612 video_track_->set_enabled(true);
613
614 DestroyVideoRtpSender();
615}
616
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700617// Test that the state of the video track created by the VideoRtpReceiver is
618// updated when the receiver is destroyed.
perkjf0dcfe22016-03-10 18:32:00 +0100619TEST_F(RtpSenderReceiverTest, RemoteVideoTrackState) {
620 CreateVideoRtpReceiver();
621
622 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track_->state());
623 EXPECT_EQ(webrtc::MediaSourceInterface::kLive,
624 video_track_->GetSource()->state());
625
626 DestroyVideoRtpReceiver();
627
628 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track_->state());
629 EXPECT_EQ(webrtc::MediaSourceInterface::kEnded,
630 video_track_->GetSource()->state());
631}
632
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700633// Currently no action is taken when a remote video track is disabled or
634// enabled, so there's nothing to test here, other than what is normally
635// verified in DestroyVideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700636TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
637 CreateVideoRtpReceiver();
638
639 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700640 video_track_->set_enabled(true);
641
642 DestroyVideoRtpReceiver();
643}
644
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700645// Test that the AudioRtpReceiver applies volume changes from the track source
646// to the media channel.
deadbeef70ab1a12015-09-28 16:53:55 -0700647TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
648 CreateAudioRtpReceiver();
649
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700650 double volume;
651 audio_track_->GetSource()->SetVolume(0.5);
652 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
653 EXPECT_EQ(0.5, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700654
655 // Disable the audio track, this should prevent setting the volume.
deadbeef70ab1a12015-09-28 16:53:55 -0700656 audio_track_->set_enabled(false);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700657 audio_track_->GetSource()->SetVolume(0.8);
658 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
659 EXPECT_EQ(0, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700660
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700661 // When the track is enabled, the previously set volume should take effect.
deadbeef70ab1a12015-09-28 16:53:55 -0700662 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700663 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
664 EXPECT_EQ(0.8, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700665
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700666 // Try changing volume one more time.
667 audio_track_->GetSource()->SetVolume(0.9);
668 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
669 EXPECT_EQ(0.9, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700670
671 DestroyAudioRtpReceiver();
672}
673
Ruslan Burakov493a6502019-02-27 15:32:48 +0100674TEST_F(RtpSenderReceiverTest, RemoteAudioSourceLatency) {
Ruslan Burakov7ea46052019-02-16 02:07:05 +0100675 absl::optional<int> delay_ms; // In milliseconds.
Ruslan Burakov7ea46052019-02-16 02:07:05 +0100676 rtc::scoped_refptr<RemoteAudioSource> source =
677 new rtc::RefCountedObject<RemoteAudioSource>(rtc::Thread::Current());
678
679 // Set it to value different from default zero.
Ruslan Burakov493a6502019-02-27 15:32:48 +0100680 voice_media_channel_->SetBaseMinimumPlayoutDelayMs(kAudioSsrc, 300);
Ruslan Burakov7ea46052019-02-16 02:07:05 +0100681
682 // Check that calling GetLatency on the source that hasn't been started yet
Ruslan Burakov493a6502019-02-27 15:32:48 +0100683 // won't trigger caching and return default value.
Ruslan Burakov7ea46052019-02-16 02:07:05 +0100684 EXPECT_DOUBLE_EQ(source->GetLatency(), 0);
Ruslan Burakov493a6502019-02-27 15:32:48 +0100685
686 // Check that cached latency will be applied on start.
687 source->SetLatency(0.4);
688 EXPECT_DOUBLE_EQ(source->GetLatency(), 0.4);
Ruslan Burakov7ea46052019-02-16 02:07:05 +0100689 source->Start(voice_media_channel_, kAudioSsrc);
Ruslan Burakov493a6502019-02-27 15:32:48 +0100690 delay_ms = voice_media_channel_->GetBaseMinimumPlayoutDelayMs(kAudioSsrc);
691 EXPECT_EQ(400, delay_ms);
Ruslan Burakov7ea46052019-02-16 02:07:05 +0100692}
693
Ruslan Burakov493a6502019-02-27 15:32:48 +0100694TEST_F(RtpSenderReceiverTest, RemoteAudioTrackLatency) {
Ruslan Burakov7ea46052019-02-16 02:07:05 +0100695 CreateAudioRtpReceiver();
Ruslan Burakov493a6502019-02-27 15:32:48 +0100696 VerifyTrackLatencyBehaviour(voice_media_channel_, audio_track_.get(),
697 audio_track_->GetSource(), kAudioSsrc);
698}
Ruslan Burakov7ea46052019-02-16 02:07:05 +0100699
Ruslan Burakov493a6502019-02-27 15:32:48 +0100700TEST_F(RtpSenderReceiverTest, RemoteVideoTrackLatency) {
701 CreateVideoRtpReceiver();
702 VerifyTrackLatencyBehaviour(video_media_channel_, video_track_.get(),
703 video_track_->GetSource(), kVideoSsrc);
Ruslan Burakov7ea46052019-02-16 02:07:05 +0100704}
705
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700706// Test that the media channel isn't enabled for sending if the audio sender
707// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800708TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800709 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800710 rtc::scoped_refptr<AudioTrackInterface> track =
711 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700712
713 // Track but no SSRC.
714 EXPECT_TRUE(audio_rtp_sender_->SetTrack(track));
715 VerifyVoiceChannelNoInput();
716
717 // SSRC but no track.
718 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
719 audio_rtp_sender_->SetSsrc(kAudioSsrc);
720 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800721}
722
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700723// Test that the media channel isn't enabled for sending if the video sender
724// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800725TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800726 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700727
728 // Track but no SSRC.
729 EXPECT_TRUE(video_rtp_sender_->SetTrack(video_track_));
730 VerifyVideoChannelNoInput();
731
732 // SSRC but no track.
733 EXPECT_TRUE(video_rtp_sender_->SetTrack(nullptr));
734 video_rtp_sender_->SetSsrc(kVideoSsrc);
735 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800736}
737
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700738// Test that the media channel is enabled for sending when the audio sender
739// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800740TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800741 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800742 rtc::scoped_refptr<AudioTrackInterface> track =
743 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700744 audio_rtp_sender_->SetSsrc(kAudioSsrc);
745 audio_rtp_sender_->SetTrack(track);
746 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800747
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700748 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800749}
750
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700751// Test that the media channel is enabled for sending when the audio sender
752// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800753TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800754 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800755 rtc::scoped_refptr<AudioTrackInterface> track =
756 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700757 audio_rtp_sender_->SetTrack(track);
758 audio_rtp_sender_->SetSsrc(kAudioSsrc);
759 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800760
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700761 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800762}
763
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700764// Test that the media channel is enabled for sending when the video sender
765// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800766TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
nisseaf510af2016-03-21 08:20:42 -0700767 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800768 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700769 video_rtp_sender_->SetSsrc(kVideoSsrc);
770 video_rtp_sender_->SetTrack(video_track_);
771 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800772
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700773 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800774}
775
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700776// Test that the media channel is enabled for sending when the video sender
777// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800778TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
nisseaf510af2016-03-21 08:20:42 -0700779 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800780 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700781 video_rtp_sender_->SetTrack(video_track_);
782 video_rtp_sender_->SetSsrc(kVideoSsrc);
783 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800784
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700785 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800786}
787
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700788// Test that the media channel stops sending when the audio sender's SSRC is set
789// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800790TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700791 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800792
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700793 audio_rtp_sender_->SetSsrc(0);
794 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800795}
796
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700797// Test that the media channel stops sending when the video sender's SSRC is set
798// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800799TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700800 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800801
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700802 audio_rtp_sender_->SetSsrc(0);
803 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800804}
805
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700806// Test that the media channel stops sending when the audio sender's track is
807// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800808TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700809 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800810
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700811 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
812 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800813}
814
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700815// Test that the media channel stops sending when the video sender's track is
816// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800817TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700818 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800819
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700820 video_rtp_sender_->SetSsrc(0);
821 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800822}
823
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700824// Test that when the audio sender's SSRC is changed, the media channel stops
825// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800826TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700827 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800828
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700829 audio_rtp_sender_->SetSsrc(kAudioSsrc2);
830 VerifyVoiceChannelNoInput(kAudioSsrc);
831 VerifyVoiceChannelInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800832
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700833 audio_rtp_sender_ = nullptr;
834 VerifyVoiceChannelNoInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800835}
836
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700837// Test that when the audio sender's SSRC is changed, the media channel stops
838// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800839TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700840 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800841
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700842 video_rtp_sender_->SetSsrc(kVideoSsrc2);
843 VerifyVideoChannelNoInput(kVideoSsrc);
844 VerifyVideoChannelInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800845
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700846 video_rtp_sender_ = nullptr;
847 VerifyVideoChannelNoInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800848}
849
skvladdc1c62c2016-03-16 19:07:43 -0700850TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) {
851 CreateAudioRtpSender();
852
skvladdc1c62c2016-03-16 19:07:43 -0700853 RtpParameters params = audio_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700854 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -0800855 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -0700856
857 DestroyAudioRtpSender();
858}
859
Florent Castelli892acf02018-10-01 22:47:20 +0200860TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParametersBeforeNegotiation) {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800861 audio_rtp_sender_ =
862 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +0200863
864 RtpParameters params = audio_rtp_sender_->GetParameters();
865 ASSERT_EQ(1u, params.encodings.size());
866 params.encodings[0].max_bitrate_bps = 90000;
867 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
868
869 params = audio_rtp_sender_->GetParameters();
870 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
871 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
872
873 DestroyAudioRtpSender();
874}
875
876TEST_F(RtpSenderReceiverTest, AudioSenderInitParametersMovedAfterNegotiation) {
877 audio_track_ = AudioTrack::Create(kAudioTrackId, nullptr);
878 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
879
880 audio_rtp_sender_ =
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800881 AudioRtpSender::Create(worker_thread_, audio_track_->id(), nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +0200882 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_));
883 audio_rtp_sender_->set_stream_ids({local_stream_->id()});
884
885 std::vector<RtpEncodingParameters> init_encodings(1);
886 init_encodings[0].max_bitrate_bps = 60000;
887 audio_rtp_sender_->set_init_send_encodings(init_encodings);
888
889 RtpParameters params = audio_rtp_sender_->GetParameters();
890 ASSERT_EQ(1u, params.encodings.size());
891 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
892
893 // Simulate the setLocalDescription call
894 std::vector<uint32_t> ssrcs(1, 1);
895 cricket::StreamParams stream_params =
896 cricket::CreateSimStreamParams("cname", ssrcs);
897 voice_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800898 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +0200899 audio_rtp_sender_->SetSsrc(1);
900
901 params = audio_rtp_sender_->GetParameters();
902 ASSERT_EQ(1u, params.encodings.size());
903 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
904
905 DestroyAudioRtpSender();
906}
907
908TEST_F(RtpSenderReceiverTest,
909 AudioSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800910 audio_rtp_sender_ =
911 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +0200912
913 RtpParameters params;
914 RTCError result = audio_rtp_sender_->SetParameters(params);
915 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
916 DestroyAudioRtpSender();
917}
918
Florent Castellicebf50f2018-05-03 15:31:53 +0200919TEST_F(RtpSenderReceiverTest,
920 AudioSenderMustCallGetParametersBeforeSetParameters) {
921 CreateAudioRtpSender();
922
923 RtpParameters params;
924 RTCError result = audio_rtp_sender_->SetParameters(params);
925 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
926
927 DestroyAudioRtpSender();
928}
929
930TEST_F(RtpSenderReceiverTest,
931 AudioSenderSetParametersInvalidatesTransactionId) {
932 CreateAudioRtpSender();
933
934 RtpParameters params = audio_rtp_sender_->GetParameters();
935 EXPECT_EQ(1u, params.encodings.size());
936 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
937 RTCError result = audio_rtp_sender_->SetParameters(params);
938 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
939
940 DestroyAudioRtpSender();
941}
942
943TEST_F(RtpSenderReceiverTest, AudioSenderDetectTransactionIdModification) {
944 CreateAudioRtpSender();
945
946 RtpParameters params = audio_rtp_sender_->GetParameters();
947 params.transaction_id = "";
948 RTCError result = audio_rtp_sender_->SetParameters(params);
949 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
950
951 DestroyAudioRtpSender();
952}
953
954TEST_F(RtpSenderReceiverTest, AudioSenderCheckTransactionIdRefresh) {
955 CreateAudioRtpSender();
956
957 RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200958 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 15:31:53 +0200959 auto saved_transaction_id = params.transaction_id;
960 params = audio_rtp_sender_->GetParameters();
961 EXPECT_NE(saved_transaction_id, params.transaction_id);
962
963 DestroyAudioRtpSender();
964}
965
966TEST_F(RtpSenderReceiverTest, AudioSenderSetParametersOldValueFail) {
967 CreateAudioRtpSender();
968
969 RtpParameters params = audio_rtp_sender_->GetParameters();
970 RtpParameters second_params = audio_rtp_sender_->GetParameters();
971
972 RTCError result = audio_rtp_sender_->SetParameters(params);
973 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
Seth Hampson2d2c8882018-05-16 16:02:32 -0700974 DestroyAudioRtpSender();
975}
976
977TEST_F(RtpSenderReceiverTest, AudioSenderCantSetUnimplementedRtpParameters) {
978 CreateAudioRtpSender();
979 RtpParameters params = audio_rtp_sender_->GetParameters();
980 EXPECT_EQ(1u, params.encodings.size());
981
Florent Castelli87b3c512018-07-18 16:00:28 +0200982 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 16:02:32 -0700983 params.mid = "dummy_mid";
984 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
985 audio_rtp_sender_->SetParameters(params).type());
986 params = audio_rtp_sender_->GetParameters();
987
Seth Hampson2d2c8882018-05-16 16:02:32 -0700988 DestroyAudioRtpSender();
989}
990
991TEST_F(RtpSenderReceiverTest,
992 AudioSenderCantSetUnimplementedRtpEncodingParameters) {
993 CreateAudioRtpSender();
994 RtpParameters params = audio_rtp_sender_->GetParameters();
995 EXPECT_EQ(1u, params.encodings.size());
996
Henrik Grunelle1301a82018-12-13 12:13:22 +0000997 // Unimplemented RtpParameters: codec_payload_type, fec, rtx, dtx, ptime,
Amit Hilbuchaa584152019-02-06 17:09:52 -0800998 // scale_framerate_down_by, dependency_rids.
Henrik Grunelle1301a82018-12-13 12:13:22 +0000999 params.encodings[0].codec_payload_type = 1;
1000 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1001 audio_rtp_sender_->SetParameters(params).type());
1002 params = audio_rtp_sender_->GetParameters();
1003
Seth Hampson2d2c8882018-05-16 16:02:32 -07001004 params.encodings[0].fec = RtpFecParameters();
1005 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1006 audio_rtp_sender_->SetParameters(params).type());
1007 params = audio_rtp_sender_->GetParameters();
1008
1009 params.encodings[0].rtx = RtpRtxParameters();
1010 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1011 audio_rtp_sender_->SetParameters(params).type());
1012 params = audio_rtp_sender_->GetParameters();
1013
1014 params.encodings[0].dtx = DtxStatus::ENABLED;
1015 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1016 audio_rtp_sender_->SetParameters(params).type());
1017 params = audio_rtp_sender_->GetParameters();
1018
1019 params.encodings[0].ptime = 1;
1020 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1021 audio_rtp_sender_->SetParameters(params).type());
1022 params = audio_rtp_sender_->GetParameters();
1023
Seth Hampson2d2c8882018-05-16 16:02:32 -07001024 params.encodings[0].dependency_rids.push_back("dummy_rid");
1025 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1026 audio_rtp_sender_->SetParameters(params).type());
Florent Castellicebf50f2018-05-03 15:31:53 +02001027
1028 DestroyAudioRtpSender();
1029}
1030
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001031TEST_F(RtpSenderReceiverTest, SetAudioMaxSendBitrate) {
1032 CreateAudioRtpSender();
1033
1034 EXPECT_EQ(-1, voice_media_channel_->max_bps());
1035 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001036 EXPECT_EQ(1U, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -08001037 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001038 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -08001039 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001040
1041 // Read back the parameters and verify they have been changed.
1042 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001043 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001044 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001045
1046 // Verify that the audio channel received the new parameters.
1047 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001048 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001049 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001050
1051 // Verify that the global bitrate limit has not been changed.
1052 EXPECT_EQ(-1, voice_media_channel_->max_bps());
1053
1054 DestroyAudioRtpSender();
1055}
1056
Seth Hampson24722b32017-12-22 09:36:42 -08001057TEST_F(RtpSenderReceiverTest, SetAudioBitratePriority) {
1058 CreateAudioRtpSender();
1059
1060 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001061 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001062 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1063 params.encodings[0].bitrate_priority);
1064 double new_bitrate_priority = 2.0;
1065 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -08001066 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -08001067
1068 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001069 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001070 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1071
1072 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001073 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001074 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1075
1076 DestroyAudioRtpSender();
1077}
1078
skvladdc1c62c2016-03-16 19:07:43 -07001079TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) {
1080 CreateVideoRtpSender();
1081
skvladdc1c62c2016-03-16 19:07:43 -07001082 RtpParameters params = video_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001083 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -08001084 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -07001085
1086 DestroyVideoRtpSender();
1087}
1088
Florent Castelli892acf02018-10-01 22:47:20 +02001089TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParametersBeforeNegotiation) {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -08001090 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, /*id=*/"");
Florent Castelli892acf02018-10-01 22:47:20 +02001091
1092 RtpParameters params = video_rtp_sender_->GetParameters();
1093 ASSERT_EQ(1u, params.encodings.size());
1094 params.encodings[0].max_bitrate_bps = 90000;
1095 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1096
1097 params = video_rtp_sender_->GetParameters();
1098 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1099 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
1100
1101 DestroyVideoRtpSender();
1102}
1103
1104TEST_F(RtpSenderReceiverTest, VideoSenderInitParametersMovedAfterNegotiation) {
1105 AddVideoTrack(false);
1106
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -08001107 video_rtp_sender_ =
1108 VideoRtpSender::Create(worker_thread_, video_track_->id());
Florent Castelli892acf02018-10-01 22:47:20 +02001109 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
1110 video_rtp_sender_->set_stream_ids({local_stream_->id()});
1111
1112 std::vector<RtpEncodingParameters> init_encodings(2);
1113 init_encodings[0].max_bitrate_bps = 60000;
1114 init_encodings[1].max_bitrate_bps = 900000;
1115 video_rtp_sender_->set_init_send_encodings(init_encodings);
1116
1117 RtpParameters params = video_rtp_sender_->GetParameters();
1118 ASSERT_EQ(2u, params.encodings.size());
1119 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1120 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
1121
1122 // Simulate the setLocalDescription call
1123 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +01001124 ssrcs.reserve(2);
Florent Castelli892acf02018-10-01 22:47:20 +02001125 for (int i = 0; i < 2; ++i)
1126 ssrcs.push_back(kVideoSsrcSimulcast + i);
1127 cricket::StreamParams stream_params =
1128 cricket::CreateSimStreamParams("cname", ssrcs);
1129 video_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -08001130 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +02001131 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
1132
1133 params = video_rtp_sender_->GetParameters();
1134 ASSERT_EQ(2u, params.encodings.size());
1135 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1136 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
1137
1138 DestroyVideoRtpSender();
1139}
1140
1141TEST_F(RtpSenderReceiverTest,
1142 VideoSenderInitParametersMovedAfterManualSimulcastAndNegotiation) {
1143 AddVideoTrack(false);
1144
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -08001145 video_rtp_sender_ =
1146 VideoRtpSender::Create(worker_thread_, video_track_->id());
Florent Castelli892acf02018-10-01 22:47:20 +02001147 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
1148 video_rtp_sender_->set_stream_ids({local_stream_->id()});
1149
1150 std::vector<RtpEncodingParameters> init_encodings(1);
1151 init_encodings[0].max_bitrate_bps = 60000;
1152 video_rtp_sender_->set_init_send_encodings(init_encodings);
1153
1154 RtpParameters params = video_rtp_sender_->GetParameters();
1155 ASSERT_EQ(1u, params.encodings.size());
1156 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1157
1158 // Simulate the setLocalDescription call as if the user used SDP munging
1159 // to enable simulcast
1160 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +01001161 ssrcs.reserve(2);
Florent Castelli892acf02018-10-01 22:47:20 +02001162 for (int i = 0; i < 2; ++i)
1163 ssrcs.push_back(kVideoSsrcSimulcast + i);
1164 cricket::StreamParams stream_params =
1165 cricket::CreateSimStreamParams("cname", ssrcs);
1166 video_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -08001167 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +02001168 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
1169
1170 params = video_rtp_sender_->GetParameters();
1171 ASSERT_EQ(2u, params.encodings.size());
1172 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1173
1174 DestroyVideoRtpSender();
1175}
1176
1177TEST_F(RtpSenderReceiverTest,
1178 VideoSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -08001179 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, /*id=*/"");
Florent Castelli892acf02018-10-01 22:47:20 +02001180
1181 RtpParameters params;
1182 RTCError result = video_rtp_sender_->SetParameters(params);
1183 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1184 DestroyVideoRtpSender();
1185}
1186
Florent Castellicebf50f2018-05-03 15:31:53 +02001187TEST_F(RtpSenderReceiverTest,
1188 VideoSenderMustCallGetParametersBeforeSetParameters) {
1189 CreateVideoRtpSender();
1190
1191 RtpParameters params;
1192 RTCError result = video_rtp_sender_->SetParameters(params);
1193 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1194
1195 DestroyVideoRtpSender();
1196}
1197
1198TEST_F(RtpSenderReceiverTest,
1199 VideoSenderSetParametersInvalidatesTransactionId) {
1200 CreateVideoRtpSender();
1201
1202 RtpParameters params = video_rtp_sender_->GetParameters();
1203 EXPECT_EQ(1u, params.encodings.size());
1204 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1205 RTCError result = video_rtp_sender_->SetParameters(params);
1206 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1207
1208 DestroyVideoRtpSender();
1209}
1210
1211TEST_F(RtpSenderReceiverTest, VideoSenderDetectTransactionIdModification) {
1212 CreateVideoRtpSender();
1213
1214 RtpParameters params = video_rtp_sender_->GetParameters();
1215 params.transaction_id = "";
1216 RTCError result = video_rtp_sender_->SetParameters(params);
1217 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1218
1219 DestroyVideoRtpSender();
1220}
1221
1222TEST_F(RtpSenderReceiverTest, VideoSenderCheckTransactionIdRefresh) {
1223 CreateVideoRtpSender();
1224
1225 RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001226 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 15:31:53 +02001227 auto saved_transaction_id = params.transaction_id;
1228 params = video_rtp_sender_->GetParameters();
1229 EXPECT_NE(saved_transaction_id, params.transaction_id);
1230
1231 DestroyVideoRtpSender();
1232}
1233
1234TEST_F(RtpSenderReceiverTest, VideoSenderSetParametersOldValueFail) {
1235 CreateVideoRtpSender();
1236
1237 RtpParameters params = video_rtp_sender_->GetParameters();
1238 RtpParameters second_params = video_rtp_sender_->GetParameters();
1239
1240 RTCError result = video_rtp_sender_->SetParameters(params);
1241 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1242
1243 DestroyVideoRtpSender();
1244}
1245
Seth Hampson2d2c8882018-05-16 16:02:32 -07001246TEST_F(RtpSenderReceiverTest, VideoSenderCantSetUnimplementedRtpParameters) {
1247 CreateVideoRtpSender();
1248 RtpParameters params = video_rtp_sender_->GetParameters();
1249 EXPECT_EQ(1u, params.encodings.size());
1250
Florent Castelli87b3c512018-07-18 16:00:28 +02001251 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 16:02:32 -07001252 params.mid = "dummy_mid";
1253 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1254 video_rtp_sender_->SetParameters(params).type());
1255 params = video_rtp_sender_->GetParameters();
1256
Seth Hampson2d2c8882018-05-16 16:02:32 -07001257 DestroyVideoRtpSender();
1258}
1259
1260TEST_F(RtpSenderReceiverTest,
1261 VideoSenderCantSetUnimplementedEncodingParameters) {
1262 CreateVideoRtpSender();
1263 RtpParameters params = video_rtp_sender_->GetParameters();
1264 EXPECT_EQ(1u, params.encodings.size());
1265
Henrik Grunelle1301a82018-12-13 12:13:22 +00001266 // Unimplemented RtpParameters: codec_payload_type, fec, rtx, dtx, ptime,
Amit Hilbuchaa584152019-02-06 17:09:52 -08001267 // scale_framerate_down_by, dependency_rids.
Henrik Grunelle1301a82018-12-13 12:13:22 +00001268 params.encodings[0].codec_payload_type = 1;
1269 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1270 video_rtp_sender_->SetParameters(params).type());
1271 params = video_rtp_sender_->GetParameters();
1272
Seth Hampson2d2c8882018-05-16 16:02:32 -07001273 params.encodings[0].fec = RtpFecParameters();
1274 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1275 video_rtp_sender_->SetParameters(params).type());
1276 params = video_rtp_sender_->GetParameters();
1277
1278 params.encodings[0].rtx = RtpRtxParameters();
1279 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1280 video_rtp_sender_->SetParameters(params).type());
1281 params = video_rtp_sender_->GetParameters();
1282
1283 params.encodings[0].dtx = DtxStatus::ENABLED;
1284 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1285 video_rtp_sender_->SetParameters(params).type());
1286 params = video_rtp_sender_->GetParameters();
1287
1288 params.encodings[0].ptime = 1;
1289 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1290 video_rtp_sender_->SetParameters(params).type());
1291 params = video_rtp_sender_->GetParameters();
1292
Seth Hampson2d2c8882018-05-16 16:02:32 -07001293 params.encodings[0].dependency_rids.push_back("dummy_rid");
1294 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1295 video_rtp_sender_->SetParameters(params).type());
1296
1297 DestroyVideoRtpSender();
1298}
1299
Florent Castellic1a0bcb2019-01-29 14:26:48 +01001300TEST_F(RtpSenderReceiverTest, VideoSenderCanSetScaleResolutionDownBy) {
1301 CreateVideoRtpSender();
1302
1303 RtpParameters params = video_rtp_sender_->GetParameters();
1304 params.encodings[0].scale_resolution_down_by = 2;
1305
1306 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1307 params = video_rtp_sender_->GetParameters();
1308 EXPECT_EQ(2, params.encodings[0].scale_resolution_down_by);
1309
1310 DestroyVideoRtpSender();
1311}
1312
1313TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidScaleResolutionDownBy) {
1314 CreateVideoRtpSender();
1315
1316 RtpParameters params = video_rtp_sender_->GetParameters();
1317 params.encodings[0].scale_resolution_down_by = 0.5;
1318 RTCError result = video_rtp_sender_->SetParameters(params);
1319 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1320
1321 DestroyVideoRtpSender();
1322}
1323
Florent Castelli892acf02018-10-01 22:47:20 +02001324TEST_F(RtpSenderReceiverTest,
1325 VideoSenderCantSetUnimplementedEncodingParametersWithSimulcast) {
1326 CreateVideoRtpSenderWithSimulcast();
1327 RtpParameters params = video_rtp_sender_->GetParameters();
1328 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
1329
Henrik Grunelle1301a82018-12-13 12:13:22 +00001330 // Unimplemented RtpParameters: codec_payload_type, fec, rtx, dtx, ptime,
Amit Hilbuchaa584152019-02-06 17:09:52 -08001331 // scale_framerate_down_by, dependency_rids.
Florent Castelli892acf02018-10-01 22:47:20 +02001332 for (size_t i = 0; i < params.encodings.size(); i++) {
Henrik Grunelle1301a82018-12-13 12:13:22 +00001333 params.encodings[i].codec_payload_type = 1;
1334 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1335 video_rtp_sender_->SetParameters(params).type());
1336 params = video_rtp_sender_->GetParameters();
1337
Florent Castelli892acf02018-10-01 22:47:20 +02001338 params.encodings[i].fec = RtpFecParameters();
1339 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1340 video_rtp_sender_->SetParameters(params).type());
1341 params = video_rtp_sender_->GetParameters();
1342
1343 params.encodings[i].rtx = RtpRtxParameters();
1344 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1345 video_rtp_sender_->SetParameters(params).type());
1346 params = video_rtp_sender_->GetParameters();
1347
1348 params.encodings[i].dtx = DtxStatus::ENABLED;
1349 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1350 video_rtp_sender_->SetParameters(params).type());
1351 params = video_rtp_sender_->GetParameters();
1352
1353 params.encodings[i].ptime = 1;
1354 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1355 video_rtp_sender_->SetParameters(params).type());
1356 params = video_rtp_sender_->GetParameters();
1357
Florent Castelli892acf02018-10-01 22:47:20 +02001358 params.encodings[i].dependency_rids.push_back("dummy_rid");
1359 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1360 video_rtp_sender_->SetParameters(params).type());
Amit Hilbuch619b2942019-02-26 15:55:19 -08001361 params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001362 }
1363
1364 DestroyVideoRtpSender();
1365}
1366
Seth Hampson2d2c8882018-05-16 16:02:32 -07001367// A video sender can have multiple simulcast layers, in which case it will
1368// contain multiple RtpEncodingParameters. This tests that if this is the case
1369// (simulcast), then we can't set the bitrate_priority, or max_bitrate_bps
1370// for any encodings besides at index 0, because these are both implemented
1371// "per-sender."
1372TEST_F(RtpSenderReceiverTest, VideoSenderCantSetPerSenderEncodingParameters) {
1373 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001374 CreateVideoRtpSenderWithSimulcast();
Seth Hampson2d2c8882018-05-16 16:02:32 -07001375 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001376 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Seth Hampson2d2c8882018-05-16 16:02:32 -07001377
1378 params.encodings[1].bitrate_priority = 2.0;
1379 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1380 video_rtp_sender_->SetParameters(params).type());
1381 params = video_rtp_sender_->GetParameters();
1382
Seth Hampson2d2c8882018-05-16 16:02:32 -07001383 DestroyVideoRtpSender();
1384}
1385
Florent Castelli892acf02018-10-01 22:47:20 +02001386TEST_F(RtpSenderReceiverTest, VideoSenderCantSetReadOnlyEncodingParameters) {
1387 // Add a simulcast specific send stream that contains 2 encoding parameters.
1388 CreateVideoRtpSenderWithSimulcast();
1389 RtpParameters params = video_rtp_sender_->GetParameters();
1390 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
1391
1392 for (size_t i = 0; i < params.encodings.size(); i++) {
1393 params.encodings[i].ssrc = 1337;
1394 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION,
1395 video_rtp_sender_->SetParameters(params).type());
1396 params = video_rtp_sender_->GetParameters();
1397 }
1398
1399 DestroyVideoRtpSender();
1400}
1401
Ă…sa Persson55659812018-06-18 17:51:32 +02001402TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrate) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001403 CreateVideoRtpSender();
1404
1405 EXPECT_EQ(-1, video_media_channel_->max_bps());
1406 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001407 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001408 EXPECT_FALSE(params.encodings[0].min_bitrate_bps);
deadbeefe702b302017-02-04 12:09:01 -08001409 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Ă…sa Persson55659812018-06-18 17:51:32 +02001410 params.encodings[0].min_bitrate_bps = 100;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001411 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -08001412 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001413
1414 // Read back the parameters and verify they have been changed.
1415 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001416 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001417 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001418 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001419
1420 // Verify that the video channel received the new parameters.
1421 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001422 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001423 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001424 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001425
1426 // Verify that the global bitrate limit has not been changed.
1427 EXPECT_EQ(-1, video_media_channel_->max_bps());
1428
1429 DestroyVideoRtpSender();
1430}
1431
Ă…sa Persson55659812018-06-18 17:51:32 +02001432TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrateSimulcast) {
1433 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001434 CreateVideoRtpSenderWithSimulcast();
Ă…sa Persson55659812018-06-18 17:51:32 +02001435
1436 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001437 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001438 params.encodings[0].min_bitrate_bps = 100;
1439 params.encodings[0].max_bitrate_bps = 1000;
1440 params.encodings[1].min_bitrate_bps = 200;
1441 params.encodings[1].max_bitrate_bps = 2000;
1442 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1443
1444 // Verify that the video channel received the new parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001445 params = video_media_channel_->GetRtpSendParameters(kVideoSsrcSimulcast);
1446 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001447 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
1448 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
1449 EXPECT_EQ(200, params.encodings[1].min_bitrate_bps);
1450 EXPECT_EQ(2000, params.encodings[1].max_bitrate_bps);
1451
1452 DestroyVideoRtpSender();
1453}
1454
Seth Hampson24722b32017-12-22 09:36:42 -08001455TEST_F(RtpSenderReceiverTest, SetVideoBitratePriority) {
1456 CreateVideoRtpSender();
1457
1458 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001459 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001460 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1461 params.encodings[0].bitrate_priority);
1462 double new_bitrate_priority = 2.0;
1463 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -08001464 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -08001465
1466 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001467 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001468 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1469
1470 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001471 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001472 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1473
1474 DestroyVideoRtpSender();
1475}
1476
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001477TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetParameters) {
1478 CreateAudioRtpReceiver();
1479
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001480 RtpParameters params = audio_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001481 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001482 EXPECT_TRUE(audio_rtp_receiver_->SetParameters(params));
1483
1484 DestroyAudioRtpReceiver();
1485}
1486
1487TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetParameters) {
1488 CreateVideoRtpReceiver();
1489
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001490 RtpParameters params = video_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001491 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001492 EXPECT_TRUE(video_rtp_receiver_->SetParameters(params));
1493
1494 DestroyVideoRtpReceiver();
1495}
1496
Florent Castelli38332cd2018-11-20 14:08:06 +01001497TEST_F(RtpSenderReceiverTest, VideoReceiverCanGetParametersWithSimulcast) {
1498 CreateVideoRtpReceiverWithSimulcast({}, 2);
1499
1500 RtpParameters params = video_rtp_receiver_->GetParameters();
1501 EXPECT_EQ(2u, params.encodings.size());
1502
1503 DestroyVideoRtpReceiver();
1504}
1505
pbos5214a0a2016-12-16 15:39:11 -08001506// Test that makes sure that a video track content hint translates to the proper
1507// value for sources that are not screencast.
1508TEST_F(RtpSenderReceiverTest, PropagatesVideoTrackContentHint) {
1509 CreateVideoRtpSender();
1510
1511 video_track_->set_enabled(true);
1512
1513 // |video_track_| is not screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001514 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001515 // No content hint should be set by default.
1516 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1517 video_track_->content_hint());
1518 // Setting detailed should turn a non-screencast source into screencast mode.
1519 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001520 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001521 // Removing the content hint should turn the track back into non-screencast
1522 // mode.
1523 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001524 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001525 // Setting fluid should remain in non-screencast mode (its default).
1526 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001527 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 08:53:10 +02001528 // Setting text should have the same effect as Detailed
1529 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
1530 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001531
1532 DestroyVideoRtpSender();
1533}
1534
1535// Test that makes sure that a video track content hint translates to the proper
1536// value for screencast sources.
1537TEST_F(RtpSenderReceiverTest,
1538 PropagatesVideoTrackContentHintForScreencastSource) {
1539 CreateVideoRtpSender(true);
1540
1541 video_track_->set_enabled(true);
1542
1543 // |video_track_| with a screencast source should be screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001544 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001545 // No content hint should be set by default.
1546 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1547 video_track_->content_hint());
1548 // Setting fluid should turn a screencast source into non-screencast mode.
1549 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001550 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001551 // Removing the content hint should turn the track back into screencast mode.
1552 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001553 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001554 // Setting detailed should still remain in screencast mode (its default).
1555 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001556 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 08:53:10 +02001557 // Setting text should have the same effect as Detailed
1558 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
1559 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001560
1561 DestroyVideoRtpSender();
1562}
1563
1564// Test that makes sure any content hints that are set on a track before
1565// VideoRtpSender is ready to send are still applied when it gets ready to send.
1566TEST_F(RtpSenderReceiverTest,
1567 PropagatesVideoTrackContentHintSetBeforeEnabling) {
1568 AddVideoTrack();
1569 // Setting detailed overrides the default non-screencast mode. This should be
1570 // applied even if the track is set on construction.
1571 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -08001572 video_rtp_sender_ =
1573 VideoRtpSender::Create(worker_thread_, video_track_->id());
Steve Anton111fdfd2018-06-25 13:03:36 -07001574 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
1575 video_rtp_sender_->set_stream_ids({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -08001576 video_rtp_sender_->SetMediaChannel(video_media_channel_);
pbos5214a0a2016-12-16 15:39:11 -08001577 video_track_->set_enabled(true);
1578
1579 // Sender is not ready to send (no SSRC) so no option should have been set.
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001580 EXPECT_EQ(absl::nullopt, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001581
1582 // Verify that the content hint is accounted for when video_rtp_sender_ does
1583 // get enabled.
1584 video_rtp_sender_->SetSsrc(kVideoSsrc);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001585 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001586
1587 // And removing the hint should go back to false (to verify that false was
1588 // default correctly).
1589 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001590 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001591
1592 DestroyVideoRtpSender();
1593}
1594
deadbeef20cb0c12017-02-01 20:27:00 -08001595TEST_F(RtpSenderReceiverTest, AudioSenderHasDtmfSender) {
1596 CreateAudioRtpSender();
1597 EXPECT_NE(nullptr, audio_rtp_sender_->GetDtmfSender());
1598}
1599
1600TEST_F(RtpSenderReceiverTest, VideoSenderDoesNotHaveDtmfSender) {
1601 CreateVideoRtpSender();
1602 EXPECT_EQ(nullptr, video_rtp_sender_->GetDtmfSender());
1603}
1604
1605// Test that the DTMF sender is really using |voice_channel_|, and thus returns
1606// true/false from CanSendDtmf based on what |voice_channel_| returns.
1607TEST_F(RtpSenderReceiverTest, CanInsertDtmf) {
1608 AddDtmfCodec();
1609 CreateAudioRtpSender();
1610 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1611 ASSERT_NE(nullptr, dtmf_sender);
1612 EXPECT_TRUE(dtmf_sender->CanInsertDtmf());
1613}
1614
1615TEST_F(RtpSenderReceiverTest, CanNotInsertDtmf) {
1616 CreateAudioRtpSender();
1617 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1618 ASSERT_NE(nullptr, dtmf_sender);
1619 // DTMF codec has not been added, as it was in the above test.
1620 EXPECT_FALSE(dtmf_sender->CanInsertDtmf());
1621}
1622
1623TEST_F(RtpSenderReceiverTest, InsertDtmf) {
1624 AddDtmfCodec();
1625 CreateAudioRtpSender();
1626 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1627 ASSERT_NE(nullptr, dtmf_sender);
1628
1629 EXPECT_EQ(0U, voice_media_channel_->dtmf_info_queue().size());
1630
1631 // Insert DTMF
1632 const int expected_duration = 90;
1633 dtmf_sender->InsertDtmf("012", expected_duration, 100);
1634
1635 // Verify
1636 ASSERT_EQ_WAIT(3U, voice_media_channel_->dtmf_info_queue().size(),
1637 kDefaultTimeout);
1638 const uint32_t send_ssrc =
1639 voice_media_channel_->send_streams()[0].first_ssrc();
1640 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[0],
1641 send_ssrc, 0, expected_duration));
1642 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[1],
1643 send_ssrc, 1, expected_duration));
1644 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[2],
1645 send_ssrc, 2, expected_duration));
1646}
1647
1648// Make sure the signal from "GetOnDestroyedSignal()" fires when the sender is
1649// destroyed, which is needed for the DTMF sender.
1650TEST_F(RtpSenderReceiverTest, TestOnDestroyedSignal) {
1651 CreateAudioRtpSender();
1652 EXPECT_FALSE(audio_sender_destroyed_signal_fired_);
1653 audio_rtp_sender_ = nullptr;
1654 EXPECT_TRUE(audio_sender_destroyed_signal_fired_);
1655}
1656
Benjamin Wright84583f62018-10-04 14:22:34 -07001657// Validate that the default FrameEncryptor setting is nullptr.
1658TEST_F(RtpSenderReceiverTest, AudioSenderCanSetFrameEncryptor) {
1659 CreateAudioRtpSender();
1660 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1661 new FakeFrameEncryptor());
1662 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1663 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1664 EXPECT_EQ(fake_frame_encryptor.get(),
1665 audio_rtp_sender_->GetFrameEncryptor().get());
1666}
1667
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001668// Validate that setting a FrameEncryptor after the send stream is stopped does
1669// nothing.
1670TEST_F(RtpSenderReceiverTest, AudioSenderCannotSetFrameEncryptorAfterStop) {
1671 CreateAudioRtpSender();
1672 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1673 new FakeFrameEncryptor());
1674 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1675 audio_rtp_sender_->Stop();
1676 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1677 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1678}
1679
Benjamin Wright84583f62018-10-04 14:22:34 -07001680// Validate that the default FrameEncryptor setting is nullptr.
1681TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetFrameDecryptor) {
1682 CreateAudioRtpReceiver();
1683 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1684 new FakeFrameDecryptor());
1685 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
1686 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1687 EXPECT_EQ(fake_frame_decryptor.get(),
1688 audio_rtp_receiver_->GetFrameDecryptor().get());
1689}
1690
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001691// Validate that the default FrameEncryptor setting is nullptr.
1692TEST_F(RtpSenderReceiverTest, AudioReceiverCannotSetFrameDecryptorAfterStop) {
1693 CreateAudioRtpReceiver();
1694 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1695 new FakeFrameDecryptor());
1696 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
1697 audio_rtp_receiver_->Stop();
1698 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1699 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1700}
1701
1702// Validate that the default FrameEncryptor setting is nullptr.
1703TEST_F(RtpSenderReceiverTest, VideoSenderCanSetFrameEncryptor) {
1704 CreateVideoRtpSender();
1705 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1706 new FakeFrameEncryptor());
1707 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1708 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1709 EXPECT_EQ(fake_frame_encryptor.get(),
1710 video_rtp_sender_->GetFrameEncryptor().get());
1711}
1712
1713// Validate that setting a FrameEncryptor after the send stream is stopped does
1714// nothing.
1715TEST_F(RtpSenderReceiverTest, VideoSenderCannotSetFrameEncryptorAfterStop) {
1716 CreateVideoRtpSender();
1717 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1718 new FakeFrameEncryptor());
1719 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1720 video_rtp_sender_->Stop();
1721 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1722 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1723}
1724
1725// Validate that the default FrameEncryptor setting is nullptr.
1726TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetFrameDecryptor) {
1727 CreateVideoRtpReceiver();
1728 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1729 new FakeFrameDecryptor());
1730 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
1731 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1732 EXPECT_EQ(fake_frame_decryptor.get(),
1733 video_rtp_receiver_->GetFrameDecryptor().get());
1734}
1735
1736// Validate that the default FrameEncryptor setting is nullptr.
1737TEST_F(RtpSenderReceiverTest, VideoReceiverCannotSetFrameDecryptorAfterStop) {
1738 CreateVideoRtpReceiver();
1739 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1740 new FakeFrameDecryptor());
1741 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
1742 video_rtp_receiver_->Stop();
1743 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1744 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1745}
1746
Amit Hilbuch619b2942019-02-26 15:55:19 -08001747// Checks that calling the internal methods for get/set parameters do not
1748// invalidate any parameters retreived by clients.
1749TEST_F(RtpSenderReceiverTest,
1750 InternalParameterMethodsDoNotInvalidateTransaction) {
1751 CreateVideoRtpSender();
1752 RtpParameters parameters = video_rtp_sender_->GetParameters();
1753 RtpParameters new_parameters = video_rtp_sender_->GetParametersInternal();
1754 new_parameters.encodings[0].active = false;
1755 video_rtp_sender_->SetParametersInternal(new_parameters);
1756 new_parameters.encodings[0].active = true;
1757 video_rtp_sender_->SetParametersInternal(new_parameters);
1758 parameters.encodings[0].active = false;
1759 EXPECT_TRUE(video_rtp_sender_->SetParameters(parameters).ok());
1760}
1761
Amit Hilbuch2297d332019-02-19 12:49:22 -08001762// Helper method for syntactic sugar for accepting a vector with '{}' notation.
1763std::pair<RidList, RidList> CreatePairOfRidVectors(
1764 const std::vector<std::string>& first,
1765 const std::vector<std::string>& second) {
1766 return std::make_pair(first, second);
1767}
1768
1769// These parameters are used to test disabling simulcast layers.
1770const std::pair<RidList, RidList> kDisableSimulcastLayersParameters[] = {
1771 // Tests removing the first layer. This is a special case because
1772 // the first layer's SSRC is also the 'primary' SSRC used to associate the
1773 // parameters to the media channel.
1774 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"1"}),
1775 // Tests removing some layers.
1776 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"2", "4"}),
1777 // Tests simulcast rejected scenario all layers except first are rejected.
1778 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"2", "3", "4"}),
1779 // Tests removing all layers.
1780 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"1", "2", "3", "4"}),
1781};
1782
1783// Runs test for disabling layers on a sender without a media engine set.
1784TEST_P(RtpSenderReceiverTest, DisableSimulcastLayersWithoutMediaEngine) {
1785 auto parameter = GetParam();
1786 RunDisableSimulcastLayersWithoutMediaEngineTest(parameter.first,
1787 parameter.second);
1788}
1789
1790// Runs test for disabling layers on a sender with a media engine set.
1791TEST_P(RtpSenderReceiverTest, DisableSimulcastLayersWithMediaEngine) {
1792 auto parameter = GetParam();
1793 RunDisableSimulcastLayersWithMediaEngineTest(parameter.first,
1794 parameter.second);
1795}
1796
1797INSTANTIATE_TEST_SUITE_P(
1798 DisableSimulcastLayersInSender,
1799 RtpSenderReceiverTest,
1800 ::testing::ValuesIn(kDisableSimulcastLayersParameters));
1801
deadbeef70ab1a12015-09-28 16:53:55 -07001802} // namespace webrtc