blob: 8043dd0d5c263091d21750e8b2bc2f3e3ed7e391 [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>
Jonas Olssona4d87372019-07-05 19:08:33 +020012
Yves Gerey3e707812018-11-28 16:47:49 +010013#include <cstdint>
kwibergd1fe2812016-04-27 06:47:29 -070014#include <memory>
deadbeef70ab1a12015-09-28 16:53:55 -070015#include <string>
Tommif888bb52015-12-12 01:37:01 +010016#include <utility>
Yves Gerey3e707812018-11-28 16:47:49 +010017#include <vector>
deadbeef70ab1a12015-09-28 16:53:55 -070018
Amit Hilbuch2297d332019-02-19 12:49:22 -080019#include "absl/algorithm/container.h"
Yves Gerey3e707812018-11-28 16:47:49 +010020#include "absl/memory/memory.h"
21#include "absl/types/optional.h"
22#include "api/audio_options.h"
Steve Anton10542f22019-01-11 09:11:00 -080023#include "api/crypto/crypto_options.h"
24#include "api/crypto/frame_decryptor_interface.h"
25#include "api/crypto/frame_encryptor_interface.h"
26#include "api/dtmf_sender_interface.h"
27#include "api/media_stream_interface.h"
28#include "api/rtc_error.h"
Danil Chapovalov83bbe912019-08-07 12:24:53 +020029#include "api/rtc_event_log/rtc_event_log.h"
Steve Anton10542f22019-01-11 09:11:00 -080030#include "api/rtp_parameters.h"
Mirko Bonadeid9708072019-01-25 20:26:48 +010031#include "api/scoped_refptr.h"
Benjamin Wright84583f62018-10-04 14:22:34 -070032#include "api/test/fake_frame_decryptor.h"
33#include "api/test/fake_frame_encryptor.h"
Jonas Orelanda3aa9bd2019-04-17 07:38:40 +020034#include "api/video/builtin_video_bitrate_allocator_factory.h"
Yves Gerey3e707812018-11-28 16:47:49 +010035#include "media/base/codec.h"
Steve Anton10542f22019-01-11 09:11:00 -080036#include "media/base/fake_media_engine.h"
37#include "media/base/media_channel.h"
38#include "media/base/media_config.h"
39#include "media/base/media_engine.h"
Steve Anton10542f22019-01-11 09:11:00 -080040#include "media/base/stream_params.h"
41#include "media/base/test_utils.h"
42#include "media/engine/fake_webrtc_call.h"
43#include "p2p/base/dtls_transport_internal.h"
44#include "p2p/base/fake_dtls_transport.h"
45#include "p2p/base/p2p_constants.h"
Ruslan Burakov501bfba2019-02-11 10:29:19 +010046#include "pc/audio_rtp_receiver.h"
Steve Anton10542f22019-01-11 09:11:00 -080047#include "pc/audio_track.h"
Yves Gerey3e707812018-11-28 16:47:49 +010048#include "pc/channel.h"
Steve Anton10542f22019-01-11 09:11:00 -080049#include "pc/channel_manager.h"
50#include "pc/dtls_srtp_transport.h"
51#include "pc/local_audio_source.h"
52#include "pc/media_stream.h"
Ruslan Burakov7ea46052019-02-16 02:07:05 +010053#include "pc/remote_audio_source.h"
Steve Anton10542f22019-01-11 09:11:00 -080054#include "pc/rtp_receiver.h"
55#include "pc/rtp_sender.h"
56#include "pc/rtp_transport_internal.h"
57#include "pc/test/fake_video_track_source.h"
Ruslan Burakov501bfba2019-02-11 10:29:19 +010058#include "pc/video_rtp_receiver.h"
Steve Anton10542f22019-01-11 09:11:00 -080059#include "pc/video_track.h"
Yves Gerey3e707812018-11-28 16:47:49 +010060#include "rtc_base/checks.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020061#include "rtc_base/gunit.h"
Yves Gerey3e707812018-11-28 16:47:49 +010062#include "rtc_base/third_party/sigslot/sigslot.h"
63#include "rtc_base/thread.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020064#include "test/gmock.h"
65#include "test/gtest.h"
Tommi4ccdf932021-05-17 14:50:10 +020066#include "test/run_loop.h"
deadbeef70ab1a12015-09-28 16:53:55 -070067
68using ::testing::_;
Amit Hilbuch2297d332019-02-19 12:49:22 -080069using ::testing::ContainerEq;
deadbeef70ab1a12015-09-28 16:53:55 -070070using ::testing::Exactly;
deadbeef5dd42fd2016-05-02 16:20:01 -070071using ::testing::InvokeWithoutArgs;
skvladdc1c62c2016-03-16 19:07:43 -070072using ::testing::Return;
Amit Hilbuch2297d332019-02-19 12:49:22 -080073using RidList = std::vector<std::string>;
deadbeef70ab1a12015-09-28 16:53:55 -070074
deadbeef20cb0c12017-02-01 20:27:00 -080075namespace {
76
Seth Hampson845e8782018-03-02 11:34:10 -080077static const char kStreamId1[] = "local_stream_1";
deadbeef70ab1a12015-09-28 16:53:55 -070078static const char kVideoTrackId[] = "video_1";
79static const char kAudioTrackId[] = "audio_1";
Peter Boström0c4e06b2015-10-07 12:23:21 +020080static const uint32_t kVideoSsrc = 98;
deadbeeffac06552015-11-25 11:26:01 -080081static const uint32_t kVideoSsrc2 = 100;
Peter Boström0c4e06b2015-10-07 12:23:21 +020082static const uint32_t kAudioSsrc = 99;
deadbeeffac06552015-11-25 11:26:01 -080083static const uint32_t kAudioSsrc2 = 101;
Florent Castelli892acf02018-10-01 22:47:20 +020084static const uint32_t kVideoSsrcSimulcast = 102;
85static const uint32_t kVideoSimulcastLayerCount = 2;
deadbeef20cb0c12017-02-01 20:27:00 -080086static const int kDefaultTimeout = 10000; // 10 seconds.
Guido Urdaneta1ff16c82019-05-20 19:31:53 +020087
88class MockSetStreamsObserver
89 : public webrtc::RtpSenderBase::SetStreamsObserver {
90 public:
Danil Chapovalov3a353122020-05-15 11:16:53 +020091 MOCK_METHOD(void, OnSetStreams, (), (override));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +020092};
93
deadbeef20cb0c12017-02-01 20:27:00 -080094} // namespace
deadbeef70ab1a12015-09-28 16:53:55 -070095
96namespace webrtc {
97
Amit Hilbuch2297d332019-02-19 12:49:22 -080098class RtpSenderReceiverTest
Mirko Bonadei6a489f22019-04-09 15:11:12 +020099 : public ::testing::Test,
100 public ::testing::WithParamInterface<std::pair<RidList, RidList>>,
Amit Hilbuch2297d332019-02-19 12:49:22 -0800101 public sigslot::has_slots<> {
tkchin3784b4a2016-06-24 19:31:47 -0700102 public:
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700103 RtpSenderReceiverTest()
Steve Anton47136dd2018-01-12 10:49:35 -0800104 : network_thread_(rtc::Thread::Current()),
105 worker_thread_(rtc::Thread::Current()),
Jonas Orelanda3aa9bd2019-04-17 07:38:40 +0200106 video_bitrate_allocator_factory_(
107 webrtc::CreateBuiltinVideoBitrateAllocatorFactory()),
Steve Anton47136dd2018-01-12 10:49:35 -0800108 // Create fake media engine/etc. so we can create channels to use to
109 // test RtpSenders/RtpReceivers.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700110 media_engine_(new cricket::FakeMediaEngine()),
Tomas Gunnarssone984aa22021-04-19 09:21:06 +0200111 fake_call_(worker_thread_, network_thread_),
Seth Hampson845e8782018-03-02 11:34:10 -0800112 local_stream_(MediaStream::Create(kStreamId1)) {
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200113 worker_thread_->Invoke<void>(RTC_FROM_HERE, [&]() {
114 channel_manager_ = cricket::ChannelManager::Create(
Harald Alvestrand7af57c62021-04-16 11:12:14 +0000115 absl::WrapUnique(media_engine_), false, worker_thread_,
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200116 network_thread_);
117 });
118
deadbeef7af91dd2016-12-13 11:29:11 -0800119 bool srtp_required = true;
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200120 rtp_dtls_transport_ = std::make_unique<cricket::FakeDtlsTransport>(
Zhi Huange830e682018-03-30 10:48:35 -0700121 "fake_dtls_transport", cricket::ICE_CANDIDATE_COMPONENT_RTP);
122 rtp_transport_ = CreateDtlsSrtpTransport();
123
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200124 voice_channel_ = channel_manager_->CreateVoiceChannel(
Zhi Huange830e682018-03-30 10:48:35 -0700125 &fake_call_, cricket::MediaConfig(), rtp_transport_.get(),
Niels Möller2a707032020-06-16 16:39:13 +0200126 rtc::Thread::Current(), cricket::CN_AUDIO, srtp_required,
127 webrtc::CryptoOptions(), &ssrc_generator_, cricket::AudioOptions());
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200128 video_channel_ = channel_manager_->CreateVideoChannel(
Zhi Huange830e682018-03-30 10:48:35 -0700129 &fake_call_, cricket::MediaConfig(), rtp_transport_.get(),
Niels Möller2a707032020-06-16 16:39:13 +0200130 rtc::Thread::Current(), cricket::CN_VIDEO, srtp_required,
131 webrtc::CryptoOptions(), &ssrc_generator_, cricket::VideoOptions(),
132 video_bitrate_allocator_factory_.get());
deadbeef20cb0c12017-02-01 20:27:00 -0800133 voice_channel_->Enable(true);
134 video_channel_->Enable(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700135 voice_media_channel_ = media_engine_->GetVoiceChannel(0);
136 video_media_channel_ = media_engine_->GetVideoChannel(0);
137 RTC_CHECK(voice_channel_);
138 RTC_CHECK(video_channel_);
139 RTC_CHECK(voice_media_channel_);
140 RTC_CHECK(video_media_channel_);
141
142 // Create streams for predefined SSRCs. Streams need to exist in order
143 // for the senders and receievers to apply parameters to them.
144 // Normally these would be created by SetLocalDescription and
145 // SetRemoteDescription.
146 voice_media_channel_->AddSendStream(
147 cricket::StreamParams::CreateLegacy(kAudioSsrc));
148 voice_media_channel_->AddRecvStream(
149 cricket::StreamParams::CreateLegacy(kAudioSsrc));
150 voice_media_channel_->AddSendStream(
151 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
152 voice_media_channel_->AddRecvStream(
153 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
154 video_media_channel_->AddSendStream(
155 cricket::StreamParams::CreateLegacy(kVideoSsrc));
156 video_media_channel_->AddRecvStream(
157 cricket::StreamParams::CreateLegacy(kVideoSsrc));
158 video_media_channel_->AddSendStream(
159 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
160 video_media_channel_->AddRecvStream(
161 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
tkchin3784b4a2016-06-24 19:31:47 -0700162 }
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700163
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200164 ~RtpSenderReceiverTest() {
165 audio_rtp_sender_ = nullptr;
166 video_rtp_sender_ = nullptr;
167 audio_rtp_receiver_ = nullptr;
168 video_rtp_receiver_ = nullptr;
169 local_stream_ = nullptr;
170 video_track_ = nullptr;
171 audio_track_ = nullptr;
Tomas Gunnarsson2e85b5f2022-01-15 14:04:27 +0100172
173 channel_manager_->DestroyVoiceChannel(voice_channel_);
174 channel_manager_->DestroyVideoChannel(video_channel_);
175
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200176 worker_thread_->Invoke<void>(RTC_FROM_HERE,
177 [&]() { channel_manager_.reset(); });
178 }
179
Zhi Huange830e682018-03-30 10:48:35 -0700180 std::unique_ptr<webrtc::RtpTransportInternal> CreateDtlsSrtpTransport() {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200181 auto dtls_srtp_transport = std::make_unique<webrtc::DtlsSrtpTransport>(
Karl Wiberg918f50c2018-07-05 11:40:33 +0200182 /*rtcp_mux_required=*/true);
Zhi Huange830e682018-03-30 10:48:35 -0700183 dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport_.get(),
184 /*rtcp_dtls_transport=*/nullptr);
185 return dtls_srtp_transport;
186 }
187
deadbeef20cb0c12017-02-01 20:27:00 -0800188 // Needed to use DTMF sender.
189 void AddDtmfCodec() {
190 cricket::AudioSendParameters params;
191 const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000,
192 0, 1);
193 params.codecs.push_back(kTelephoneEventCodec);
194 voice_media_channel_->SetSendParameters(params);
195 }
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700196
pbos5214a0a2016-12-16 15:39:11 -0800197 void AddVideoTrack() { AddVideoTrack(false); }
198
199 void AddVideoTrack(bool is_screencast) {
perkja3ede6c2016-03-08 01:27:48 +0100200 rtc::scoped_refptr<VideoTrackSourceInterface> source(
pbos5214a0a2016-12-16 15:39:11 -0800201 FakeVideoTrackSource::Create(is_screencast));
perkj773be362017-07-31 23:22:01 -0700202 video_track_ =
203 VideoTrack::Create(kVideoTrackId, source, rtc::Thread::Current());
deadbeefe814a0d2017-02-25 18:15:09 -0800204 EXPECT_TRUE(local_stream_->AddTrack(video_track_));
deadbeef70ab1a12015-09-28 16:53:55 -0700205 }
206
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700207 void CreateAudioRtpSender() { CreateAudioRtpSender(nullptr); }
208
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +0100209 void CreateAudioRtpSender(
210 const rtc::scoped_refptr<LocalAudioSource>& source) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700211 audio_track_ = AudioTrack::Create(kAudioTrackId, source);
deadbeefe814a0d2017-02-25 18:15:09 -0800212 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200213 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200214 std::make_unique<MockSetStreamsObserver>();
Steve Anton47136dd2018-01-12 10:49:35 -0800215 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200216 AudioRtpSender::Create(worker_thread_, audio_track_->id(), nullptr,
217 set_streams_observer.get());
Steve Anton111fdfd2018-06-25 13:03:36 -0700218 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200219 EXPECT_CALL(*set_streams_observer, OnSetStreams());
220 audio_rtp_sender_->SetStreams({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800221 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
deadbeeffac06552015-11-25 11:26:01 -0800222 audio_rtp_sender_->SetSsrc(kAudioSsrc);
deadbeef20cb0c12017-02-01 20:27:00 -0800223 audio_rtp_sender_->GetOnDestroyedSignal()->connect(
224 this, &RtpSenderReceiverTest::OnAudioSenderDestroyed);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700225 VerifyVoiceChannelInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700226 }
227
Steve Anton02ee47c2018-01-10 16:26:06 -0800228 void CreateAudioRtpSenderWithNoTrack() {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800229 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200230 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800231 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
Steve Anton02ee47c2018-01-10 16:26:06 -0800232 }
233
deadbeef20cb0c12017-02-01 20:27:00 -0800234 void OnAudioSenderDestroyed() { audio_sender_destroyed_signal_fired_ = true; }
235
Seth Hampson2d2c8882018-05-16 16:02:32 -0700236 void CreateVideoRtpSender(uint32_t ssrc) {
237 CreateVideoRtpSender(false, ssrc);
238 }
239
pbos5214a0a2016-12-16 15:39:11 -0800240 void CreateVideoRtpSender() { CreateVideoRtpSender(false); }
241
Amit Hilbuch2297d332019-02-19 12:49:22 -0800242 cricket::StreamParams CreateSimulcastStreamParams(int num_layers) {
Florent Castelli892acf02018-10-01 22:47:20 +0200243 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +0100244 ssrcs.reserve(num_layers);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800245 for (int i = 0; i < num_layers; ++i) {
Florent Castelli892acf02018-10-01 22:47:20 +0200246 ssrcs.push_back(kVideoSsrcSimulcast + i);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800247 }
248 return cricket::CreateSimStreamParams("cname", ssrcs);
249 }
250
251 uint32_t CreateVideoRtpSender(const cricket::StreamParams& stream_params) {
Florent Castelli892acf02018-10-01 22:47:20 +0200252 video_media_channel_->AddSendStream(stream_params);
253 uint32_t primary_ssrc = stream_params.first_ssrc();
254 CreateVideoRtpSender(primary_ssrc);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800255 return primary_ssrc;
256 }
257
258 uint32_t CreateVideoRtpSenderWithSimulcast(
259 int num_layers = kVideoSimulcastLayerCount) {
260 return CreateVideoRtpSender(CreateSimulcastStreamParams(num_layers));
261 }
262
263 uint32_t CreateVideoRtpSenderWithSimulcast(
264 const std::vector<std::string>& rids) {
265 cricket::StreamParams stream_params =
266 CreateSimulcastStreamParams(rids.size());
267 std::vector<cricket::RidDescription> rid_descriptions;
268 absl::c_transform(
269 rids, std::back_inserter(rid_descriptions), [](const std::string& rid) {
270 return cricket::RidDescription(rid, cricket::RidDirection::kSend);
271 });
272 stream_params.set_rids(rid_descriptions);
273 return CreateVideoRtpSender(stream_params);
Florent Castelli892acf02018-10-01 22:47:20 +0200274 }
275
Seth Hampson2d2c8882018-05-16 16:02:32 -0700276 void CreateVideoRtpSender(bool is_screencast, uint32_t ssrc = kVideoSsrc) {
pbos5214a0a2016-12-16 15:39:11 -0800277 AddVideoTrack(is_screencast);
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200278 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200279 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200280 video_rtp_sender_ = VideoRtpSender::Create(
281 worker_thread_, video_track_->id(), set_streams_observer.get());
Steve Anton111fdfd2018-06-25 13:03:36 -0700282 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200283 EXPECT_CALL(*set_streams_observer, OnSetStreams());
284 video_rtp_sender_->SetStreams({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800285 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Seth Hampson2d2c8882018-05-16 16:02:32 -0700286 video_rtp_sender_->SetSsrc(ssrc);
287 VerifyVideoChannelInput(ssrc);
deadbeef70ab1a12015-09-28 16:53:55 -0700288 }
Steve Anton02ee47c2018-01-10 16:26:06 -0800289 void CreateVideoRtpSenderWithNoTrack() {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200290 video_rtp_sender_ =
291 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800292 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Steve Anton02ee47c2018-01-10 16:26:06 -0800293 }
294
deadbeef70ab1a12015-09-28 16:53:55 -0700295 void DestroyAudioRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700296 audio_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700297 VerifyVoiceChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700298 }
299
300 void DestroyVideoRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700301 video_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700302 VerifyVideoChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700303 }
304
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100305 void CreateAudioRtpReceiver(
306 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
Tommi4ccdf932021-05-17 14:50:10 +0200307 audio_rtp_receiver_ = rtc::make_ref_counted<AudioRtpReceiver>(
308 rtc::Thread::Current(), kAudioTrackId, streams,
309 /*is_unified_plan=*/true);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800310 audio_rtp_receiver_->SetMediaChannel(voice_media_channel_);
Steve Antond3679212018-01-17 17:41:02 -0800311 audio_rtp_receiver_->SetupMediaChannel(kAudioSsrc);
perkjd61bf802016-03-24 03:16:19 -0700312 audio_track_ = audio_rtp_receiver_->audio_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700313 VerifyVoiceChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700314 }
315
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100316 void CreateVideoRtpReceiver(
317 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
Tommi4ccdf932021-05-17 14:50:10 +0200318 video_rtp_receiver_ = rtc::make_ref_counted<VideoRtpReceiver>(
319 rtc::Thread::Current(), kVideoTrackId, streams);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800320 video_rtp_receiver_->SetMediaChannel(video_media_channel_);
Steve Antond3679212018-01-17 17:41:02 -0800321 video_rtp_receiver_->SetupMediaChannel(kVideoSsrc);
perkjf0dcfe22016-03-10 18:32:00 +0100322 video_track_ = video_rtp_receiver_->video_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700323 VerifyVideoChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700324 }
325
Florent Castelli38332cd2018-11-20 14:08:06 +0100326 void CreateVideoRtpReceiverWithSimulcast(
327 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {},
328 int num_layers = kVideoSimulcastLayerCount) {
329 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +0100330 ssrcs.reserve(num_layers);
Florent Castelli38332cd2018-11-20 14:08:06 +0100331 for (int i = 0; i < num_layers; ++i)
332 ssrcs.push_back(kVideoSsrcSimulcast + i);
333 cricket::StreamParams stream_params =
334 cricket::CreateSimStreamParams("cname", ssrcs);
335 video_media_channel_->AddRecvStream(stream_params);
336 uint32_t primary_ssrc = stream_params.first_ssrc();
337
Tommi4ccdf932021-05-17 14:50:10 +0200338 video_rtp_receiver_ = rtc::make_ref_counted<VideoRtpReceiver>(
339 rtc::Thread::Current(), kVideoTrackId, streams);
Florent Castelli38332cd2018-11-20 14:08:06 +0100340 video_rtp_receiver_->SetMediaChannel(video_media_channel_);
341 video_rtp_receiver_->SetupMediaChannel(primary_ssrc);
342 video_track_ = video_rtp_receiver_->video_track();
343 }
344
deadbeef70ab1a12015-09-28 16:53:55 -0700345 void DestroyAudioRtpReceiver() {
Tommi4ccdf932021-05-17 14:50:10 +0200346 if (!audio_rtp_receiver_)
347 return;
348 audio_rtp_receiver_->Stop();
deadbeef70ab1a12015-09-28 16:53:55 -0700349 audio_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700350 VerifyVoiceChannelNoOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700351 }
352
353 void DestroyVideoRtpReceiver() {
Tommi4ccdf932021-05-17 14:50:10 +0200354 if (!video_rtp_receiver_)
355 return;
356 video_rtp_receiver_->Stop();
deadbeef70ab1a12015-09-28 16:53:55 -0700357 video_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700358 VerifyVideoChannelNoOutput();
359 }
360
361 void VerifyVoiceChannelInput() { VerifyVoiceChannelInput(kAudioSsrc); }
362
363 void VerifyVoiceChannelInput(uint32_t ssrc) {
364 // Verify that the media channel has an audio source, and the stream isn't
365 // muted.
366 EXPECT_TRUE(voice_media_channel_->HasSource(ssrc));
367 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(ssrc));
368 }
369
370 void VerifyVideoChannelInput() { VerifyVideoChannelInput(kVideoSsrc); }
371
372 void VerifyVideoChannelInput(uint32_t ssrc) {
373 // Verify that the media channel has a video source,
374 EXPECT_TRUE(video_media_channel_->HasSource(ssrc));
375 }
376
377 void VerifyVoiceChannelNoInput() { VerifyVoiceChannelNoInput(kAudioSsrc); }
378
379 void VerifyVoiceChannelNoInput(uint32_t ssrc) {
380 // Verify that the media channel's source is reset.
381 EXPECT_FALSE(voice_media_channel_->HasSource(ssrc));
382 }
383
384 void VerifyVideoChannelNoInput() { VerifyVideoChannelNoInput(kVideoSsrc); }
385
386 void VerifyVideoChannelNoInput(uint32_t ssrc) {
387 // Verify that the media channel's source is reset.
388 EXPECT_FALSE(video_media_channel_->HasSource(ssrc));
389 }
390
391 void VerifyVoiceChannelOutput() {
392 // Verify that the volume is initialized to 1.
393 double volume;
394 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
395 EXPECT_EQ(1, volume);
396 }
397
398 void VerifyVideoChannelOutput() {
399 // Verify that the media channel has a sink.
400 EXPECT_TRUE(video_media_channel_->HasSink(kVideoSsrc));
401 }
402
403 void VerifyVoiceChannelNoOutput() {
404 // Verify that the volume is reset to 0.
405 double volume;
406 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
407 EXPECT_EQ(0, volume);
408 }
409
410 void VerifyVideoChannelNoOutput() {
411 // Verify that the media channel's sink is reset.
412 EXPECT_FALSE(video_media_channel_->HasSink(kVideoSsrc));
deadbeef70ab1a12015-09-28 16:53:55 -0700413 }
414
Amit Hilbuch2297d332019-02-19 12:49:22 -0800415 // Verifies that the encoding layers contain the specified RIDs.
416 bool VerifyEncodingLayers(const VideoRtpSender& sender,
417 const std::vector<std::string>& rids) {
418 bool has_failure = HasFailure();
419 RtpParameters parameters = sender.GetParameters();
420 std::vector<std::string> encoding_rids;
421 absl::c_transform(
422 parameters.encodings, std::back_inserter(encoding_rids),
423 [](const RtpEncodingParameters& encoding) { return encoding.rid; });
424 EXPECT_THAT(rids, ContainerEq(encoding_rids));
425 return has_failure || !HasFailure();
426 }
427
428 // Runs a test for disabling the encoding layers on the specified sender.
429 void RunDisableEncodingLayersTest(
430 const std::vector<std::string>& all_layers,
431 const std::vector<std::string>& disabled_layers,
432 VideoRtpSender* sender) {
433 std::vector<std::string> expected;
434 absl::c_copy_if(all_layers, std::back_inserter(expected),
435 [&disabled_layers](const std::string& rid) {
436 return !absl::c_linear_search(disabled_layers, rid);
437 });
438
439 EXPECT_TRUE(VerifyEncodingLayers(*sender, all_layers));
440 sender->DisableEncodingLayers(disabled_layers);
441 EXPECT_TRUE(VerifyEncodingLayers(*sender, expected));
442 }
443
444 // Runs a test for setting an encoding layer as inactive.
445 // This test assumes that some layers have already been disabled.
446 void RunSetLastLayerAsInactiveTest(VideoRtpSender* sender) {
447 auto parameters = sender->GetParameters();
448 if (parameters.encodings.size() == 0) {
449 return;
450 }
451
452 RtpEncodingParameters& encoding = parameters.encodings.back();
453 auto rid = encoding.rid;
454 EXPECT_TRUE(encoding.active);
455 encoding.active = false;
456 auto error = sender->SetParameters(parameters);
457 ASSERT_TRUE(error.ok());
458 parameters = sender->GetParameters();
459 RtpEncodingParameters& result_encoding = parameters.encodings.back();
460 EXPECT_EQ(rid, result_encoding.rid);
461 EXPECT_FALSE(result_encoding.active);
462 }
463
464 // Runs a test for disabling the encoding layers on a sender without a media
465 // channel.
466 void RunDisableSimulcastLayersWithoutMediaEngineTest(
467 const std::vector<std::string>& all_layers,
468 const std::vector<std::string>& disabled_layers) {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200469 auto sender = VideoRtpSender::Create(rtc::Thread::Current(), "1", nullptr);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800470 RtpParameters parameters;
471 parameters.encodings.resize(all_layers.size());
472 for (size_t i = 0; i < all_layers.size(); ++i) {
473 parameters.encodings[i].rid = all_layers[i];
474 }
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800475 sender->set_init_send_encodings(parameters.encodings);
476 RunDisableEncodingLayersTest(all_layers, disabled_layers, sender.get());
477 RunSetLastLayerAsInactiveTest(sender.get());
Amit Hilbuch2297d332019-02-19 12:49:22 -0800478 }
479
480 // Runs a test for disabling the encoding layers on a sender with a media
481 // channel.
482 void RunDisableSimulcastLayersWithMediaEngineTest(
483 const std::vector<std::string>& all_layers,
484 const std::vector<std::string>& disabled_layers) {
485 uint32_t ssrc = CreateVideoRtpSenderWithSimulcast(all_layers);
486 RunDisableEncodingLayersTest(all_layers, disabled_layers,
487 video_rtp_sender_.get());
488
489 auto channel_parameters = video_media_channel_->GetRtpSendParameters(ssrc);
490 ASSERT_EQ(channel_parameters.encodings.size(), all_layers.size());
491 for (size_t i = 0; i < all_layers.size(); ++i) {
492 EXPECT_EQ(all_layers[i], channel_parameters.encodings[i].rid);
493 bool is_active = !absl::c_linear_search(disabled_layers, all_layers[i]);
494 EXPECT_EQ(is_active, channel_parameters.encodings[i].active);
495 }
496
497 RunSetLastLayerAsInactiveTest(video_rtp_sender_.get());
498 }
499
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200500 // Check that minimum Jitter Buffer delay is propagated to the underlying
Artem Titov880fa812021-07-30 22:30:23 +0200501 // `media_channel`.
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200502 void VerifyRtpReceiverDelayBehaviour(cricket::Delayable* media_channel,
503 RtpReceiverInterface* receiver,
504 uint32_t ssrc) {
505 receiver->SetJitterBufferMinimumDelay(/*delay_seconds=*/0.5);
506 absl::optional<int> delay_ms =
507 media_channel->GetBaseMinimumPlayoutDelayMs(ssrc); // In milliseconds.
508 EXPECT_DOUBLE_EQ(0.5, delay_ms.value_or(0) / 1000.0);
509 }
510
deadbeef70ab1a12015-09-28 16:53:55 -0700511 protected:
Tommi4ccdf932021-05-17 14:50:10 +0200512 test::RunLoop run_loop_;
Steve Anton47136dd2018-01-12 10:49:35 -0800513 rtc::Thread* const network_thread_;
514 rtc::Thread* const worker_thread_;
Danil Chapovalov83bbe912019-08-07 12:24:53 +0200515 webrtc::RtcEventLogNull event_log_;
Artem Titov880fa812021-07-30 22:30:23 +0200516 // The `rtp_dtls_transport_` and `rtp_transport_` should be destroyed after
517 // the `channel_manager`.
Zhi Huange830e682018-03-30 10:48:35 -0700518 std::unique_ptr<cricket::DtlsTransportInternal> rtp_dtls_transport_;
519 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport_;
Jonas Orelanda3aa9bd2019-04-17 07:38:40 +0200520 std::unique_ptr<webrtc::VideoBitrateAllocatorFactory>
521 video_bitrate_allocator_factory_;
Artem Titov880fa812021-07-30 22:30:23 +0200522 // `media_engine_` is actually owned by `channel_manager_`.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700523 cricket::FakeMediaEngine* media_engine_;
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200524 std::unique_ptr<cricket::ChannelManager> channel_manager_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700525 cricket::FakeCall fake_call_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700526 cricket::VoiceChannel* voice_channel_;
527 cricket::VideoChannel* video_channel_;
528 cricket::FakeVoiceMediaChannel* voice_media_channel_;
529 cricket::FakeVideoMediaChannel* video_media_channel_;
deadbeef70ab1a12015-09-28 16:53:55 -0700530 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
531 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
532 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
533 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
deadbeefe814a0d2017-02-25 18:15:09 -0800534 rtc::scoped_refptr<MediaStreamInterface> local_stream_;
deadbeef70ab1a12015-09-28 16:53:55 -0700535 rtc::scoped_refptr<VideoTrackInterface> video_track_;
536 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
deadbeef20cb0c12017-02-01 20:27:00 -0800537 bool audio_sender_destroyed_signal_fired_ = false;
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800538 rtc::UniqueRandomIdGenerator ssrc_generator_;
deadbeef70ab1a12015-09-28 16:53:55 -0700539};
540
Artem Titov880fa812021-07-30 22:30:23 +0200541// Test that `voice_channel_` is updated when an audio track is associated
deadbeef70ab1a12015-09-28 16:53:55 -0700542// and disassociated with an AudioRtpSender.
543TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
544 CreateAudioRtpSender();
545 DestroyAudioRtpSender();
546}
547
Artem Titov880fa812021-07-30 22:30:23 +0200548// Test that `video_channel_` is updated when a video track is associated and
deadbeef70ab1a12015-09-28 16:53:55 -0700549// disassociated with a VideoRtpSender.
550TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
551 CreateVideoRtpSender();
552 DestroyVideoRtpSender();
553}
554
Artem Titov880fa812021-07-30 22:30:23 +0200555// Test that `voice_channel_` is updated when a remote audio track is
deadbeef70ab1a12015-09-28 16:53:55 -0700556// associated and disassociated with an AudioRtpReceiver.
557TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
558 CreateAudioRtpReceiver();
559 DestroyAudioRtpReceiver();
560}
561
Artem Titov880fa812021-07-30 22:30:23 +0200562// Test that `video_channel_` is updated when a remote video track is
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700563// associated and disassociated with a VideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700564TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
565 CreateVideoRtpReceiver();
566 DestroyVideoRtpReceiver();
567}
568
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100569TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiverWithStreams) {
570 CreateAudioRtpReceiver({local_stream_});
571 DestroyAudioRtpReceiver();
572}
573
574TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiverWithStreams) {
575 CreateVideoRtpReceiver({local_stream_});
576 DestroyVideoRtpReceiver();
577}
578
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700579// Test that the AudioRtpSender applies options from the local audio source.
580TEST_F(RtpSenderReceiverTest, LocalAudioSourceOptionsApplied) {
581 cricket::AudioOptions options;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100582 options.echo_cancellation = true;
deadbeef757146b2017-02-10 21:26:48 -0800583 auto source = LocalAudioSource::Create(&options);
Niels Möllere7cc8832022-01-04 15:20:03 +0100584 CreateAudioRtpSender(source);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700585
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100586 EXPECT_EQ(true, voice_media_channel_->options().echo_cancellation);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700587
588 DestroyAudioRtpSender();
589}
590
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700591// Test that the stream is muted when the track is disabled, and unmuted when
592// the track is enabled.
593TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) {
594 CreateAudioRtpSender();
595
596 audio_track_->set_enabled(false);
597 EXPECT_TRUE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
598
599 audio_track_->set_enabled(true);
600 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
601
602 DestroyAudioRtpSender();
603}
604
605// Test that the volume is set to 0 when the track is disabled, and back to
606// 1 when the track is enabled.
deadbeef70ab1a12015-09-28 16:53:55 -0700607TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
608 CreateAudioRtpReceiver();
609
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700610 double volume;
611 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
612 EXPECT_EQ(1, volume);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700613
Tommi4ccdf932021-05-17 14:50:10 +0200614 // Handling of enable/disable is applied asynchronously.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700615 audio_track_->set_enabled(false);
Tommi4ccdf932021-05-17 14:50:10 +0200616 run_loop_.Flush();
617
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700618 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
619 EXPECT_EQ(0, volume);
620
deadbeef70ab1a12015-09-28 16:53:55 -0700621 audio_track_->set_enabled(true);
Tommi4ccdf932021-05-17 14:50:10 +0200622 run_loop_.Flush();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700623 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
624 EXPECT_EQ(1, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700625
626 DestroyAudioRtpReceiver();
627}
628
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700629// Currently no action is taken when a remote video track is disabled or
630// enabled, so there's nothing to test here, other than what is normally
631// verified in DestroyVideoRtpSender.
deadbeef70ab1a12015-09-28 16:53:55 -0700632TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
633 CreateVideoRtpSender();
634
deadbeef70ab1a12015-09-28 16:53:55 -0700635 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700636 video_track_->set_enabled(true);
637
638 DestroyVideoRtpSender();
639}
640
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700641// Test that the state of the video track created by the VideoRtpReceiver is
642// updated when the receiver is destroyed.
perkjf0dcfe22016-03-10 18:32:00 +0100643TEST_F(RtpSenderReceiverTest, RemoteVideoTrackState) {
644 CreateVideoRtpReceiver();
645
646 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track_->state());
647 EXPECT_EQ(webrtc::MediaSourceInterface::kLive,
648 video_track_->GetSource()->state());
649
650 DestroyVideoRtpReceiver();
651
652 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track_->state());
653 EXPECT_EQ(webrtc::MediaSourceInterface::kEnded,
654 video_track_->GetSource()->state());
Tommi4ccdf932021-05-17 14:50:10 +0200655 DestroyVideoRtpReceiver();
perkjf0dcfe22016-03-10 18:32:00 +0100656}
657
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700658// Currently no action is taken when a remote video track is disabled or
659// enabled, so there's nothing to test here, other than what is normally
660// verified in DestroyVideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700661TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
662 CreateVideoRtpReceiver();
663
664 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700665 video_track_->set_enabled(true);
666
667 DestroyVideoRtpReceiver();
668}
669
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700670// Test that the AudioRtpReceiver applies volume changes from the track source
671// to the media channel.
deadbeef70ab1a12015-09-28 16:53:55 -0700672TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
673 CreateAudioRtpReceiver();
674
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700675 double volume;
676 audio_track_->GetSource()->SetVolume(0.5);
Tommi4ccdf932021-05-17 14:50:10 +0200677 run_loop_.Flush();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700678 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
679 EXPECT_EQ(0.5, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700680
681 // Disable the audio track, this should prevent setting the volume.
deadbeef70ab1a12015-09-28 16:53:55 -0700682 audio_track_->set_enabled(false);
Tommi4ccdf932021-05-17 14:50:10 +0200683 RTC_DCHECK_EQ(worker_thread_, run_loop_.task_queue());
684 run_loop_.Flush();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700685 audio_track_->GetSource()->SetVolume(0.8);
686 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
687 EXPECT_EQ(0, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700688
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700689 // When the track is enabled, the previously set volume should take effect.
deadbeef70ab1a12015-09-28 16:53:55 -0700690 audio_track_->set_enabled(true);
Tommi4ccdf932021-05-17 14:50:10 +0200691 run_loop_.Flush();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700692 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
693 EXPECT_EQ(0.8, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700694
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700695 // Try changing volume one more time.
696 audio_track_->GetSource()->SetVolume(0.9);
Tommi4ccdf932021-05-17 14:50:10 +0200697 run_loop_.Flush();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700698 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
699 EXPECT_EQ(0.9, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700700
701 DestroyAudioRtpReceiver();
702}
703
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200704TEST_F(RtpSenderReceiverTest, AudioRtpReceiverDelay) {
705 CreateAudioRtpReceiver();
706 VerifyRtpReceiverDelayBehaviour(voice_media_channel_,
707 audio_rtp_receiver_.get(), kAudioSsrc);
Tommi4ccdf932021-05-17 14:50:10 +0200708 DestroyAudioRtpReceiver();
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200709}
710
711TEST_F(RtpSenderReceiverTest, VideoRtpReceiverDelay) {
712 CreateVideoRtpReceiver();
713 VerifyRtpReceiverDelayBehaviour(video_media_channel_,
714 video_rtp_receiver_.get(), kVideoSsrc);
Tommi4ccdf932021-05-17 14:50:10 +0200715 DestroyVideoRtpReceiver();
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200716}
717
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700718// Test that the media channel isn't enabled for sending if the audio sender
719// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800720TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800721 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800722 rtc::scoped_refptr<AudioTrackInterface> track =
723 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700724
725 // Track but no SSRC.
726 EXPECT_TRUE(audio_rtp_sender_->SetTrack(track));
727 VerifyVoiceChannelNoInput();
728
729 // SSRC but no track.
730 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
731 audio_rtp_sender_->SetSsrc(kAudioSsrc);
732 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800733}
734
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700735// Test that the media channel isn't enabled for sending if the video sender
736// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800737TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800738 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700739
740 // Track but no SSRC.
741 EXPECT_TRUE(video_rtp_sender_->SetTrack(video_track_));
742 VerifyVideoChannelNoInput();
743
744 // SSRC but no track.
745 EXPECT_TRUE(video_rtp_sender_->SetTrack(nullptr));
746 video_rtp_sender_->SetSsrc(kVideoSsrc);
747 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800748}
749
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700750// Test that the media channel is enabled for sending when the audio sender
751// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800752TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800753 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800754 rtc::scoped_refptr<AudioTrackInterface> track =
755 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700756 audio_rtp_sender_->SetSsrc(kAudioSsrc);
757 audio_rtp_sender_->SetTrack(track);
758 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800759
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700760 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800761}
762
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700763// Test that the media channel is enabled for sending when the audio sender
764// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800765TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800766 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800767 rtc::scoped_refptr<AudioTrackInterface> track =
768 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700769 audio_rtp_sender_->SetTrack(track);
770 audio_rtp_sender_->SetSsrc(kAudioSsrc);
771 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800772
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700773 DestroyAudioRtpSender();
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 first.
deadbeeffac06552015-11-25 11:26:01 -0800778TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
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_->SetSsrc(kVideoSsrc);
782 video_rtp_sender_->SetTrack(video_track_);
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 is enabled for sending when the video sender
789// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800790TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
nisseaf510af2016-03-21 08:20:42 -0700791 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800792 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700793 video_rtp_sender_->SetTrack(video_track_);
794 video_rtp_sender_->SetSsrc(kVideoSsrc);
795 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800796
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700797 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800798}
799
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700800// Test that the media channel stops sending when the audio sender's SSRC is set
801// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800802TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700803 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800804
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700805 audio_rtp_sender_->SetSsrc(0);
806 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800807}
808
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700809// Test that the media channel stops sending when the video sender's SSRC is set
810// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800811TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700812 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800813
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700814 audio_rtp_sender_->SetSsrc(0);
815 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800816}
817
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700818// Test that the media channel stops sending when the audio sender's track is
819// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800820TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700821 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800822
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700823 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
824 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800825}
826
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700827// Test that the media channel stops sending when the video sender's track is
828// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800829TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700830 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800831
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700832 video_rtp_sender_->SetSsrc(0);
833 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800834}
835
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700836// Test that when the audio sender's SSRC is changed, the media channel stops
837// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800838TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700839 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800840
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700841 audio_rtp_sender_->SetSsrc(kAudioSsrc2);
842 VerifyVoiceChannelNoInput(kAudioSsrc);
843 VerifyVoiceChannelInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800844
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700845 audio_rtp_sender_ = nullptr;
846 VerifyVoiceChannelNoInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800847}
848
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700849// Test that when the audio sender's SSRC is changed, the media channel stops
850// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800851TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700852 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800853
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700854 video_rtp_sender_->SetSsrc(kVideoSsrc2);
855 VerifyVideoChannelNoInput(kVideoSsrc);
856 VerifyVideoChannelInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800857
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700858 video_rtp_sender_ = nullptr;
859 VerifyVideoChannelNoInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800860}
861
skvladdc1c62c2016-03-16 19:07:43 -0700862TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) {
863 CreateAudioRtpSender();
864
skvladdc1c62c2016-03-16 19:07:43 -0700865 RtpParameters params = audio_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700866 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -0800867 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -0700868
869 DestroyAudioRtpSender();
870}
871
Florent Castelli892acf02018-10-01 22:47:20 +0200872TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParametersBeforeNegotiation) {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800873 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200874 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +0200875
876 RtpParameters params = audio_rtp_sender_->GetParameters();
877 ASSERT_EQ(1u, params.encodings.size());
878 params.encodings[0].max_bitrate_bps = 90000;
879 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
880
881 params = audio_rtp_sender_->GetParameters();
882 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
883 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
884
885 DestroyAudioRtpSender();
886}
887
888TEST_F(RtpSenderReceiverTest, AudioSenderInitParametersMovedAfterNegotiation) {
889 audio_track_ = AudioTrack::Create(kAudioTrackId, nullptr);
890 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
891
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200892 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200893 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200894 audio_rtp_sender_ = AudioRtpSender::Create(
895 worker_thread_, audio_track_->id(), nullptr, set_streams_observer.get());
Florent Castelli892acf02018-10-01 22:47:20 +0200896 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200897 EXPECT_CALL(*set_streams_observer, OnSetStreams());
898 audio_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli892acf02018-10-01 22:47:20 +0200899
900 std::vector<RtpEncodingParameters> init_encodings(1);
901 init_encodings[0].max_bitrate_bps = 60000;
902 audio_rtp_sender_->set_init_send_encodings(init_encodings);
903
904 RtpParameters params = audio_rtp_sender_->GetParameters();
905 ASSERT_EQ(1u, params.encodings.size());
906 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
907
908 // Simulate the setLocalDescription call
909 std::vector<uint32_t> ssrcs(1, 1);
910 cricket::StreamParams stream_params =
911 cricket::CreateSimStreamParams("cname", ssrcs);
912 voice_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800913 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +0200914 audio_rtp_sender_->SetSsrc(1);
915
916 params = audio_rtp_sender_->GetParameters();
917 ASSERT_EQ(1u, params.encodings.size());
918 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
919
920 DestroyAudioRtpSender();
921}
922
923TEST_F(RtpSenderReceiverTest,
924 AudioSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800925 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200926 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +0200927
928 RtpParameters params;
929 RTCError result = audio_rtp_sender_->SetParameters(params);
930 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
931 DestroyAudioRtpSender();
932}
933
Florent Castellicebf50f2018-05-03 15:31:53 +0200934TEST_F(RtpSenderReceiverTest,
935 AudioSenderMustCallGetParametersBeforeSetParameters) {
936 CreateAudioRtpSender();
937
938 RtpParameters params;
939 RTCError result = audio_rtp_sender_->SetParameters(params);
940 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
941
942 DestroyAudioRtpSender();
943}
944
945TEST_F(RtpSenderReceiverTest,
946 AudioSenderSetParametersInvalidatesTransactionId) {
947 CreateAudioRtpSender();
948
949 RtpParameters params = audio_rtp_sender_->GetParameters();
950 EXPECT_EQ(1u, params.encodings.size());
951 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
952 RTCError result = audio_rtp_sender_->SetParameters(params);
953 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
954
955 DestroyAudioRtpSender();
956}
957
958TEST_F(RtpSenderReceiverTest, AudioSenderDetectTransactionIdModification) {
959 CreateAudioRtpSender();
960
961 RtpParameters params = audio_rtp_sender_->GetParameters();
962 params.transaction_id = "";
963 RTCError result = audio_rtp_sender_->SetParameters(params);
964 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
965
966 DestroyAudioRtpSender();
967}
968
969TEST_F(RtpSenderReceiverTest, AudioSenderCheckTransactionIdRefresh) {
970 CreateAudioRtpSender();
971
972 RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200973 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 15:31:53 +0200974 auto saved_transaction_id = params.transaction_id;
975 params = audio_rtp_sender_->GetParameters();
976 EXPECT_NE(saved_transaction_id, params.transaction_id);
977
978 DestroyAudioRtpSender();
979}
980
981TEST_F(RtpSenderReceiverTest, AudioSenderSetParametersOldValueFail) {
982 CreateAudioRtpSender();
983
984 RtpParameters params = audio_rtp_sender_->GetParameters();
985 RtpParameters second_params = audio_rtp_sender_->GetParameters();
986
987 RTCError result = audio_rtp_sender_->SetParameters(params);
988 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
Seth Hampson2d2c8882018-05-16 16:02:32 -0700989 DestroyAudioRtpSender();
990}
991
992TEST_F(RtpSenderReceiverTest, AudioSenderCantSetUnimplementedRtpParameters) {
993 CreateAudioRtpSender();
994 RtpParameters params = audio_rtp_sender_->GetParameters();
995 EXPECT_EQ(1u, params.encodings.size());
996
Florent Castelli87b3c512018-07-18 16:00:28 +0200997 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 16:02:32 -0700998 params.mid = "dummy_mid";
999 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1000 audio_rtp_sender_->SetParameters(params).type());
1001 params = audio_rtp_sender_->GetParameters();
1002
Seth Hampson2d2c8882018-05-16 16:02:32 -07001003 DestroyAudioRtpSender();
1004}
1005
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001006TEST_F(RtpSenderReceiverTest, SetAudioMaxSendBitrate) {
1007 CreateAudioRtpSender();
1008
1009 EXPECT_EQ(-1, voice_media_channel_->max_bps());
1010 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001011 EXPECT_EQ(1U, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -08001012 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001013 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -08001014 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001015
1016 // Read back the parameters and verify they have been changed.
1017 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001018 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001019 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001020
1021 // Verify that the audio channel received the new parameters.
1022 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001023 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001024 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001025
1026 // Verify that the global bitrate limit has not been changed.
1027 EXPECT_EQ(-1, voice_media_channel_->max_bps());
1028
1029 DestroyAudioRtpSender();
1030}
1031
Seth Hampson24722b32017-12-22 09:36:42 -08001032TEST_F(RtpSenderReceiverTest, SetAudioBitratePriority) {
1033 CreateAudioRtpSender();
1034
1035 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001036 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001037 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1038 params.encodings[0].bitrate_priority);
1039 double new_bitrate_priority = 2.0;
1040 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -08001041 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -08001042
1043 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001044 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001045 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1046
1047 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001048 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001049 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1050
1051 DestroyAudioRtpSender();
1052}
1053
skvladdc1c62c2016-03-16 19:07:43 -07001054TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) {
1055 CreateVideoRtpSender();
1056
skvladdc1c62c2016-03-16 19:07:43 -07001057 RtpParameters params = video_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001058 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -08001059 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -07001060
1061 DestroyVideoRtpSender();
1062}
1063
Florent Castelli892acf02018-10-01 22:47:20 +02001064TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParametersBeforeNegotiation) {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001065 video_rtp_sender_ =
1066 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +02001067
1068 RtpParameters params = video_rtp_sender_->GetParameters();
1069 ASSERT_EQ(1u, params.encodings.size());
1070 params.encodings[0].max_bitrate_bps = 90000;
1071 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1072
1073 params = video_rtp_sender_->GetParameters();
1074 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1075 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
1076
1077 DestroyVideoRtpSender();
1078}
1079
1080TEST_F(RtpSenderReceiverTest, VideoSenderInitParametersMovedAfterNegotiation) {
1081 AddVideoTrack(false);
1082
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001083 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001084 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001085 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1086 set_streams_observer.get());
Florent Castelli892acf02018-10-01 22:47:20 +02001087 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001088 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1089 video_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli892acf02018-10-01 22:47:20 +02001090
1091 std::vector<RtpEncodingParameters> init_encodings(2);
1092 init_encodings[0].max_bitrate_bps = 60000;
1093 init_encodings[1].max_bitrate_bps = 900000;
1094 video_rtp_sender_->set_init_send_encodings(init_encodings);
1095
1096 RtpParameters params = video_rtp_sender_->GetParameters();
1097 ASSERT_EQ(2u, params.encodings.size());
1098 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1099 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
1100
1101 // Simulate the setLocalDescription call
1102 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +01001103 ssrcs.reserve(2);
Florent Castelli892acf02018-10-01 22:47:20 +02001104 for (int i = 0; i < 2; ++i)
1105 ssrcs.push_back(kVideoSsrcSimulcast + i);
1106 cricket::StreamParams stream_params =
1107 cricket::CreateSimStreamParams("cname", ssrcs);
1108 video_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -08001109 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +02001110 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
1111
1112 params = video_rtp_sender_->GetParameters();
1113 ASSERT_EQ(2u, params.encodings.size());
1114 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1115 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
1116
1117 DestroyVideoRtpSender();
1118}
1119
1120TEST_F(RtpSenderReceiverTest,
1121 VideoSenderInitParametersMovedAfterManualSimulcastAndNegotiation) {
1122 AddVideoTrack(false);
1123
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001124 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001125 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001126 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1127 set_streams_observer.get());
Florent Castelli892acf02018-10-01 22:47:20 +02001128 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001129 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1130 video_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli892acf02018-10-01 22:47:20 +02001131
1132 std::vector<RtpEncodingParameters> init_encodings(1);
1133 init_encodings[0].max_bitrate_bps = 60000;
1134 video_rtp_sender_->set_init_send_encodings(init_encodings);
1135
1136 RtpParameters params = video_rtp_sender_->GetParameters();
1137 ASSERT_EQ(1u, params.encodings.size());
1138 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1139
1140 // Simulate the setLocalDescription call as if the user used SDP munging
1141 // to enable simulcast
1142 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +01001143 ssrcs.reserve(2);
Florent Castelli892acf02018-10-01 22:47:20 +02001144 for (int i = 0; i < 2; ++i)
1145 ssrcs.push_back(kVideoSsrcSimulcast + i);
1146 cricket::StreamParams stream_params =
1147 cricket::CreateSimStreamParams("cname", ssrcs);
1148 video_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -08001149 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +02001150 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
1151
1152 params = video_rtp_sender_->GetParameters();
1153 ASSERT_EQ(2u, params.encodings.size());
1154 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1155
1156 DestroyVideoRtpSender();
1157}
1158
1159TEST_F(RtpSenderReceiverTest,
1160 VideoSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001161 video_rtp_sender_ =
1162 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +02001163
1164 RtpParameters params;
1165 RTCError result = video_rtp_sender_->SetParameters(params);
1166 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1167 DestroyVideoRtpSender();
1168}
1169
Florent Castellicebf50f2018-05-03 15:31:53 +02001170TEST_F(RtpSenderReceiverTest,
1171 VideoSenderMustCallGetParametersBeforeSetParameters) {
1172 CreateVideoRtpSender();
1173
1174 RtpParameters params;
1175 RTCError result = video_rtp_sender_->SetParameters(params);
1176 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1177
1178 DestroyVideoRtpSender();
1179}
1180
1181TEST_F(RtpSenderReceiverTest,
1182 VideoSenderSetParametersInvalidatesTransactionId) {
1183 CreateVideoRtpSender();
1184
1185 RtpParameters params = video_rtp_sender_->GetParameters();
1186 EXPECT_EQ(1u, params.encodings.size());
1187 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1188 RTCError result = video_rtp_sender_->SetParameters(params);
1189 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1190
1191 DestroyVideoRtpSender();
1192}
1193
1194TEST_F(RtpSenderReceiverTest, VideoSenderDetectTransactionIdModification) {
1195 CreateVideoRtpSender();
1196
1197 RtpParameters params = video_rtp_sender_->GetParameters();
1198 params.transaction_id = "";
1199 RTCError result = video_rtp_sender_->SetParameters(params);
1200 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1201
1202 DestroyVideoRtpSender();
1203}
1204
1205TEST_F(RtpSenderReceiverTest, VideoSenderCheckTransactionIdRefresh) {
1206 CreateVideoRtpSender();
1207
1208 RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001209 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 15:31:53 +02001210 auto saved_transaction_id = params.transaction_id;
1211 params = video_rtp_sender_->GetParameters();
1212 EXPECT_NE(saved_transaction_id, params.transaction_id);
1213
1214 DestroyVideoRtpSender();
1215}
1216
1217TEST_F(RtpSenderReceiverTest, VideoSenderSetParametersOldValueFail) {
1218 CreateVideoRtpSender();
1219
1220 RtpParameters params = video_rtp_sender_->GetParameters();
1221 RtpParameters second_params = video_rtp_sender_->GetParameters();
1222
1223 RTCError result = video_rtp_sender_->SetParameters(params);
1224 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1225
1226 DestroyVideoRtpSender();
1227}
1228
Seth Hampson2d2c8882018-05-16 16:02:32 -07001229TEST_F(RtpSenderReceiverTest, VideoSenderCantSetUnimplementedRtpParameters) {
1230 CreateVideoRtpSender();
1231 RtpParameters params = video_rtp_sender_->GetParameters();
1232 EXPECT_EQ(1u, params.encodings.size());
1233
Florent Castelli87b3c512018-07-18 16:00:28 +02001234 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 16:02:32 -07001235 params.mid = "dummy_mid";
1236 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1237 video_rtp_sender_->SetParameters(params).type());
1238 params = video_rtp_sender_->GetParameters();
1239
Seth Hampson2d2c8882018-05-16 16:02:32 -07001240 DestroyVideoRtpSender();
1241}
1242
Florent Castellic1a0bcb2019-01-29 14:26:48 +01001243TEST_F(RtpSenderReceiverTest, VideoSenderCanSetScaleResolutionDownBy) {
1244 CreateVideoRtpSender();
1245
1246 RtpParameters params = video_rtp_sender_->GetParameters();
1247 params.encodings[0].scale_resolution_down_by = 2;
1248
1249 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1250 params = video_rtp_sender_->GetParameters();
1251 EXPECT_EQ(2, params.encodings[0].scale_resolution_down_by);
1252
1253 DestroyVideoRtpSender();
1254}
1255
1256TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidScaleResolutionDownBy) {
1257 CreateVideoRtpSender();
1258
1259 RtpParameters params = video_rtp_sender_->GetParameters();
1260 params.encodings[0].scale_resolution_down_by = 0.5;
1261 RTCError result = video_rtp_sender_->SetParameters(params);
1262 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1263
1264 DestroyVideoRtpSender();
1265}
1266
Ă…sa Perssonfb195962021-08-16 16:41:56 +02001267TEST_F(RtpSenderReceiverTest, VideoSenderCanSetNumTemporalLayers) {
1268 CreateVideoRtpSender();
1269
1270 RtpParameters params = video_rtp_sender_->GetParameters();
1271 params.encodings[0].num_temporal_layers = 2;
1272
1273 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1274 params = video_rtp_sender_->GetParameters();
1275 EXPECT_EQ(2, params.encodings[0].num_temporal_layers);
1276
1277 DestroyVideoRtpSender();
1278}
1279
1280TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidNumTemporalLayers) {
1281 CreateVideoRtpSender();
1282
1283 RtpParameters params = video_rtp_sender_->GetParameters();
1284 params.encodings[0].num_temporal_layers = webrtc::kMaxTemporalStreams + 1;
1285 RTCError result = video_rtp_sender_->SetParameters(params);
1286 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1287
1288 DestroyVideoRtpSender();
1289}
1290
Florent Castelli907dc802019-12-06 15:03:19 +01001291TEST_F(RtpSenderReceiverTest, VideoSenderCanSetMaxFramerate) {
1292 CreateVideoRtpSender();
1293
1294 RtpParameters params = video_rtp_sender_->GetParameters();
1295 params.encodings[0].max_framerate = 20;
1296
1297 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1298 params = video_rtp_sender_->GetParameters();
1299 EXPECT_EQ(20., params.encodings[0].max_framerate);
1300
1301 DestroyVideoRtpSender();
1302}
1303
1304TEST_F(RtpSenderReceiverTest, VideoSenderCanSetMaxFramerateZero) {
1305 CreateVideoRtpSender();
1306
1307 RtpParameters params = video_rtp_sender_->GetParameters();
1308 params.encodings[0].max_framerate = 0.;
1309
1310 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1311 params = video_rtp_sender_->GetParameters();
1312 EXPECT_EQ(0., params.encodings[0].max_framerate);
1313
1314 DestroyVideoRtpSender();
1315}
1316
1317TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidMaxFramerate) {
1318 CreateVideoRtpSender();
1319
1320 RtpParameters params = video_rtp_sender_->GetParameters();
1321 params.encodings[0].max_framerate = -5.;
1322 RTCError result = video_rtp_sender_->SetParameters(params);
1323 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1324
1325 DestroyVideoRtpSender();
1326}
1327
Seth Hampson2d2c8882018-05-16 16:02:32 -07001328// A video sender can have multiple simulcast layers, in which case it will
1329// contain multiple RtpEncodingParameters. This tests that if this is the case
1330// (simulcast), then we can't set the bitrate_priority, or max_bitrate_bps
1331// for any encodings besides at index 0, because these are both implemented
1332// "per-sender."
1333TEST_F(RtpSenderReceiverTest, VideoSenderCantSetPerSenderEncodingParameters) {
1334 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001335 CreateVideoRtpSenderWithSimulcast();
Seth Hampson2d2c8882018-05-16 16:02:32 -07001336 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001337 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Seth Hampson2d2c8882018-05-16 16:02:32 -07001338
1339 params.encodings[1].bitrate_priority = 2.0;
1340 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1341 video_rtp_sender_->SetParameters(params).type());
1342 params = video_rtp_sender_->GetParameters();
1343
Seth Hampson2d2c8882018-05-16 16:02:32 -07001344 DestroyVideoRtpSender();
1345}
1346
Florent Castelli892acf02018-10-01 22:47:20 +02001347TEST_F(RtpSenderReceiverTest, VideoSenderCantSetReadOnlyEncodingParameters) {
1348 // Add a simulcast specific send stream that contains 2 encoding parameters.
1349 CreateVideoRtpSenderWithSimulcast();
1350 RtpParameters params = video_rtp_sender_->GetParameters();
1351 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
1352
1353 for (size_t i = 0; i < params.encodings.size(); i++) {
1354 params.encodings[i].ssrc = 1337;
1355 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION,
1356 video_rtp_sender_->SetParameters(params).type());
1357 params = video_rtp_sender_->GetParameters();
1358 }
1359
1360 DestroyVideoRtpSender();
1361}
1362
Ă…sa Persson55659812018-06-18 17:51:32 +02001363TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrate) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001364 CreateVideoRtpSender();
1365
1366 EXPECT_EQ(-1, video_media_channel_->max_bps());
1367 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001368 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001369 EXPECT_FALSE(params.encodings[0].min_bitrate_bps);
deadbeefe702b302017-02-04 12:09:01 -08001370 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Ă…sa Persson55659812018-06-18 17:51:32 +02001371 params.encodings[0].min_bitrate_bps = 100;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001372 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -08001373 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001374
1375 // Read back the parameters and verify they have been changed.
1376 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001377 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001378 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001379 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001380
1381 // Verify that the video channel received the new parameters.
1382 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001383 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001384 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001385 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001386
1387 // Verify that the global bitrate limit has not been changed.
1388 EXPECT_EQ(-1, video_media_channel_->max_bps());
1389
1390 DestroyVideoRtpSender();
1391}
1392
Ă…sa Persson55659812018-06-18 17:51:32 +02001393TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrateSimulcast) {
1394 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001395 CreateVideoRtpSenderWithSimulcast();
Ă…sa Persson55659812018-06-18 17:51:32 +02001396
1397 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001398 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001399 params.encodings[0].min_bitrate_bps = 100;
1400 params.encodings[0].max_bitrate_bps = 1000;
1401 params.encodings[1].min_bitrate_bps = 200;
1402 params.encodings[1].max_bitrate_bps = 2000;
1403 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1404
1405 // Verify that the video channel received the new parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001406 params = video_media_channel_->GetRtpSendParameters(kVideoSsrcSimulcast);
1407 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001408 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
1409 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
1410 EXPECT_EQ(200, params.encodings[1].min_bitrate_bps);
1411 EXPECT_EQ(2000, params.encodings[1].max_bitrate_bps);
1412
1413 DestroyVideoRtpSender();
1414}
1415
Seth Hampson24722b32017-12-22 09:36:42 -08001416TEST_F(RtpSenderReceiverTest, SetVideoBitratePriority) {
1417 CreateVideoRtpSender();
1418
1419 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001420 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001421 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1422 params.encodings[0].bitrate_priority);
1423 double new_bitrate_priority = 2.0;
1424 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -08001425 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -08001426
1427 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001428 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001429 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1430
1431 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001432 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001433 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1434
1435 DestroyVideoRtpSender();
1436}
1437
Florent Castelli38332cd2018-11-20 14:08:06 +01001438TEST_F(RtpSenderReceiverTest, VideoReceiverCanGetParametersWithSimulcast) {
1439 CreateVideoRtpReceiverWithSimulcast({}, 2);
1440
1441 RtpParameters params = video_rtp_receiver_->GetParameters();
1442 EXPECT_EQ(2u, params.encodings.size());
1443
1444 DestroyVideoRtpReceiver();
1445}
1446
pbos5214a0a2016-12-16 15:39:11 -08001447// Test that makes sure that a video track content hint translates to the proper
1448// value for sources that are not screencast.
1449TEST_F(RtpSenderReceiverTest, PropagatesVideoTrackContentHint) {
1450 CreateVideoRtpSender();
1451
1452 video_track_->set_enabled(true);
1453
Artem Titov880fa812021-07-30 22:30:23 +02001454 // `video_track_` is not screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001455 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001456 // No content hint should be set by default.
1457 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1458 video_track_->content_hint());
1459 // Setting detailed should turn a non-screencast source into screencast mode.
1460 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001461 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001462 // Removing the content hint should turn the track back into non-screencast
1463 // mode.
1464 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001465 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001466 // Setting fluid should remain in non-screencast mode (its default).
1467 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001468 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 08:53:10 +02001469 // Setting text should have the same effect as Detailed
1470 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
1471 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001472
1473 DestroyVideoRtpSender();
1474}
1475
1476// Test that makes sure that a video track content hint translates to the proper
1477// value for screencast sources.
1478TEST_F(RtpSenderReceiverTest,
1479 PropagatesVideoTrackContentHintForScreencastSource) {
1480 CreateVideoRtpSender(true);
1481
1482 video_track_->set_enabled(true);
1483
Artem Titov880fa812021-07-30 22:30:23 +02001484 // `video_track_` with a screencast source should be screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001485 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001486 // No content hint should be set by default.
1487 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1488 video_track_->content_hint());
1489 // Setting fluid should turn a screencast source into non-screencast mode.
1490 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001491 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001492 // Removing the content hint should turn the track back into screencast mode.
1493 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001494 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001495 // Setting detailed should still remain in screencast mode (its default).
1496 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001497 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 08:53:10 +02001498 // Setting text should have the same effect as Detailed
1499 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
1500 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001501
1502 DestroyVideoRtpSender();
1503}
1504
1505// Test that makes sure any content hints that are set on a track before
1506// VideoRtpSender is ready to send are still applied when it gets ready to send.
1507TEST_F(RtpSenderReceiverTest,
1508 PropagatesVideoTrackContentHintSetBeforeEnabling) {
1509 AddVideoTrack();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001510 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001511 std::make_unique<MockSetStreamsObserver>();
pbos5214a0a2016-12-16 15:39:11 -08001512 // Setting detailed overrides the default non-screencast mode. This should be
1513 // applied even if the track is set on construction.
1514 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001515 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1516 set_streams_observer.get());
Steve Anton111fdfd2018-06-25 13:03:36 -07001517 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001518 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1519 video_rtp_sender_->SetStreams({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -08001520 video_rtp_sender_->SetMediaChannel(video_media_channel_);
pbos5214a0a2016-12-16 15:39:11 -08001521 video_track_->set_enabled(true);
1522
1523 // Sender is not ready to send (no SSRC) so no option should have been set.
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001524 EXPECT_EQ(absl::nullopt, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001525
1526 // Verify that the content hint is accounted for when video_rtp_sender_ does
1527 // get enabled.
1528 video_rtp_sender_->SetSsrc(kVideoSsrc);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001529 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001530
1531 // And removing the hint should go back to false (to verify that false was
1532 // default correctly).
1533 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001534 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001535
1536 DestroyVideoRtpSender();
1537}
1538
deadbeef20cb0c12017-02-01 20:27:00 -08001539TEST_F(RtpSenderReceiverTest, AudioSenderHasDtmfSender) {
1540 CreateAudioRtpSender();
1541 EXPECT_NE(nullptr, audio_rtp_sender_->GetDtmfSender());
1542}
1543
1544TEST_F(RtpSenderReceiverTest, VideoSenderDoesNotHaveDtmfSender) {
1545 CreateVideoRtpSender();
1546 EXPECT_EQ(nullptr, video_rtp_sender_->GetDtmfSender());
1547}
1548
Artem Titov880fa812021-07-30 22:30:23 +02001549// Test that the DTMF sender is really using `voice_channel_`, and thus returns
1550// true/false from CanSendDtmf based on what `voice_channel_` returns.
deadbeef20cb0c12017-02-01 20:27:00 -08001551TEST_F(RtpSenderReceiverTest, CanInsertDtmf) {
1552 AddDtmfCodec();
1553 CreateAudioRtpSender();
1554 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1555 ASSERT_NE(nullptr, dtmf_sender);
1556 EXPECT_TRUE(dtmf_sender->CanInsertDtmf());
1557}
1558
1559TEST_F(RtpSenderReceiverTest, CanNotInsertDtmf) {
1560 CreateAudioRtpSender();
1561 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1562 ASSERT_NE(nullptr, dtmf_sender);
1563 // DTMF codec has not been added, as it was in the above test.
1564 EXPECT_FALSE(dtmf_sender->CanInsertDtmf());
1565}
1566
1567TEST_F(RtpSenderReceiverTest, InsertDtmf) {
1568 AddDtmfCodec();
1569 CreateAudioRtpSender();
1570 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1571 ASSERT_NE(nullptr, dtmf_sender);
1572
1573 EXPECT_EQ(0U, voice_media_channel_->dtmf_info_queue().size());
1574
1575 // Insert DTMF
1576 const int expected_duration = 90;
1577 dtmf_sender->InsertDtmf("012", expected_duration, 100);
1578
1579 // Verify
1580 ASSERT_EQ_WAIT(3U, voice_media_channel_->dtmf_info_queue().size(),
1581 kDefaultTimeout);
1582 const uint32_t send_ssrc =
1583 voice_media_channel_->send_streams()[0].first_ssrc();
1584 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[0],
1585 send_ssrc, 0, expected_duration));
1586 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[1],
1587 send_ssrc, 1, expected_duration));
1588 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[2],
1589 send_ssrc, 2, expected_duration));
1590}
1591
1592// Make sure the signal from "GetOnDestroyedSignal()" fires when the sender is
1593// destroyed, which is needed for the DTMF sender.
1594TEST_F(RtpSenderReceiverTest, TestOnDestroyedSignal) {
1595 CreateAudioRtpSender();
1596 EXPECT_FALSE(audio_sender_destroyed_signal_fired_);
1597 audio_rtp_sender_ = nullptr;
1598 EXPECT_TRUE(audio_sender_destroyed_signal_fired_);
1599}
1600
Benjamin Wright84583f62018-10-04 14:22:34 -07001601// Validate that the default FrameEncryptor setting is nullptr.
1602TEST_F(RtpSenderReceiverTest, AudioSenderCanSetFrameEncryptor) {
1603 CreateAudioRtpSender();
1604 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1605 new FakeFrameEncryptor());
1606 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1607 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1608 EXPECT_EQ(fake_frame_encryptor.get(),
1609 audio_rtp_sender_->GetFrameEncryptor().get());
1610}
1611
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001612// Validate that setting a FrameEncryptor after the send stream is stopped does
1613// nothing.
1614TEST_F(RtpSenderReceiverTest, AudioSenderCannotSetFrameEncryptorAfterStop) {
1615 CreateAudioRtpSender();
1616 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1617 new FakeFrameEncryptor());
1618 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1619 audio_rtp_sender_->Stop();
1620 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1621 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1622}
1623
Benjamin Wright84583f62018-10-04 14:22:34 -07001624// Validate that the default FrameEncryptor setting is nullptr.
1625TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetFrameDecryptor) {
1626 CreateAudioRtpReceiver();
1627 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1628 new FakeFrameDecryptor());
1629 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
1630 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1631 EXPECT_EQ(fake_frame_decryptor.get(),
1632 audio_rtp_receiver_->GetFrameDecryptor().get());
Tommi4ccdf932021-05-17 14:50:10 +02001633 DestroyAudioRtpReceiver();
Benjamin Wright84583f62018-10-04 14:22:34 -07001634}
1635
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001636// Validate that the default FrameEncryptor setting is nullptr.
1637TEST_F(RtpSenderReceiverTest, AudioReceiverCannotSetFrameDecryptorAfterStop) {
1638 CreateAudioRtpReceiver();
1639 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1640 new FakeFrameDecryptor());
1641 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
1642 audio_rtp_receiver_->Stop();
1643 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1644 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
Tommi4ccdf932021-05-17 14:50:10 +02001645 DestroyAudioRtpReceiver();
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001646}
1647
1648// Validate that the default FrameEncryptor setting is nullptr.
1649TEST_F(RtpSenderReceiverTest, VideoSenderCanSetFrameEncryptor) {
1650 CreateVideoRtpSender();
1651 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1652 new FakeFrameEncryptor());
1653 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1654 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1655 EXPECT_EQ(fake_frame_encryptor.get(),
1656 video_rtp_sender_->GetFrameEncryptor().get());
1657}
1658
1659// Validate that setting a FrameEncryptor after the send stream is stopped does
1660// nothing.
1661TEST_F(RtpSenderReceiverTest, VideoSenderCannotSetFrameEncryptorAfterStop) {
1662 CreateVideoRtpSender();
1663 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1664 new FakeFrameEncryptor());
1665 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1666 video_rtp_sender_->Stop();
1667 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1668 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1669}
1670
1671// Validate that the default FrameEncryptor setting is nullptr.
1672TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetFrameDecryptor) {
1673 CreateVideoRtpReceiver();
1674 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1675 new FakeFrameDecryptor());
1676 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
1677 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1678 EXPECT_EQ(fake_frame_decryptor.get(),
1679 video_rtp_receiver_->GetFrameDecryptor().get());
Tommi4ccdf932021-05-17 14:50:10 +02001680 DestroyVideoRtpReceiver();
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001681}
1682
1683// Validate that the default FrameEncryptor setting is nullptr.
1684TEST_F(RtpSenderReceiverTest, VideoReceiverCannotSetFrameDecryptorAfterStop) {
1685 CreateVideoRtpReceiver();
1686 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1687 new FakeFrameDecryptor());
1688 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
1689 video_rtp_receiver_->Stop();
1690 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1691 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
Tommi4ccdf932021-05-17 14:50:10 +02001692 DestroyVideoRtpReceiver();
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001693}
1694
Amit Hilbuch619b2942019-02-26 15:55:19 -08001695// Checks that calling the internal methods for get/set parameters do not
1696// invalidate any parameters retreived by clients.
1697TEST_F(RtpSenderReceiverTest,
1698 InternalParameterMethodsDoNotInvalidateTransaction) {
1699 CreateVideoRtpSender();
1700 RtpParameters parameters = video_rtp_sender_->GetParameters();
1701 RtpParameters new_parameters = video_rtp_sender_->GetParametersInternal();
1702 new_parameters.encodings[0].active = false;
1703 video_rtp_sender_->SetParametersInternal(new_parameters);
1704 new_parameters.encodings[0].active = true;
1705 video_rtp_sender_->SetParametersInternal(new_parameters);
1706 parameters.encodings[0].active = false;
1707 EXPECT_TRUE(video_rtp_sender_->SetParameters(parameters).ok());
1708}
1709
Amit Hilbuch2297d332019-02-19 12:49:22 -08001710// Helper method for syntactic sugar for accepting a vector with '{}' notation.
1711std::pair<RidList, RidList> CreatePairOfRidVectors(
1712 const std::vector<std::string>& first,
1713 const std::vector<std::string>& second) {
1714 return std::make_pair(first, second);
1715}
1716
1717// These parameters are used to test disabling simulcast layers.
1718const std::pair<RidList, RidList> kDisableSimulcastLayersParameters[] = {
1719 // Tests removing the first layer. This is a special case because
1720 // the first layer's SSRC is also the 'primary' SSRC used to associate the
1721 // parameters to the media channel.
1722 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"1"}),
1723 // Tests removing some layers.
1724 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"2", "4"}),
1725 // Tests simulcast rejected scenario all layers except first are rejected.
1726 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"2", "3", "4"}),
1727 // Tests removing all layers.
1728 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"1", "2", "3", "4"}),
1729};
1730
1731// Runs test for disabling layers on a sender without a media engine set.
1732TEST_P(RtpSenderReceiverTest, DisableSimulcastLayersWithoutMediaEngine) {
1733 auto parameter = GetParam();
1734 RunDisableSimulcastLayersWithoutMediaEngineTest(parameter.first,
1735 parameter.second);
1736}
1737
1738// Runs test for disabling layers on a sender with a media engine set.
1739TEST_P(RtpSenderReceiverTest, DisableSimulcastLayersWithMediaEngine) {
1740 auto parameter = GetParam();
1741 RunDisableSimulcastLayersWithMediaEngineTest(parameter.first,
1742 parameter.second);
1743}
1744
1745INSTANTIATE_TEST_SUITE_P(
1746 DisableSimulcastLayersInSender,
1747 RtpSenderReceiverTest,
1748 ::testing::ValuesIn(kDisableSimulcastLayersParameters));
1749
deadbeef70ab1a12015-09-28 16:53:55 -07001750} // namespace webrtc