blob: 5023917c40ffe6c5f1a394ac49cadaa26a883ff1 [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>
Harald Alvestrandc24a2182022-02-23 13:44:59 +000014#include <iterator>
kwibergd1fe2812016-04-27 06:47:29 -070015#include <memory>
deadbeef70ab1a12015-09-28 16:53:55 -070016#include <string>
Tommif888bb52015-12-12 01:37:01 +010017#include <utility>
Yves Gerey3e707812018-11-28 16:47:49 +010018#include <vector>
deadbeef70ab1a12015-09-28 16:53:55 -070019
Amit Hilbuch2297d332019-02-19 12:49:22 -080020#include "absl/algorithm/container.h"
Yves Gerey3e707812018-11-28 16:47:49 +010021#include "absl/memory/memory.h"
22#include "absl/types/optional.h"
23#include "api/audio_options.h"
Steve Anton10542f22019-01-11 09:11:00 -080024#include "api/crypto/crypto_options.h"
25#include "api/crypto/frame_decryptor_interface.h"
26#include "api/crypto/frame_encryptor_interface.h"
27#include "api/dtmf_sender_interface.h"
28#include "api/media_stream_interface.h"
29#include "api/rtc_error.h"
Danil Chapovalov83bbe912019-08-07 12:24:53 +020030#include "api/rtc_event_log/rtc_event_log.h"
Steve Anton10542f22019-01-11 09:11:00 -080031#include "api/rtp_parameters.h"
Harald Alvestrandc24a2182022-02-23 13:44:59 +000032#include "api/rtp_receiver_interface.h"
Mirko Bonadeid9708072019-01-25 20:26:48 +010033#include "api/scoped_refptr.h"
Benjamin Wright84583f62018-10-04 14:22:34 -070034#include "api/test/fake_frame_decryptor.h"
35#include "api/test/fake_frame_encryptor.h"
Jonas Orelanda3aa9bd2019-04-17 07:38:40 +020036#include "api/video/builtin_video_bitrate_allocator_factory.h"
Harald Alvestrandc24a2182022-02-23 13:44:59 +000037#include "api/video/video_bitrate_allocator_factory.h"
38#include "api/video/video_codec_constants.h"
Yves Gerey3e707812018-11-28 16:47:49 +010039#include "media/base/codec.h"
Harald Alvestrandc24a2182022-02-23 13:44:59 +000040#include "media/base/delayable.h"
Steve Anton10542f22019-01-11 09:11:00 -080041#include "media/base/fake_media_engine.h"
42#include "media/base/media_channel.h"
43#include "media/base/media_config.h"
44#include "media/base/media_engine.h"
Harald Alvestrandc24a2182022-02-23 13:44:59 +000045#include "media/base/rid_description.h"
Steve Anton10542f22019-01-11 09:11:00 -080046#include "media/base/stream_params.h"
47#include "media/base/test_utils.h"
48#include "media/engine/fake_webrtc_call.h"
49#include "p2p/base/dtls_transport_internal.h"
50#include "p2p/base/fake_dtls_transport.h"
51#include "p2p/base/p2p_constants.h"
Ruslan Burakov501bfba2019-02-11 10:29:19 +010052#include "pc/audio_rtp_receiver.h"
Steve Anton10542f22019-01-11 09:11:00 -080053#include "pc/audio_track.h"
Yves Gerey3e707812018-11-28 16:47:49 +010054#include "pc/channel.h"
Steve Anton10542f22019-01-11 09:11:00 -080055#include "pc/channel_manager.h"
56#include "pc/dtls_srtp_transport.h"
57#include "pc/local_audio_source.h"
58#include "pc/media_stream.h"
Steve Anton10542f22019-01-11 09:11:00 -080059#include "pc/rtp_sender.h"
60#include "pc/rtp_transport_internal.h"
61#include "pc/test/fake_video_track_source.h"
Ruslan Burakov501bfba2019-02-11 10:29:19 +010062#include "pc/video_rtp_receiver.h"
Steve Anton10542f22019-01-11 09:11:00 -080063#include "pc/video_track.h"
Yves Gerey3e707812018-11-28 16:47:49 +010064#include "rtc_base/checks.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020065#include "rtc_base/gunit.h"
Harald Alvestrandc24a2182022-02-23 13:44:59 +000066#include "rtc_base/location.h"
67#include "rtc_base/ref_counted_object.h"
Yves Gerey3e707812018-11-28 16:47:49 +010068#include "rtc_base/third_party/sigslot/sigslot.h"
69#include "rtc_base/thread.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020070#include "test/gmock.h"
71#include "test/gtest.h"
Tommi4ccdf932021-05-17 14:50:10 +020072#include "test/run_loop.h"
Jonas Orelanded99dae2022-03-09 09:28:10 +010073#include "test/scoped_key_value_config.h"
deadbeef70ab1a12015-09-28 16:53:55 -070074
75using ::testing::_;
Amit Hilbuch2297d332019-02-19 12:49:22 -080076using ::testing::ContainerEq;
deadbeef70ab1a12015-09-28 16:53:55 -070077using ::testing::Exactly;
deadbeef5dd42fd2016-05-02 16:20:01 -070078using ::testing::InvokeWithoutArgs;
skvladdc1c62c2016-03-16 19:07:43 -070079using ::testing::Return;
Amit Hilbuch2297d332019-02-19 12:49:22 -080080using RidList = std::vector<std::string>;
deadbeef70ab1a12015-09-28 16:53:55 -070081
deadbeef20cb0c12017-02-01 20:27:00 -080082namespace {
83
Seth Hampson845e8782018-03-02 11:34:10 -080084static const char kStreamId1[] = "local_stream_1";
deadbeef70ab1a12015-09-28 16:53:55 -070085static const char kVideoTrackId[] = "video_1";
86static const char kAudioTrackId[] = "audio_1";
Peter Boström0c4e06b2015-10-07 12:23:21 +020087static const uint32_t kVideoSsrc = 98;
deadbeeffac06552015-11-25 11:26:01 -080088static const uint32_t kVideoSsrc2 = 100;
Peter Boström0c4e06b2015-10-07 12:23:21 +020089static const uint32_t kAudioSsrc = 99;
deadbeeffac06552015-11-25 11:26:01 -080090static const uint32_t kAudioSsrc2 = 101;
Florent Castelli892acf02018-10-01 22:47:20 +020091static const uint32_t kVideoSsrcSimulcast = 102;
92static const uint32_t kVideoSimulcastLayerCount = 2;
deadbeef20cb0c12017-02-01 20:27:00 -080093static const int kDefaultTimeout = 10000; // 10 seconds.
Guido Urdaneta1ff16c82019-05-20 19:31:53 +020094
95class MockSetStreamsObserver
96 : public webrtc::RtpSenderBase::SetStreamsObserver {
97 public:
Danil Chapovalov3a353122020-05-15 11:16:53 +020098 MOCK_METHOD(void, OnSetStreams, (), (override));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +020099};
100
deadbeef20cb0c12017-02-01 20:27:00 -0800101} // namespace
deadbeef70ab1a12015-09-28 16:53:55 -0700102
103namespace webrtc {
104
Amit Hilbuch2297d332019-02-19 12:49:22 -0800105class RtpSenderReceiverTest
Mirko Bonadei6a489f22019-04-09 15:11:12 +0200106 : public ::testing::Test,
107 public ::testing::WithParamInterface<std::pair<RidList, RidList>>,
Amit Hilbuch2297d332019-02-19 12:49:22 -0800108 public sigslot::has_slots<> {
tkchin3784b4a2016-06-24 19:31:47 -0700109 public:
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700110 RtpSenderReceiverTest()
Steve Anton47136dd2018-01-12 10:49:35 -0800111 : network_thread_(rtc::Thread::Current()),
112 worker_thread_(rtc::Thread::Current()),
Jonas Orelanda3aa9bd2019-04-17 07:38:40 +0200113 video_bitrate_allocator_factory_(
114 webrtc::CreateBuiltinVideoBitrateAllocatorFactory()),
Steve Anton47136dd2018-01-12 10:49:35 -0800115 // Create fake media engine/etc. so we can create channels to use to
116 // test RtpSenders/RtpReceivers.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700117 media_engine_(new cricket::FakeMediaEngine()),
Tomas Gunnarssone984aa22021-04-19 09:21:06 +0200118 fake_call_(worker_thread_, network_thread_),
Seth Hampson845e8782018-03-02 11:34:10 -0800119 local_stream_(MediaStream::Create(kStreamId1)) {
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200120 worker_thread_->Invoke<void>(RTC_FROM_HERE, [&]() {
121 channel_manager_ = cricket::ChannelManager::Create(
Harald Alvestrand7af57c62021-04-16 11:12:14 +0000122 absl::WrapUnique(media_engine_), false, worker_thread_,
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200123 network_thread_);
124 });
125
deadbeef7af91dd2016-12-13 11:29:11 -0800126 bool srtp_required = true;
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200127 rtp_dtls_transport_ = std::make_unique<cricket::FakeDtlsTransport>(
Zhi Huange830e682018-03-30 10:48:35 -0700128 "fake_dtls_transport", cricket::ICE_CANDIDATE_COMPONENT_RTP);
129 rtp_transport_ = CreateDtlsSrtpTransport();
130
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200131 voice_channel_ = channel_manager_->CreateVoiceChannel(
Tomas Gunnarsson5411b172022-01-24 08:45:26 +0100132 &fake_call_, cricket::MediaConfig(), cricket::CN_AUDIO, srtp_required,
133 webrtc::CryptoOptions(), cricket::AudioOptions());
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200134 video_channel_ = channel_manager_->CreateVideoChannel(
Tomas Gunnarsson5411b172022-01-24 08:45:26 +0100135 &fake_call_, cricket::MediaConfig(), cricket::CN_VIDEO, srtp_required,
136 webrtc::CryptoOptions(), cricket::VideoOptions(),
Niels Möller2a707032020-06-16 16:39:13 +0200137 video_bitrate_allocator_factory_.get());
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +0100138
139 voice_channel_->SetRtpTransport(rtp_transport_.get());
140 video_channel_->SetRtpTransport(rtp_transport_.get());
141
deadbeef20cb0c12017-02-01 20:27:00 -0800142 voice_channel_->Enable(true);
143 video_channel_->Enable(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700144 voice_media_channel_ = media_engine_->GetVoiceChannel(0);
145 video_media_channel_ = media_engine_->GetVideoChannel(0);
146 RTC_CHECK(voice_channel_);
147 RTC_CHECK(video_channel_);
148 RTC_CHECK(voice_media_channel_);
149 RTC_CHECK(video_media_channel_);
150
151 // Create streams for predefined SSRCs. Streams need to exist in order
152 // for the senders and receievers to apply parameters to them.
153 // Normally these would be created by SetLocalDescription and
154 // SetRemoteDescription.
155 voice_media_channel_->AddSendStream(
156 cricket::StreamParams::CreateLegacy(kAudioSsrc));
157 voice_media_channel_->AddRecvStream(
158 cricket::StreamParams::CreateLegacy(kAudioSsrc));
159 voice_media_channel_->AddSendStream(
160 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
161 voice_media_channel_->AddRecvStream(
162 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
163 video_media_channel_->AddSendStream(
164 cricket::StreamParams::CreateLegacy(kVideoSsrc));
165 video_media_channel_->AddRecvStream(
166 cricket::StreamParams::CreateLegacy(kVideoSsrc));
167 video_media_channel_->AddSendStream(
168 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
169 video_media_channel_->AddRecvStream(
170 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
tkchin3784b4a2016-06-24 19:31:47 -0700171 }
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700172
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200173 ~RtpSenderReceiverTest() {
174 audio_rtp_sender_ = nullptr;
175 video_rtp_sender_ = nullptr;
176 audio_rtp_receiver_ = nullptr;
177 video_rtp_receiver_ = nullptr;
178 local_stream_ = nullptr;
179 video_track_ = nullptr;
180 audio_track_ = nullptr;
Tomas Gunnarsson2e85b5f2022-01-15 14:04:27 +0100181
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +0100182 voice_channel_->SetRtpTransport(nullptr);
183 video_channel_->SetRtpTransport(nullptr);
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200184 }
185
Zhi Huange830e682018-03-30 10:48:35 -0700186 std::unique_ptr<webrtc::RtpTransportInternal> CreateDtlsSrtpTransport() {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200187 auto dtls_srtp_transport = std::make_unique<webrtc::DtlsSrtpTransport>(
Jonas Orelanded99dae2022-03-09 09:28:10 +0100188 /*rtcp_mux_required=*/true, field_trials_);
Zhi Huange830e682018-03-30 10:48:35 -0700189 dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport_.get(),
190 /*rtcp_dtls_transport=*/nullptr);
191 return dtls_srtp_transport;
192 }
193
deadbeef20cb0c12017-02-01 20:27:00 -0800194 // Needed to use DTMF sender.
195 void AddDtmfCodec() {
196 cricket::AudioSendParameters params;
197 const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000,
198 0, 1);
199 params.codecs.push_back(kTelephoneEventCodec);
200 voice_media_channel_->SetSendParameters(params);
201 }
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700202
pbos5214a0a2016-12-16 15:39:11 -0800203 void AddVideoTrack() { AddVideoTrack(false); }
204
205 void AddVideoTrack(bool is_screencast) {
perkja3ede6c2016-03-08 01:27:48 +0100206 rtc::scoped_refptr<VideoTrackSourceInterface> source(
pbos5214a0a2016-12-16 15:39:11 -0800207 FakeVideoTrackSource::Create(is_screencast));
perkj773be362017-07-31 23:22:01 -0700208 video_track_ =
209 VideoTrack::Create(kVideoTrackId, source, rtc::Thread::Current());
Harald Alvestrand2f7ad282022-04-21 11:35:43 +0000210 EXPECT_TRUE(local_stream_->AddTrack(video_track_));
deadbeef70ab1a12015-09-28 16:53:55 -0700211 }
212
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700213 void CreateAudioRtpSender() { CreateAudioRtpSender(nullptr); }
214
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +0100215 void CreateAudioRtpSender(
216 const rtc::scoped_refptr<LocalAudioSource>& source) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700217 audio_track_ = AudioTrack::Create(kAudioTrackId, source);
Harald Alvestrand2f7ad282022-04-21 11:35:43 +0000218 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200219 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200220 std::make_unique<MockSetStreamsObserver>();
Steve Anton47136dd2018-01-12 10:49:35 -0800221 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200222 AudioRtpSender::Create(worker_thread_, audio_track_->id(), nullptr,
223 set_streams_observer.get());
Niels Möllerafb246b2022-04-20 14:26:50 +0200224 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_.get()));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200225 EXPECT_CALL(*set_streams_observer, OnSetStreams());
226 audio_rtp_sender_->SetStreams({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800227 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
deadbeeffac06552015-11-25 11:26:01 -0800228 audio_rtp_sender_->SetSsrc(kAudioSsrc);
deadbeef20cb0c12017-02-01 20:27:00 -0800229 audio_rtp_sender_->GetOnDestroyedSignal()->connect(
230 this, &RtpSenderReceiverTest::OnAudioSenderDestroyed);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700231 VerifyVoiceChannelInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700232 }
233
Steve Anton02ee47c2018-01-10 16:26:06 -0800234 void CreateAudioRtpSenderWithNoTrack() {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800235 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200236 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800237 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
Steve Anton02ee47c2018-01-10 16:26:06 -0800238 }
239
deadbeef20cb0c12017-02-01 20:27:00 -0800240 void OnAudioSenderDestroyed() { audio_sender_destroyed_signal_fired_ = true; }
241
Seth Hampson2d2c8882018-05-16 16:02:32 -0700242 void CreateVideoRtpSender(uint32_t ssrc) {
243 CreateVideoRtpSender(false, ssrc);
244 }
245
pbos5214a0a2016-12-16 15:39:11 -0800246 void CreateVideoRtpSender() { CreateVideoRtpSender(false); }
247
Amit Hilbuch2297d332019-02-19 12:49:22 -0800248 cricket::StreamParams CreateSimulcastStreamParams(int num_layers) {
Florent Castelli892acf02018-10-01 22:47:20 +0200249 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +0100250 ssrcs.reserve(num_layers);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800251 for (int i = 0; i < num_layers; ++i) {
Florent Castelli892acf02018-10-01 22:47:20 +0200252 ssrcs.push_back(kVideoSsrcSimulcast + i);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800253 }
254 return cricket::CreateSimStreamParams("cname", ssrcs);
255 }
256
257 uint32_t CreateVideoRtpSender(const cricket::StreamParams& stream_params) {
Florent Castelli892acf02018-10-01 22:47:20 +0200258 video_media_channel_->AddSendStream(stream_params);
259 uint32_t primary_ssrc = stream_params.first_ssrc();
260 CreateVideoRtpSender(primary_ssrc);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800261 return primary_ssrc;
262 }
263
264 uint32_t CreateVideoRtpSenderWithSimulcast(
265 int num_layers = kVideoSimulcastLayerCount) {
266 return CreateVideoRtpSender(CreateSimulcastStreamParams(num_layers));
267 }
268
269 uint32_t CreateVideoRtpSenderWithSimulcast(
270 const std::vector<std::string>& rids) {
271 cricket::StreamParams stream_params =
272 CreateSimulcastStreamParams(rids.size());
273 std::vector<cricket::RidDescription> rid_descriptions;
274 absl::c_transform(
275 rids, std::back_inserter(rid_descriptions), [](const std::string& rid) {
276 return cricket::RidDescription(rid, cricket::RidDirection::kSend);
277 });
278 stream_params.set_rids(rid_descriptions);
279 return CreateVideoRtpSender(stream_params);
Florent Castelli892acf02018-10-01 22:47:20 +0200280 }
281
Seth Hampson2d2c8882018-05-16 16:02:32 -0700282 void CreateVideoRtpSender(bool is_screencast, uint32_t ssrc = kVideoSsrc) {
pbos5214a0a2016-12-16 15:39:11 -0800283 AddVideoTrack(is_screencast);
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200284 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200285 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200286 video_rtp_sender_ = VideoRtpSender::Create(
287 worker_thread_, video_track_->id(), set_streams_observer.get());
Niels Möllerafb246b2022-04-20 14:26:50 +0200288 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200289 EXPECT_CALL(*set_streams_observer, OnSetStreams());
290 video_rtp_sender_->SetStreams({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800291 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Seth Hampson2d2c8882018-05-16 16:02:32 -0700292 video_rtp_sender_->SetSsrc(ssrc);
293 VerifyVideoChannelInput(ssrc);
deadbeef70ab1a12015-09-28 16:53:55 -0700294 }
Steve Anton02ee47c2018-01-10 16:26:06 -0800295 void CreateVideoRtpSenderWithNoTrack() {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200296 video_rtp_sender_ =
297 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800298 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Steve Anton02ee47c2018-01-10 16:26:06 -0800299 }
300
deadbeef70ab1a12015-09-28 16:53:55 -0700301 void DestroyAudioRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700302 audio_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700303 VerifyVoiceChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700304 }
305
306 void DestroyVideoRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700307 video_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700308 VerifyVideoChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700309 }
310
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100311 void CreateAudioRtpReceiver(
312 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
Tommi4ccdf932021-05-17 14:50:10 +0200313 audio_rtp_receiver_ = rtc::make_ref_counted<AudioRtpReceiver>(
314 rtc::Thread::Current(), kAudioTrackId, streams,
315 /*is_unified_plan=*/true);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800316 audio_rtp_receiver_->SetMediaChannel(voice_media_channel_);
Steve Antond3679212018-01-17 17:41:02 -0800317 audio_rtp_receiver_->SetupMediaChannel(kAudioSsrc);
perkjd61bf802016-03-24 03:16:19 -0700318 audio_track_ = audio_rtp_receiver_->audio_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700319 VerifyVoiceChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700320 }
321
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100322 void CreateVideoRtpReceiver(
323 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
Tommi4ccdf932021-05-17 14:50:10 +0200324 video_rtp_receiver_ = rtc::make_ref_counted<VideoRtpReceiver>(
325 rtc::Thread::Current(), kVideoTrackId, streams);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800326 video_rtp_receiver_->SetMediaChannel(video_media_channel_);
Steve Antond3679212018-01-17 17:41:02 -0800327 video_rtp_receiver_->SetupMediaChannel(kVideoSsrc);
perkjf0dcfe22016-03-10 18:32:00 +0100328 video_track_ = video_rtp_receiver_->video_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700329 VerifyVideoChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700330 }
331
Florent Castelli38332cd2018-11-20 14:08:06 +0100332 void CreateVideoRtpReceiverWithSimulcast(
333 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {},
334 int num_layers = kVideoSimulcastLayerCount) {
335 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +0100336 ssrcs.reserve(num_layers);
Florent Castelli38332cd2018-11-20 14:08:06 +0100337 for (int i = 0; i < num_layers; ++i)
338 ssrcs.push_back(kVideoSsrcSimulcast + i);
339 cricket::StreamParams stream_params =
340 cricket::CreateSimStreamParams("cname", ssrcs);
341 video_media_channel_->AddRecvStream(stream_params);
342 uint32_t primary_ssrc = stream_params.first_ssrc();
343
Tommi4ccdf932021-05-17 14:50:10 +0200344 video_rtp_receiver_ = rtc::make_ref_counted<VideoRtpReceiver>(
345 rtc::Thread::Current(), kVideoTrackId, streams);
Florent Castelli38332cd2018-11-20 14:08:06 +0100346 video_rtp_receiver_->SetMediaChannel(video_media_channel_);
347 video_rtp_receiver_->SetupMediaChannel(primary_ssrc);
348 video_track_ = video_rtp_receiver_->video_track();
349 }
350
deadbeef70ab1a12015-09-28 16:53:55 -0700351 void DestroyAudioRtpReceiver() {
Tommi4ccdf932021-05-17 14:50:10 +0200352 if (!audio_rtp_receiver_)
353 return;
Tommi6589def2022-02-17 23:36:47 +0100354 audio_rtp_receiver_->SetMediaChannel(nullptr);
deadbeef70ab1a12015-09-28 16:53:55 -0700355 audio_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700356 VerifyVoiceChannelNoOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700357 }
358
359 void DestroyVideoRtpReceiver() {
Tommi4ccdf932021-05-17 14:50:10 +0200360 if (!video_rtp_receiver_)
361 return;
362 video_rtp_receiver_->Stop();
Tommi6589def2022-02-17 23:36:47 +0100363 video_rtp_receiver_->SetMediaChannel(nullptr);
deadbeef70ab1a12015-09-28 16:53:55 -0700364 video_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700365 VerifyVideoChannelNoOutput();
366 }
367
368 void VerifyVoiceChannelInput() { VerifyVoiceChannelInput(kAudioSsrc); }
369
370 void VerifyVoiceChannelInput(uint32_t ssrc) {
371 // Verify that the media channel has an audio source, and the stream isn't
372 // muted.
373 EXPECT_TRUE(voice_media_channel_->HasSource(ssrc));
374 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(ssrc));
375 }
376
377 void VerifyVideoChannelInput() { VerifyVideoChannelInput(kVideoSsrc); }
378
379 void VerifyVideoChannelInput(uint32_t ssrc) {
380 // Verify that the media channel has a video source,
381 EXPECT_TRUE(video_media_channel_->HasSource(ssrc));
382 }
383
384 void VerifyVoiceChannelNoInput() { VerifyVoiceChannelNoInput(kAudioSsrc); }
385
386 void VerifyVoiceChannelNoInput(uint32_t ssrc) {
387 // Verify that the media channel's source is reset.
388 EXPECT_FALSE(voice_media_channel_->HasSource(ssrc));
389 }
390
391 void VerifyVideoChannelNoInput() { VerifyVideoChannelNoInput(kVideoSsrc); }
392
393 void VerifyVideoChannelNoInput(uint32_t ssrc) {
394 // Verify that the media channel's source is reset.
395 EXPECT_FALSE(video_media_channel_->HasSource(ssrc));
396 }
397
398 void VerifyVoiceChannelOutput() {
399 // Verify that the volume is initialized to 1.
400 double volume;
401 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
402 EXPECT_EQ(1, volume);
403 }
404
405 void VerifyVideoChannelOutput() {
406 // Verify that the media channel has a sink.
407 EXPECT_TRUE(video_media_channel_->HasSink(kVideoSsrc));
408 }
409
410 void VerifyVoiceChannelNoOutput() {
411 // Verify that the volume is reset to 0.
412 double volume;
413 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
414 EXPECT_EQ(0, volume);
415 }
416
417 void VerifyVideoChannelNoOutput() {
418 // Verify that the media channel's sink is reset.
419 EXPECT_FALSE(video_media_channel_->HasSink(kVideoSsrc));
deadbeef70ab1a12015-09-28 16:53:55 -0700420 }
421
Amit Hilbuch2297d332019-02-19 12:49:22 -0800422 // Verifies that the encoding layers contain the specified RIDs.
423 bool VerifyEncodingLayers(const VideoRtpSender& sender,
424 const std::vector<std::string>& rids) {
425 bool has_failure = HasFailure();
426 RtpParameters parameters = sender.GetParameters();
427 std::vector<std::string> encoding_rids;
428 absl::c_transform(
429 parameters.encodings, std::back_inserter(encoding_rids),
430 [](const RtpEncodingParameters& encoding) { return encoding.rid; });
431 EXPECT_THAT(rids, ContainerEq(encoding_rids));
432 return has_failure || !HasFailure();
433 }
434
435 // Runs a test for disabling the encoding layers on the specified sender.
436 void RunDisableEncodingLayersTest(
437 const std::vector<std::string>& all_layers,
438 const std::vector<std::string>& disabled_layers,
439 VideoRtpSender* sender) {
440 std::vector<std::string> expected;
441 absl::c_copy_if(all_layers, std::back_inserter(expected),
442 [&disabled_layers](const std::string& rid) {
443 return !absl::c_linear_search(disabled_layers, rid);
444 });
445
446 EXPECT_TRUE(VerifyEncodingLayers(*sender, all_layers));
447 sender->DisableEncodingLayers(disabled_layers);
448 EXPECT_TRUE(VerifyEncodingLayers(*sender, expected));
449 }
450
451 // Runs a test for setting an encoding layer as inactive.
452 // This test assumes that some layers have already been disabled.
453 void RunSetLastLayerAsInactiveTest(VideoRtpSender* sender) {
454 auto parameters = sender->GetParameters();
455 if (parameters.encodings.size() == 0) {
456 return;
457 }
458
459 RtpEncodingParameters& encoding = parameters.encodings.back();
460 auto rid = encoding.rid;
461 EXPECT_TRUE(encoding.active);
462 encoding.active = false;
463 auto error = sender->SetParameters(parameters);
464 ASSERT_TRUE(error.ok());
465 parameters = sender->GetParameters();
466 RtpEncodingParameters& result_encoding = parameters.encodings.back();
467 EXPECT_EQ(rid, result_encoding.rid);
468 EXPECT_FALSE(result_encoding.active);
469 }
470
471 // Runs a test for disabling the encoding layers on a sender without a media
472 // channel.
473 void RunDisableSimulcastLayersWithoutMediaEngineTest(
474 const std::vector<std::string>& all_layers,
475 const std::vector<std::string>& disabled_layers) {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200476 auto sender = VideoRtpSender::Create(rtc::Thread::Current(), "1", nullptr);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800477 RtpParameters parameters;
478 parameters.encodings.resize(all_layers.size());
479 for (size_t i = 0; i < all_layers.size(); ++i) {
480 parameters.encodings[i].rid = all_layers[i];
481 }
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800482 sender->set_init_send_encodings(parameters.encodings);
483 RunDisableEncodingLayersTest(all_layers, disabled_layers, sender.get());
484 RunSetLastLayerAsInactiveTest(sender.get());
Amit Hilbuch2297d332019-02-19 12:49:22 -0800485 }
486
487 // Runs a test for disabling the encoding layers on a sender with a media
488 // channel.
489 void RunDisableSimulcastLayersWithMediaEngineTest(
490 const std::vector<std::string>& all_layers,
491 const std::vector<std::string>& disabled_layers) {
492 uint32_t ssrc = CreateVideoRtpSenderWithSimulcast(all_layers);
493 RunDisableEncodingLayersTest(all_layers, disabled_layers,
494 video_rtp_sender_.get());
495
496 auto channel_parameters = video_media_channel_->GetRtpSendParameters(ssrc);
497 ASSERT_EQ(channel_parameters.encodings.size(), all_layers.size());
498 for (size_t i = 0; i < all_layers.size(); ++i) {
499 EXPECT_EQ(all_layers[i], channel_parameters.encodings[i].rid);
500 bool is_active = !absl::c_linear_search(disabled_layers, all_layers[i]);
501 EXPECT_EQ(is_active, channel_parameters.encodings[i].active);
502 }
503
504 RunSetLastLayerAsInactiveTest(video_rtp_sender_.get());
505 }
506
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200507 // Check that minimum Jitter Buffer delay is propagated to the underlying
Artem Titov880fa812021-07-30 22:30:23 +0200508 // `media_channel`.
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200509 void VerifyRtpReceiverDelayBehaviour(cricket::Delayable* media_channel,
510 RtpReceiverInterface* receiver,
511 uint32_t ssrc) {
512 receiver->SetJitterBufferMinimumDelay(/*delay_seconds=*/0.5);
513 absl::optional<int> delay_ms =
514 media_channel->GetBaseMinimumPlayoutDelayMs(ssrc); // In milliseconds.
515 EXPECT_DOUBLE_EQ(0.5, delay_ms.value_or(0) / 1000.0);
516 }
517
deadbeef70ab1a12015-09-28 16:53:55 -0700518 protected:
Tommi4ccdf932021-05-17 14:50:10 +0200519 test::RunLoop run_loop_;
Steve Anton47136dd2018-01-12 10:49:35 -0800520 rtc::Thread* const network_thread_;
521 rtc::Thread* const worker_thread_;
Danil Chapovalov83bbe912019-08-07 12:24:53 +0200522 webrtc::RtcEventLogNull event_log_;
Artem Titov880fa812021-07-30 22:30:23 +0200523 // The `rtp_dtls_transport_` and `rtp_transport_` should be destroyed after
524 // the `channel_manager`.
Zhi Huange830e682018-03-30 10:48:35 -0700525 std::unique_ptr<cricket::DtlsTransportInternal> rtp_dtls_transport_;
526 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport_;
Jonas Orelanda3aa9bd2019-04-17 07:38:40 +0200527 std::unique_ptr<webrtc::VideoBitrateAllocatorFactory>
528 video_bitrate_allocator_factory_;
Artem Titov880fa812021-07-30 22:30:23 +0200529 // `media_engine_` is actually owned by `channel_manager_`.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700530 cricket::FakeMediaEngine* media_engine_;
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200531 std::unique_ptr<cricket::ChannelManager> channel_manager_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700532 cricket::FakeCall fake_call_;
Harald Alvestrand3af79d12022-04-29 15:04:58 +0000533 std::unique_ptr<cricket::VoiceChannel> voice_channel_;
534 std::unique_ptr<cricket::VideoChannel> video_channel_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700535 cricket::FakeVoiceMediaChannel* voice_media_channel_;
536 cricket::FakeVideoMediaChannel* video_media_channel_;
deadbeef70ab1a12015-09-28 16:53:55 -0700537 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
538 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
539 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
540 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
deadbeefe814a0d2017-02-25 18:15:09 -0800541 rtc::scoped_refptr<MediaStreamInterface> local_stream_;
deadbeef70ab1a12015-09-28 16:53:55 -0700542 rtc::scoped_refptr<VideoTrackInterface> video_track_;
543 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
deadbeef20cb0c12017-02-01 20:27:00 -0800544 bool audio_sender_destroyed_signal_fired_ = false;
Jonas Orelanded99dae2022-03-09 09:28:10 +0100545 webrtc::test::ScopedKeyValueConfig field_trials_;
deadbeef70ab1a12015-09-28 16:53:55 -0700546};
547
Artem Titov880fa812021-07-30 22:30:23 +0200548// Test that `voice_channel_` is updated when an audio track is associated
deadbeef70ab1a12015-09-28 16:53:55 -0700549// and disassociated with an AudioRtpSender.
550TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
551 CreateAudioRtpSender();
552 DestroyAudioRtpSender();
553}
554
Artem Titov880fa812021-07-30 22:30:23 +0200555// Test that `video_channel_` is updated when a video track is associated and
deadbeef70ab1a12015-09-28 16:53:55 -0700556// disassociated with a VideoRtpSender.
557TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
558 CreateVideoRtpSender();
559 DestroyVideoRtpSender();
560}
561
Artem Titov880fa812021-07-30 22:30:23 +0200562// Test that `voice_channel_` is updated when a remote audio track is
deadbeef70ab1a12015-09-28 16:53:55 -0700563// associated and disassociated with an AudioRtpReceiver.
564TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
565 CreateAudioRtpReceiver();
566 DestroyAudioRtpReceiver();
567}
568
Artem Titov880fa812021-07-30 22:30:23 +0200569// Test that `video_channel_` is updated when a remote video track is
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700570// associated and disassociated with a VideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700571TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
572 CreateVideoRtpReceiver();
573 DestroyVideoRtpReceiver();
574}
575
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100576TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiverWithStreams) {
577 CreateAudioRtpReceiver({local_stream_});
578 DestroyAudioRtpReceiver();
579}
580
581TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiverWithStreams) {
582 CreateVideoRtpReceiver({local_stream_});
583 DestroyVideoRtpReceiver();
584}
585
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700586// Test that the AudioRtpSender applies options from the local audio source.
587TEST_F(RtpSenderReceiverTest, LocalAudioSourceOptionsApplied) {
588 cricket::AudioOptions options;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100589 options.echo_cancellation = true;
deadbeef757146b2017-02-10 21:26:48 -0800590 auto source = LocalAudioSource::Create(&options);
Niels Möllere7cc8832022-01-04 15:20:03 +0100591 CreateAudioRtpSender(source);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700592
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100593 EXPECT_EQ(true, voice_media_channel_->options().echo_cancellation);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700594
595 DestroyAudioRtpSender();
596}
597
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700598// Test that the stream is muted when the track is disabled, and unmuted when
599// the track is enabled.
600TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) {
601 CreateAudioRtpSender();
602
603 audio_track_->set_enabled(false);
604 EXPECT_TRUE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
605
606 audio_track_->set_enabled(true);
607 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
608
609 DestroyAudioRtpSender();
610}
611
612// Test that the volume is set to 0 when the track is disabled, and back to
613// 1 when the track is enabled.
deadbeef70ab1a12015-09-28 16:53:55 -0700614TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
615 CreateAudioRtpReceiver();
616
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700617 double volume;
618 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
619 EXPECT_EQ(1, volume);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700620
Tommi4ccdf932021-05-17 14:50:10 +0200621 // Handling of enable/disable is applied asynchronously.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700622 audio_track_->set_enabled(false);
Tommi4ccdf932021-05-17 14:50:10 +0200623 run_loop_.Flush();
624
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700625 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
626 EXPECT_EQ(0, volume);
627
deadbeef70ab1a12015-09-28 16:53:55 -0700628 audio_track_->set_enabled(true);
Tommi4ccdf932021-05-17 14:50:10 +0200629 run_loop_.Flush();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700630 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
631 EXPECT_EQ(1, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700632
633 DestroyAudioRtpReceiver();
634}
635
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700636// Currently no action is taken when a remote video track is disabled or
637// enabled, so there's nothing to test here, other than what is normally
638// verified in DestroyVideoRtpSender.
deadbeef70ab1a12015-09-28 16:53:55 -0700639TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
640 CreateVideoRtpSender();
641
deadbeef70ab1a12015-09-28 16:53:55 -0700642 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700643 video_track_->set_enabled(true);
644
645 DestroyVideoRtpSender();
646}
647
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700648// Test that the state of the video track created by the VideoRtpReceiver is
649// updated when the receiver is destroyed.
perkjf0dcfe22016-03-10 18:32:00 +0100650TEST_F(RtpSenderReceiverTest, RemoteVideoTrackState) {
651 CreateVideoRtpReceiver();
652
653 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track_->state());
654 EXPECT_EQ(webrtc::MediaSourceInterface::kLive,
655 video_track_->GetSource()->state());
656
657 DestroyVideoRtpReceiver();
658
659 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track_->state());
660 EXPECT_EQ(webrtc::MediaSourceInterface::kEnded,
661 video_track_->GetSource()->state());
Tommi4ccdf932021-05-17 14:50:10 +0200662 DestroyVideoRtpReceiver();
perkjf0dcfe22016-03-10 18:32:00 +0100663}
664
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700665// Currently no action is taken when a remote video track is disabled or
666// enabled, so there's nothing to test here, other than what is normally
667// verified in DestroyVideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700668TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
669 CreateVideoRtpReceiver();
670
671 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700672 video_track_->set_enabled(true);
673
674 DestroyVideoRtpReceiver();
675}
676
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700677// Test that the AudioRtpReceiver applies volume changes from the track source
678// to the media channel.
deadbeef70ab1a12015-09-28 16:53:55 -0700679TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
680 CreateAudioRtpReceiver();
681
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700682 double volume;
683 audio_track_->GetSource()->SetVolume(0.5);
Tommi4ccdf932021-05-17 14:50:10 +0200684 run_loop_.Flush();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700685 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
686 EXPECT_EQ(0.5, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700687
688 // Disable the audio track, this should prevent setting the volume.
deadbeef70ab1a12015-09-28 16:53:55 -0700689 audio_track_->set_enabled(false);
Tommi4ccdf932021-05-17 14:50:10 +0200690 RTC_DCHECK_EQ(worker_thread_, run_loop_.task_queue());
691 run_loop_.Flush();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700692 audio_track_->GetSource()->SetVolume(0.8);
693 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
694 EXPECT_EQ(0, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700695
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700696 // When the track is enabled, the previously set volume should take effect.
deadbeef70ab1a12015-09-28 16:53:55 -0700697 audio_track_->set_enabled(true);
Tommi4ccdf932021-05-17 14:50:10 +0200698 run_loop_.Flush();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700699 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
700 EXPECT_EQ(0.8, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700701
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700702 // Try changing volume one more time.
703 audio_track_->GetSource()->SetVolume(0.9);
Tommi4ccdf932021-05-17 14:50:10 +0200704 run_loop_.Flush();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700705 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
706 EXPECT_EQ(0.9, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700707
708 DestroyAudioRtpReceiver();
709}
710
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200711TEST_F(RtpSenderReceiverTest, AudioRtpReceiverDelay) {
712 CreateAudioRtpReceiver();
713 VerifyRtpReceiverDelayBehaviour(voice_media_channel_,
714 audio_rtp_receiver_.get(), kAudioSsrc);
Tommi4ccdf932021-05-17 14:50:10 +0200715 DestroyAudioRtpReceiver();
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200716}
717
718TEST_F(RtpSenderReceiverTest, VideoRtpReceiverDelay) {
719 CreateVideoRtpReceiver();
720 VerifyRtpReceiverDelayBehaviour(video_media_channel_,
721 video_rtp_receiver_.get(), kVideoSsrc);
Tommi4ccdf932021-05-17 14:50:10 +0200722 DestroyVideoRtpReceiver();
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200723}
724
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700725// Test that the media channel isn't enabled for sending if the audio sender
726// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800727TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800728 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800729 rtc::scoped_refptr<AudioTrackInterface> track =
730 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700731
732 // Track but no SSRC.
Niels Möllerafb246b2022-04-20 14:26:50 +0200733 EXPECT_TRUE(audio_rtp_sender_->SetTrack(track.get()));
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700734 VerifyVoiceChannelNoInput();
735
736 // SSRC but no track.
737 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
738 audio_rtp_sender_->SetSsrc(kAudioSsrc);
739 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800740}
741
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700742// Test that the media channel isn't enabled for sending if the video sender
743// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800744TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800745 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700746
747 // Track but no SSRC.
Niels Möllerafb246b2022-04-20 14:26:50 +0200748 EXPECT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700749 VerifyVideoChannelNoInput();
750
751 // SSRC but no track.
752 EXPECT_TRUE(video_rtp_sender_->SetTrack(nullptr));
753 video_rtp_sender_->SetSsrc(kVideoSsrc);
754 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800755}
756
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700757// Test that the media channel is enabled for sending when the audio sender
758// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800759TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800760 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800761 rtc::scoped_refptr<AudioTrackInterface> track =
762 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700763 audio_rtp_sender_->SetSsrc(kAudioSsrc);
Niels Möllerafb246b2022-04-20 14:26:50 +0200764 audio_rtp_sender_->SetTrack(track.get());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700765 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800766
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700767 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800768}
769
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700770// Test that the media channel is enabled for sending when the audio sender
771// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800772TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800773 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800774 rtc::scoped_refptr<AudioTrackInterface> track =
775 AudioTrack::Create(kAudioTrackId, nullptr);
Niels Möllerafb246b2022-04-20 14:26:50 +0200776 audio_rtp_sender_->SetTrack(track.get());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700777 audio_rtp_sender_->SetSsrc(kAudioSsrc);
778 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800779
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700780 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800781}
782
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700783// Test that the media channel is enabled for sending when the video sender
784// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800785TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
nisseaf510af2016-03-21 08:20:42 -0700786 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800787 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700788 video_rtp_sender_->SetSsrc(kVideoSsrc);
Niels Möllerafb246b2022-04-20 14:26:50 +0200789 video_rtp_sender_->SetTrack(video_track_.get());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700790 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800791
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700792 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800793}
794
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700795// Test that the media channel is enabled for sending when the video sender
796// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800797TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
nisseaf510af2016-03-21 08:20:42 -0700798 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800799 CreateVideoRtpSenderWithNoTrack();
Niels Möllerafb246b2022-04-20 14:26:50 +0200800 video_rtp_sender_->SetTrack(video_track_.get());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700801 video_rtp_sender_->SetSsrc(kVideoSsrc);
802 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800803
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700804 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800805}
806
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700807// Test that the media channel stops sending when the audio sender's SSRC is set
808// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800809TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700810 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800811
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700812 audio_rtp_sender_->SetSsrc(0);
813 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800814}
815
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700816// Test that the media channel stops sending when the video sender's SSRC is set
817// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800818TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700819 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800820
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700821 audio_rtp_sender_->SetSsrc(0);
822 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800823}
824
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700825// Test that the media channel stops sending when the audio sender's track is
826// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800827TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700828 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800829
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700830 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
831 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800832}
833
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700834// Test that the media channel stops sending when the video sender's track is
835// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800836TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700837 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800838
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700839 video_rtp_sender_->SetSsrc(0);
840 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800841}
842
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700843// Test that when the audio sender's SSRC is changed, the media channel stops
844// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800845TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700846 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800847
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700848 audio_rtp_sender_->SetSsrc(kAudioSsrc2);
849 VerifyVoiceChannelNoInput(kAudioSsrc);
850 VerifyVoiceChannelInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800851
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700852 audio_rtp_sender_ = nullptr;
853 VerifyVoiceChannelNoInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800854}
855
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700856// Test that when the audio sender's SSRC is changed, the media channel stops
857// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800858TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700859 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800860
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700861 video_rtp_sender_->SetSsrc(kVideoSsrc2);
862 VerifyVideoChannelNoInput(kVideoSsrc);
863 VerifyVideoChannelInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800864
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700865 video_rtp_sender_ = nullptr;
866 VerifyVideoChannelNoInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800867}
868
skvladdc1c62c2016-03-16 19:07:43 -0700869TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) {
870 CreateAudioRtpSender();
871
skvladdc1c62c2016-03-16 19:07:43 -0700872 RtpParameters params = audio_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700873 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -0800874 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -0700875
876 DestroyAudioRtpSender();
877}
878
Florent Castelli892acf02018-10-01 22:47:20 +0200879TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParametersBeforeNegotiation) {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800880 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200881 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +0200882
883 RtpParameters params = audio_rtp_sender_->GetParameters();
884 ASSERT_EQ(1u, params.encodings.size());
885 params.encodings[0].max_bitrate_bps = 90000;
886 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
887
888 params = audio_rtp_sender_->GetParameters();
889 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
890 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
891
892 DestroyAudioRtpSender();
893}
894
895TEST_F(RtpSenderReceiverTest, AudioSenderInitParametersMovedAfterNegotiation) {
896 audio_track_ = AudioTrack::Create(kAudioTrackId, nullptr);
Harald Alvestrand2f7ad282022-04-21 11:35:43 +0000897 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
Florent Castelli892acf02018-10-01 22:47:20 +0200898
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200899 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200900 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200901 audio_rtp_sender_ = AudioRtpSender::Create(
902 worker_thread_, audio_track_->id(), nullptr, set_streams_observer.get());
Niels Möllerafb246b2022-04-20 14:26:50 +0200903 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_.get()));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200904 EXPECT_CALL(*set_streams_observer, OnSetStreams());
905 audio_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli892acf02018-10-01 22:47:20 +0200906
907 std::vector<RtpEncodingParameters> init_encodings(1);
908 init_encodings[0].max_bitrate_bps = 60000;
909 audio_rtp_sender_->set_init_send_encodings(init_encodings);
910
911 RtpParameters params = audio_rtp_sender_->GetParameters();
912 ASSERT_EQ(1u, params.encodings.size());
913 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
914
915 // Simulate the setLocalDescription call
916 std::vector<uint32_t> ssrcs(1, 1);
917 cricket::StreamParams stream_params =
918 cricket::CreateSimStreamParams("cname", ssrcs);
919 voice_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800920 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +0200921 audio_rtp_sender_->SetSsrc(1);
922
923 params = audio_rtp_sender_->GetParameters();
924 ASSERT_EQ(1u, params.encodings.size());
925 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
926
927 DestroyAudioRtpSender();
928}
929
930TEST_F(RtpSenderReceiverTest,
931 AudioSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800932 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200933 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +0200934
935 RtpParameters params;
936 RTCError result = audio_rtp_sender_->SetParameters(params);
937 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
938 DestroyAudioRtpSender();
939}
940
Florent Castellicebf50f2018-05-03 15:31:53 +0200941TEST_F(RtpSenderReceiverTest,
942 AudioSenderMustCallGetParametersBeforeSetParameters) {
943 CreateAudioRtpSender();
944
945 RtpParameters params;
946 RTCError result = audio_rtp_sender_->SetParameters(params);
947 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
948
949 DestroyAudioRtpSender();
950}
951
952TEST_F(RtpSenderReceiverTest,
953 AudioSenderSetParametersInvalidatesTransactionId) {
954 CreateAudioRtpSender();
955
956 RtpParameters params = audio_rtp_sender_->GetParameters();
957 EXPECT_EQ(1u, params.encodings.size());
958 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
959 RTCError result = audio_rtp_sender_->SetParameters(params);
960 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
961
962 DestroyAudioRtpSender();
963}
964
965TEST_F(RtpSenderReceiverTest, AudioSenderDetectTransactionIdModification) {
966 CreateAudioRtpSender();
967
968 RtpParameters params = audio_rtp_sender_->GetParameters();
969 params.transaction_id = "";
970 RTCError result = audio_rtp_sender_->SetParameters(params);
971 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
972
973 DestroyAudioRtpSender();
974}
975
976TEST_F(RtpSenderReceiverTest, AudioSenderCheckTransactionIdRefresh) {
977 CreateAudioRtpSender();
978
979 RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200980 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 15:31:53 +0200981 auto saved_transaction_id = params.transaction_id;
982 params = audio_rtp_sender_->GetParameters();
983 EXPECT_NE(saved_transaction_id, params.transaction_id);
984
985 DestroyAudioRtpSender();
986}
987
988TEST_F(RtpSenderReceiverTest, AudioSenderSetParametersOldValueFail) {
989 CreateAudioRtpSender();
990
991 RtpParameters params = audio_rtp_sender_->GetParameters();
992 RtpParameters second_params = audio_rtp_sender_->GetParameters();
993
994 RTCError result = audio_rtp_sender_->SetParameters(params);
995 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
Seth Hampson2d2c8882018-05-16 16:02:32 -0700996 DestroyAudioRtpSender();
997}
998
999TEST_F(RtpSenderReceiverTest, AudioSenderCantSetUnimplementedRtpParameters) {
1000 CreateAudioRtpSender();
1001 RtpParameters params = audio_rtp_sender_->GetParameters();
1002 EXPECT_EQ(1u, params.encodings.size());
1003
Florent Castelli87b3c512018-07-18 16:00:28 +02001004 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 16:02:32 -07001005 params.mid = "dummy_mid";
1006 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1007 audio_rtp_sender_->SetParameters(params).type());
1008 params = audio_rtp_sender_->GetParameters();
1009
Seth Hampson2d2c8882018-05-16 16:02:32 -07001010 DestroyAudioRtpSender();
1011}
1012
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001013TEST_F(RtpSenderReceiverTest, SetAudioMaxSendBitrate) {
1014 CreateAudioRtpSender();
1015
1016 EXPECT_EQ(-1, voice_media_channel_->max_bps());
1017 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001018 EXPECT_EQ(1U, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -08001019 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001020 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -08001021 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001022
1023 // Read back the parameters and verify they have been changed.
1024 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001025 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001026 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001027
1028 // Verify that the audio channel received the new parameters.
1029 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001030 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001031 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001032
1033 // Verify that the global bitrate limit has not been changed.
1034 EXPECT_EQ(-1, voice_media_channel_->max_bps());
1035
1036 DestroyAudioRtpSender();
1037}
1038
Seth Hampson24722b32017-12-22 09:36:42 -08001039TEST_F(RtpSenderReceiverTest, SetAudioBitratePriority) {
1040 CreateAudioRtpSender();
1041
1042 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001043 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001044 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1045 params.encodings[0].bitrate_priority);
1046 double new_bitrate_priority = 2.0;
1047 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -08001048 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -08001049
1050 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001051 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001052 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1053
1054 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001055 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001056 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1057
1058 DestroyAudioRtpSender();
1059}
1060
skvladdc1c62c2016-03-16 19:07:43 -07001061TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) {
1062 CreateVideoRtpSender();
1063
skvladdc1c62c2016-03-16 19:07:43 -07001064 RtpParameters params = video_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001065 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -08001066 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -07001067
1068 DestroyVideoRtpSender();
1069}
1070
Florent Castelli892acf02018-10-01 22:47:20 +02001071TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParametersBeforeNegotiation) {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001072 video_rtp_sender_ =
1073 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +02001074
1075 RtpParameters params = video_rtp_sender_->GetParameters();
1076 ASSERT_EQ(1u, params.encodings.size());
1077 params.encodings[0].max_bitrate_bps = 90000;
1078 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1079
1080 params = video_rtp_sender_->GetParameters();
1081 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1082 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
1083
1084 DestroyVideoRtpSender();
1085}
1086
1087TEST_F(RtpSenderReceiverTest, VideoSenderInitParametersMovedAfterNegotiation) {
1088 AddVideoTrack(false);
1089
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001090 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001091 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001092 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1093 set_streams_observer.get());
Niels Möllerafb246b2022-04-20 14:26:50 +02001094 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001095 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1096 video_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli892acf02018-10-01 22:47:20 +02001097
1098 std::vector<RtpEncodingParameters> init_encodings(2);
1099 init_encodings[0].max_bitrate_bps = 60000;
1100 init_encodings[1].max_bitrate_bps = 900000;
1101 video_rtp_sender_->set_init_send_encodings(init_encodings);
1102
1103 RtpParameters params = video_rtp_sender_->GetParameters();
1104 ASSERT_EQ(2u, params.encodings.size());
1105 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1106 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
1107
1108 // Simulate the setLocalDescription call
1109 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +01001110 ssrcs.reserve(2);
Florent Castelli892acf02018-10-01 22:47:20 +02001111 for (int i = 0; i < 2; ++i)
1112 ssrcs.push_back(kVideoSsrcSimulcast + i);
1113 cricket::StreamParams stream_params =
1114 cricket::CreateSimStreamParams("cname", ssrcs);
1115 video_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -08001116 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +02001117 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
1118
1119 params = video_rtp_sender_->GetParameters();
1120 ASSERT_EQ(2u, params.encodings.size());
1121 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1122 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
1123
1124 DestroyVideoRtpSender();
1125}
1126
1127TEST_F(RtpSenderReceiverTest,
1128 VideoSenderInitParametersMovedAfterManualSimulcastAndNegotiation) {
1129 AddVideoTrack(false);
1130
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001131 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001132 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001133 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1134 set_streams_observer.get());
Niels Möllerafb246b2022-04-20 14:26:50 +02001135 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001136 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1137 video_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli892acf02018-10-01 22:47:20 +02001138
1139 std::vector<RtpEncodingParameters> init_encodings(1);
1140 init_encodings[0].max_bitrate_bps = 60000;
1141 video_rtp_sender_->set_init_send_encodings(init_encodings);
1142
1143 RtpParameters params = video_rtp_sender_->GetParameters();
1144 ASSERT_EQ(1u, params.encodings.size());
1145 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1146
1147 // Simulate the setLocalDescription call as if the user used SDP munging
1148 // to enable simulcast
1149 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +01001150 ssrcs.reserve(2);
Florent Castelli892acf02018-10-01 22:47:20 +02001151 for (int i = 0; i < 2; ++i)
1152 ssrcs.push_back(kVideoSsrcSimulcast + i);
1153 cricket::StreamParams stream_params =
1154 cricket::CreateSimStreamParams("cname", ssrcs);
1155 video_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -08001156 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +02001157 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
1158
1159 params = video_rtp_sender_->GetParameters();
1160 ASSERT_EQ(2u, params.encodings.size());
1161 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1162
1163 DestroyVideoRtpSender();
1164}
1165
1166TEST_F(RtpSenderReceiverTest,
1167 VideoSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001168 video_rtp_sender_ =
1169 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +02001170
1171 RtpParameters params;
1172 RTCError result = video_rtp_sender_->SetParameters(params);
1173 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1174 DestroyVideoRtpSender();
1175}
1176
Florent Castellicebf50f2018-05-03 15:31:53 +02001177TEST_F(RtpSenderReceiverTest,
1178 VideoSenderMustCallGetParametersBeforeSetParameters) {
1179 CreateVideoRtpSender();
1180
1181 RtpParameters params;
1182 RTCError result = video_rtp_sender_->SetParameters(params);
1183 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1184
1185 DestroyVideoRtpSender();
1186}
1187
1188TEST_F(RtpSenderReceiverTest,
1189 VideoSenderSetParametersInvalidatesTransactionId) {
1190 CreateVideoRtpSender();
1191
1192 RtpParameters params = video_rtp_sender_->GetParameters();
1193 EXPECT_EQ(1u, params.encodings.size());
1194 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1195 RTCError result = video_rtp_sender_->SetParameters(params);
1196 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1197
1198 DestroyVideoRtpSender();
1199}
1200
1201TEST_F(RtpSenderReceiverTest, VideoSenderDetectTransactionIdModification) {
1202 CreateVideoRtpSender();
1203
1204 RtpParameters params = video_rtp_sender_->GetParameters();
1205 params.transaction_id = "";
1206 RTCError result = video_rtp_sender_->SetParameters(params);
1207 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1208
1209 DestroyVideoRtpSender();
1210}
1211
1212TEST_F(RtpSenderReceiverTest, VideoSenderCheckTransactionIdRefresh) {
1213 CreateVideoRtpSender();
1214
1215 RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001216 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 15:31:53 +02001217 auto saved_transaction_id = params.transaction_id;
1218 params = video_rtp_sender_->GetParameters();
1219 EXPECT_NE(saved_transaction_id, params.transaction_id);
1220
1221 DestroyVideoRtpSender();
1222}
1223
1224TEST_F(RtpSenderReceiverTest, VideoSenderSetParametersOldValueFail) {
1225 CreateVideoRtpSender();
1226
1227 RtpParameters params = video_rtp_sender_->GetParameters();
1228 RtpParameters second_params = video_rtp_sender_->GetParameters();
1229
1230 RTCError result = video_rtp_sender_->SetParameters(params);
1231 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1232
1233 DestroyVideoRtpSender();
1234}
1235
Seth Hampson2d2c8882018-05-16 16:02:32 -07001236TEST_F(RtpSenderReceiverTest, VideoSenderCantSetUnimplementedRtpParameters) {
1237 CreateVideoRtpSender();
1238 RtpParameters params = video_rtp_sender_->GetParameters();
1239 EXPECT_EQ(1u, params.encodings.size());
1240
Florent Castelli87b3c512018-07-18 16:00:28 +02001241 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 16:02:32 -07001242 params.mid = "dummy_mid";
1243 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1244 video_rtp_sender_->SetParameters(params).type());
1245 params = video_rtp_sender_->GetParameters();
1246
Seth Hampson2d2c8882018-05-16 16:02:32 -07001247 DestroyVideoRtpSender();
1248}
1249
Florent Castellic1a0bcb2019-01-29 14:26:48 +01001250TEST_F(RtpSenderReceiverTest, VideoSenderCanSetScaleResolutionDownBy) {
1251 CreateVideoRtpSender();
1252
1253 RtpParameters params = video_rtp_sender_->GetParameters();
1254 params.encodings[0].scale_resolution_down_by = 2;
1255
1256 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1257 params = video_rtp_sender_->GetParameters();
1258 EXPECT_EQ(2, params.encodings[0].scale_resolution_down_by);
1259
1260 DestroyVideoRtpSender();
1261}
1262
1263TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidScaleResolutionDownBy) {
1264 CreateVideoRtpSender();
1265
1266 RtpParameters params = video_rtp_sender_->GetParameters();
1267 params.encodings[0].scale_resolution_down_by = 0.5;
1268 RTCError result = video_rtp_sender_->SetParameters(params);
1269 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1270
1271 DestroyVideoRtpSender();
1272}
1273
Ă…sa Perssonfb195962021-08-16 16:41:56 +02001274TEST_F(RtpSenderReceiverTest, VideoSenderCanSetNumTemporalLayers) {
1275 CreateVideoRtpSender();
1276
1277 RtpParameters params = video_rtp_sender_->GetParameters();
1278 params.encodings[0].num_temporal_layers = 2;
1279
1280 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1281 params = video_rtp_sender_->GetParameters();
1282 EXPECT_EQ(2, params.encodings[0].num_temporal_layers);
1283
1284 DestroyVideoRtpSender();
1285}
1286
1287TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidNumTemporalLayers) {
1288 CreateVideoRtpSender();
1289
1290 RtpParameters params = video_rtp_sender_->GetParameters();
1291 params.encodings[0].num_temporal_layers = webrtc::kMaxTemporalStreams + 1;
1292 RTCError result = video_rtp_sender_->SetParameters(params);
1293 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1294
1295 DestroyVideoRtpSender();
1296}
1297
Florent Castelli907dc802019-12-06 15:03:19 +01001298TEST_F(RtpSenderReceiverTest, VideoSenderCanSetMaxFramerate) {
1299 CreateVideoRtpSender();
1300
1301 RtpParameters params = video_rtp_sender_->GetParameters();
1302 params.encodings[0].max_framerate = 20;
1303
1304 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1305 params = video_rtp_sender_->GetParameters();
1306 EXPECT_EQ(20., params.encodings[0].max_framerate);
1307
1308 DestroyVideoRtpSender();
1309}
1310
1311TEST_F(RtpSenderReceiverTest, VideoSenderCanSetMaxFramerateZero) {
1312 CreateVideoRtpSender();
1313
1314 RtpParameters params = video_rtp_sender_->GetParameters();
1315 params.encodings[0].max_framerate = 0.;
1316
1317 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1318 params = video_rtp_sender_->GetParameters();
1319 EXPECT_EQ(0., params.encodings[0].max_framerate);
1320
1321 DestroyVideoRtpSender();
1322}
1323
1324TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidMaxFramerate) {
1325 CreateVideoRtpSender();
1326
1327 RtpParameters params = video_rtp_sender_->GetParameters();
1328 params.encodings[0].max_framerate = -5.;
1329 RTCError result = video_rtp_sender_->SetParameters(params);
1330 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1331
1332 DestroyVideoRtpSender();
1333}
1334
Seth Hampson2d2c8882018-05-16 16:02:32 -07001335// A video sender can have multiple simulcast layers, in which case it will
1336// contain multiple RtpEncodingParameters. This tests that if this is the case
1337// (simulcast), then we can't set the bitrate_priority, or max_bitrate_bps
1338// for any encodings besides at index 0, because these are both implemented
1339// "per-sender."
1340TEST_F(RtpSenderReceiverTest, VideoSenderCantSetPerSenderEncodingParameters) {
1341 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001342 CreateVideoRtpSenderWithSimulcast();
Seth Hampson2d2c8882018-05-16 16:02:32 -07001343 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001344 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Seth Hampson2d2c8882018-05-16 16:02:32 -07001345
1346 params.encodings[1].bitrate_priority = 2.0;
1347 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1348 video_rtp_sender_->SetParameters(params).type());
1349 params = video_rtp_sender_->GetParameters();
1350
Seth Hampson2d2c8882018-05-16 16:02:32 -07001351 DestroyVideoRtpSender();
1352}
1353
Florent Castelli892acf02018-10-01 22:47:20 +02001354TEST_F(RtpSenderReceiverTest, VideoSenderCantSetReadOnlyEncodingParameters) {
1355 // Add a simulcast specific send stream that contains 2 encoding parameters.
1356 CreateVideoRtpSenderWithSimulcast();
1357 RtpParameters params = video_rtp_sender_->GetParameters();
1358 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
1359
1360 for (size_t i = 0; i < params.encodings.size(); i++) {
1361 params.encodings[i].ssrc = 1337;
1362 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION,
1363 video_rtp_sender_->SetParameters(params).type());
1364 params = video_rtp_sender_->GetParameters();
1365 }
1366
1367 DestroyVideoRtpSender();
1368}
1369
Ă…sa Persson55659812018-06-18 17:51:32 +02001370TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrate) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001371 CreateVideoRtpSender();
1372
1373 EXPECT_EQ(-1, video_media_channel_->max_bps());
1374 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001375 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001376 EXPECT_FALSE(params.encodings[0].min_bitrate_bps);
deadbeefe702b302017-02-04 12:09:01 -08001377 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Ă…sa Persson55659812018-06-18 17:51:32 +02001378 params.encodings[0].min_bitrate_bps = 100;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001379 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -08001380 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001381
1382 // Read back the parameters and verify they have been changed.
1383 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001384 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001385 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001386 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001387
1388 // Verify that the video channel received the new parameters.
1389 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001390 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001391 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001392 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001393
1394 // Verify that the global bitrate limit has not been changed.
1395 EXPECT_EQ(-1, video_media_channel_->max_bps());
1396
1397 DestroyVideoRtpSender();
1398}
1399
Ă…sa Persson55659812018-06-18 17:51:32 +02001400TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrateSimulcast) {
1401 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001402 CreateVideoRtpSenderWithSimulcast();
Ă…sa Persson55659812018-06-18 17:51:32 +02001403
1404 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001405 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001406 params.encodings[0].min_bitrate_bps = 100;
1407 params.encodings[0].max_bitrate_bps = 1000;
1408 params.encodings[1].min_bitrate_bps = 200;
1409 params.encodings[1].max_bitrate_bps = 2000;
1410 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1411
1412 // Verify that the video channel received the new parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001413 params = video_media_channel_->GetRtpSendParameters(kVideoSsrcSimulcast);
1414 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001415 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
1416 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
1417 EXPECT_EQ(200, params.encodings[1].min_bitrate_bps);
1418 EXPECT_EQ(2000, params.encodings[1].max_bitrate_bps);
1419
1420 DestroyVideoRtpSender();
1421}
1422
Seth Hampson24722b32017-12-22 09:36:42 -08001423TEST_F(RtpSenderReceiverTest, SetVideoBitratePriority) {
1424 CreateVideoRtpSender();
1425
1426 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001427 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001428 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1429 params.encodings[0].bitrate_priority);
1430 double new_bitrate_priority = 2.0;
1431 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -08001432 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -08001433
1434 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001435 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001436 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1437
1438 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001439 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001440 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1441
1442 DestroyVideoRtpSender();
1443}
1444
Florent Castelli38332cd2018-11-20 14:08:06 +01001445TEST_F(RtpSenderReceiverTest, VideoReceiverCanGetParametersWithSimulcast) {
1446 CreateVideoRtpReceiverWithSimulcast({}, 2);
1447
1448 RtpParameters params = video_rtp_receiver_->GetParameters();
1449 EXPECT_EQ(2u, params.encodings.size());
1450
1451 DestroyVideoRtpReceiver();
1452}
1453
pbos5214a0a2016-12-16 15:39:11 -08001454// Test that makes sure that a video track content hint translates to the proper
1455// value for sources that are not screencast.
1456TEST_F(RtpSenderReceiverTest, PropagatesVideoTrackContentHint) {
1457 CreateVideoRtpSender();
1458
1459 video_track_->set_enabled(true);
1460
Artem Titov880fa812021-07-30 22:30:23 +02001461 // `video_track_` is not screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001462 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001463 // No content hint should be set by default.
1464 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1465 video_track_->content_hint());
1466 // Setting detailed should turn a non-screencast source into screencast mode.
1467 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001468 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001469 // Removing the content hint should turn the track back into non-screencast
1470 // mode.
1471 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001472 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001473 // Setting fluid should remain in non-screencast mode (its default).
1474 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001475 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 08:53:10 +02001476 // Setting text should have the same effect as Detailed
1477 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
1478 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001479
1480 DestroyVideoRtpSender();
1481}
1482
1483// Test that makes sure that a video track content hint translates to the proper
1484// value for screencast sources.
1485TEST_F(RtpSenderReceiverTest,
1486 PropagatesVideoTrackContentHintForScreencastSource) {
1487 CreateVideoRtpSender(true);
1488
1489 video_track_->set_enabled(true);
1490
Artem Titov880fa812021-07-30 22:30:23 +02001491 // `video_track_` with a screencast source should be screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001492 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001493 // No content hint should be set by default.
1494 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1495 video_track_->content_hint());
1496 // Setting fluid should turn a screencast source into non-screencast mode.
1497 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001498 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001499 // Removing the content hint should turn the track back into screencast mode.
1500 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001501 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001502 // Setting detailed should still remain in screencast mode (its default).
1503 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001504 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 08:53:10 +02001505 // Setting text should have the same effect as Detailed
1506 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
1507 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001508
1509 DestroyVideoRtpSender();
1510}
1511
1512// Test that makes sure any content hints that are set on a track before
1513// VideoRtpSender is ready to send are still applied when it gets ready to send.
1514TEST_F(RtpSenderReceiverTest,
1515 PropagatesVideoTrackContentHintSetBeforeEnabling) {
1516 AddVideoTrack();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001517 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001518 std::make_unique<MockSetStreamsObserver>();
pbos5214a0a2016-12-16 15:39:11 -08001519 // Setting detailed overrides the default non-screencast mode. This should be
1520 // applied even if the track is set on construction.
1521 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001522 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1523 set_streams_observer.get());
Niels Möllerafb246b2022-04-20 14:26:50 +02001524 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001525 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1526 video_rtp_sender_->SetStreams({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -08001527 video_rtp_sender_->SetMediaChannel(video_media_channel_);
pbos5214a0a2016-12-16 15:39:11 -08001528 video_track_->set_enabled(true);
1529
1530 // Sender is not ready to send (no SSRC) so no option should have been set.
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001531 EXPECT_EQ(absl::nullopt, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001532
1533 // Verify that the content hint is accounted for when video_rtp_sender_ does
1534 // get enabled.
1535 video_rtp_sender_->SetSsrc(kVideoSsrc);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001536 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001537
1538 // And removing the hint should go back to false (to verify that false was
1539 // default correctly).
1540 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001541 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001542
1543 DestroyVideoRtpSender();
1544}
1545
deadbeef20cb0c12017-02-01 20:27:00 -08001546TEST_F(RtpSenderReceiverTest, AudioSenderHasDtmfSender) {
1547 CreateAudioRtpSender();
1548 EXPECT_NE(nullptr, audio_rtp_sender_->GetDtmfSender());
1549}
1550
1551TEST_F(RtpSenderReceiverTest, VideoSenderDoesNotHaveDtmfSender) {
1552 CreateVideoRtpSender();
1553 EXPECT_EQ(nullptr, video_rtp_sender_->GetDtmfSender());
1554}
1555
Artem Titov880fa812021-07-30 22:30:23 +02001556// Test that the DTMF sender is really using `voice_channel_`, and thus returns
1557// true/false from CanSendDtmf based on what `voice_channel_` returns.
deadbeef20cb0c12017-02-01 20:27:00 -08001558TEST_F(RtpSenderReceiverTest, CanInsertDtmf) {
1559 AddDtmfCodec();
1560 CreateAudioRtpSender();
1561 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1562 ASSERT_NE(nullptr, dtmf_sender);
1563 EXPECT_TRUE(dtmf_sender->CanInsertDtmf());
1564}
1565
1566TEST_F(RtpSenderReceiverTest, CanNotInsertDtmf) {
1567 CreateAudioRtpSender();
1568 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1569 ASSERT_NE(nullptr, dtmf_sender);
1570 // DTMF codec has not been added, as it was in the above test.
1571 EXPECT_FALSE(dtmf_sender->CanInsertDtmf());
1572}
1573
1574TEST_F(RtpSenderReceiverTest, InsertDtmf) {
1575 AddDtmfCodec();
1576 CreateAudioRtpSender();
1577 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1578 ASSERT_NE(nullptr, dtmf_sender);
1579
1580 EXPECT_EQ(0U, voice_media_channel_->dtmf_info_queue().size());
1581
1582 // Insert DTMF
1583 const int expected_duration = 90;
1584 dtmf_sender->InsertDtmf("012", expected_duration, 100);
1585
1586 // Verify
1587 ASSERT_EQ_WAIT(3U, voice_media_channel_->dtmf_info_queue().size(),
1588 kDefaultTimeout);
1589 const uint32_t send_ssrc =
1590 voice_media_channel_->send_streams()[0].first_ssrc();
1591 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[0],
1592 send_ssrc, 0, expected_duration));
1593 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[1],
1594 send_ssrc, 1, expected_duration));
1595 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[2],
1596 send_ssrc, 2, expected_duration));
1597}
1598
1599// Make sure the signal from "GetOnDestroyedSignal()" fires when the sender is
1600// destroyed, which is needed for the DTMF sender.
1601TEST_F(RtpSenderReceiverTest, TestOnDestroyedSignal) {
1602 CreateAudioRtpSender();
1603 EXPECT_FALSE(audio_sender_destroyed_signal_fired_);
1604 audio_rtp_sender_ = nullptr;
1605 EXPECT_TRUE(audio_sender_destroyed_signal_fired_);
1606}
1607
Benjamin Wright84583f62018-10-04 14:22:34 -07001608// Validate that the default FrameEncryptor setting is nullptr.
1609TEST_F(RtpSenderReceiverTest, AudioSenderCanSetFrameEncryptor) {
1610 CreateAudioRtpSender();
1611 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1612 new FakeFrameEncryptor());
1613 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1614 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1615 EXPECT_EQ(fake_frame_encryptor.get(),
1616 audio_rtp_sender_->GetFrameEncryptor().get());
1617}
1618
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001619// Validate that setting a FrameEncryptor after the send stream is stopped does
1620// nothing.
1621TEST_F(RtpSenderReceiverTest, AudioSenderCannotSetFrameEncryptorAfterStop) {
1622 CreateAudioRtpSender();
1623 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1624 new FakeFrameEncryptor());
1625 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1626 audio_rtp_sender_->Stop();
1627 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1628 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1629}
1630
Benjamin Wright84583f62018-10-04 14:22:34 -07001631// Validate that the default FrameEncryptor setting is nullptr.
1632TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetFrameDecryptor) {
1633 CreateAudioRtpReceiver();
1634 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
Tomas Gunnarssonb3517fe2022-03-18 19:32:38 +01001635 rtc::make_ref_counted<FakeFrameDecryptor>());
Benjamin Wright84583f62018-10-04 14:22:34 -07001636 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
1637 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1638 EXPECT_EQ(fake_frame_decryptor.get(),
1639 audio_rtp_receiver_->GetFrameDecryptor().get());
Tommi4ccdf932021-05-17 14:50:10 +02001640 DestroyAudioRtpReceiver();
Benjamin Wright84583f62018-10-04 14:22:34 -07001641}
1642
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001643// Validate that the default FrameEncryptor setting is nullptr.
1644TEST_F(RtpSenderReceiverTest, AudioReceiverCannotSetFrameDecryptorAfterStop) {
1645 CreateAudioRtpReceiver();
1646 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
Tomas Gunnarssonb3517fe2022-03-18 19:32:38 +01001647 rtc::make_ref_counted<FakeFrameDecryptor>());
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001648 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
Tommi6589def2022-02-17 23:36:47 +01001649 audio_rtp_receiver_->SetMediaChannel(nullptr);
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001650 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1651 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
Tommi4ccdf932021-05-17 14:50:10 +02001652 DestroyAudioRtpReceiver();
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001653}
1654
1655// Validate that the default FrameEncryptor setting is nullptr.
1656TEST_F(RtpSenderReceiverTest, VideoSenderCanSetFrameEncryptor) {
1657 CreateVideoRtpSender();
1658 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1659 new FakeFrameEncryptor());
1660 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1661 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1662 EXPECT_EQ(fake_frame_encryptor.get(),
1663 video_rtp_sender_->GetFrameEncryptor().get());
1664}
1665
1666// Validate that setting a FrameEncryptor after the send stream is stopped does
1667// nothing.
1668TEST_F(RtpSenderReceiverTest, VideoSenderCannotSetFrameEncryptorAfterStop) {
1669 CreateVideoRtpSender();
1670 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1671 new FakeFrameEncryptor());
1672 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1673 video_rtp_sender_->Stop();
1674 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1675 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1676}
1677
1678// Validate that the default FrameEncryptor setting is nullptr.
1679TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetFrameDecryptor) {
1680 CreateVideoRtpReceiver();
1681 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
Tomas Gunnarssonb3517fe2022-03-18 19:32:38 +01001682 rtc::make_ref_counted<FakeFrameDecryptor>());
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001683 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
1684 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1685 EXPECT_EQ(fake_frame_decryptor.get(),
1686 video_rtp_receiver_->GetFrameDecryptor().get());
Tommi4ccdf932021-05-17 14:50:10 +02001687 DestroyVideoRtpReceiver();
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001688}
1689
1690// Validate that the default FrameEncryptor setting is nullptr.
1691TEST_F(RtpSenderReceiverTest, VideoReceiverCannotSetFrameDecryptorAfterStop) {
1692 CreateVideoRtpReceiver();
1693 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
Tomas Gunnarssonb3517fe2022-03-18 19:32:38 +01001694 rtc::make_ref_counted<FakeFrameDecryptor>());
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001695 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
Tommi6589def2022-02-17 23:36:47 +01001696 video_rtp_receiver_->SetMediaChannel(nullptr);
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001697 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1698 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
Tommi4ccdf932021-05-17 14:50:10 +02001699 DestroyVideoRtpReceiver();
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001700}
1701
Amit Hilbuch619b2942019-02-26 15:55:19 -08001702// Checks that calling the internal methods for get/set parameters do not
1703// invalidate any parameters retreived by clients.
1704TEST_F(RtpSenderReceiverTest,
1705 InternalParameterMethodsDoNotInvalidateTransaction) {
1706 CreateVideoRtpSender();
1707 RtpParameters parameters = video_rtp_sender_->GetParameters();
1708 RtpParameters new_parameters = video_rtp_sender_->GetParametersInternal();
1709 new_parameters.encodings[0].active = false;
1710 video_rtp_sender_->SetParametersInternal(new_parameters);
1711 new_parameters.encodings[0].active = true;
1712 video_rtp_sender_->SetParametersInternal(new_parameters);
1713 parameters.encodings[0].active = false;
1714 EXPECT_TRUE(video_rtp_sender_->SetParameters(parameters).ok());
1715}
1716
Amit Hilbuch2297d332019-02-19 12:49:22 -08001717// Helper method for syntactic sugar for accepting a vector with '{}' notation.
1718std::pair<RidList, RidList> CreatePairOfRidVectors(
1719 const std::vector<std::string>& first,
1720 const std::vector<std::string>& second) {
1721 return std::make_pair(first, second);
1722}
1723
1724// These parameters are used to test disabling simulcast layers.
1725const std::pair<RidList, RidList> kDisableSimulcastLayersParameters[] = {
1726 // Tests removing the first layer. This is a special case because
1727 // the first layer's SSRC is also the 'primary' SSRC used to associate the
1728 // parameters to the media channel.
1729 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"1"}),
1730 // Tests removing some layers.
1731 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"2", "4"}),
1732 // Tests simulcast rejected scenario all layers except first are rejected.
1733 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"2", "3", "4"}),
1734 // Tests removing all layers.
1735 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"1", "2", "3", "4"}),
1736};
1737
1738// Runs test for disabling layers on a sender without a media engine set.
1739TEST_P(RtpSenderReceiverTest, DisableSimulcastLayersWithoutMediaEngine) {
1740 auto parameter = GetParam();
1741 RunDisableSimulcastLayersWithoutMediaEngineTest(parameter.first,
1742 parameter.second);
1743}
1744
1745// Runs test for disabling layers on a sender with a media engine set.
1746TEST_P(RtpSenderReceiverTest, DisableSimulcastLayersWithMediaEngine) {
1747 auto parameter = GetParam();
1748 RunDisableSimulcastLayersWithMediaEngineTest(parameter.first,
1749 parameter.second);
1750}
1751
1752INSTANTIATE_TEST_SUITE_P(
1753 DisableSimulcastLayersInSender,
1754 RtpSenderReceiverTest,
1755 ::testing::ValuesIn(kDisableSimulcastLayersParameters));
1756
deadbeef70ab1a12015-09-28 16:53:55 -07001757} // namespace webrtc