blob: 20621e44aea5d85eb693275214cfe69ed2e50167 [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);
184
Tomas Gunnarsson5411b172022-01-24 08:45:26 +0100185 channel_manager_->DestroyChannel(voice_channel_);
186 channel_manager_->DestroyChannel(video_channel_);
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200187 }
188
Zhi Huange830e682018-03-30 10:48:35 -0700189 std::unique_ptr<webrtc::RtpTransportInternal> CreateDtlsSrtpTransport() {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200190 auto dtls_srtp_transport = std::make_unique<webrtc::DtlsSrtpTransport>(
Jonas Orelanded99dae2022-03-09 09:28:10 +0100191 /*rtcp_mux_required=*/true, field_trials_);
Zhi Huange830e682018-03-30 10:48:35 -0700192 dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport_.get(),
193 /*rtcp_dtls_transport=*/nullptr);
194 return dtls_srtp_transport;
195 }
196
deadbeef20cb0c12017-02-01 20:27:00 -0800197 // Needed to use DTMF sender.
198 void AddDtmfCodec() {
199 cricket::AudioSendParameters params;
200 const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000,
201 0, 1);
202 params.codecs.push_back(kTelephoneEventCodec);
203 voice_media_channel_->SetSendParameters(params);
204 }
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700205
pbos5214a0a2016-12-16 15:39:11 -0800206 void AddVideoTrack() { AddVideoTrack(false); }
207
208 void AddVideoTrack(bool is_screencast) {
perkja3ede6c2016-03-08 01:27:48 +0100209 rtc::scoped_refptr<VideoTrackSourceInterface> source(
pbos5214a0a2016-12-16 15:39:11 -0800210 FakeVideoTrackSource::Create(is_screencast));
perkj773be362017-07-31 23:22:01 -0700211 video_track_ =
212 VideoTrack::Create(kVideoTrackId, source, rtc::Thread::Current());
deadbeefe814a0d2017-02-25 18:15:09 -0800213 EXPECT_TRUE(local_stream_->AddTrack(video_track_));
deadbeef70ab1a12015-09-28 16:53:55 -0700214 }
215
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700216 void CreateAudioRtpSender() { CreateAudioRtpSender(nullptr); }
217
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +0100218 void CreateAudioRtpSender(
219 const rtc::scoped_refptr<LocalAudioSource>& source) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700220 audio_track_ = AudioTrack::Create(kAudioTrackId, source);
deadbeefe814a0d2017-02-25 18:15:09 -0800221 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200222 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200223 std::make_unique<MockSetStreamsObserver>();
Steve Anton47136dd2018-01-12 10:49:35 -0800224 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200225 AudioRtpSender::Create(worker_thread_, audio_track_->id(), nullptr,
226 set_streams_observer.get());
Steve Anton111fdfd2018-06-25 13:03:36 -0700227 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200228 EXPECT_CALL(*set_streams_observer, OnSetStreams());
229 audio_rtp_sender_->SetStreams({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800230 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
deadbeeffac06552015-11-25 11:26:01 -0800231 audio_rtp_sender_->SetSsrc(kAudioSsrc);
deadbeef20cb0c12017-02-01 20:27:00 -0800232 audio_rtp_sender_->GetOnDestroyedSignal()->connect(
233 this, &RtpSenderReceiverTest::OnAudioSenderDestroyed);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700234 VerifyVoiceChannelInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700235 }
236
Steve Anton02ee47c2018-01-10 16:26:06 -0800237 void CreateAudioRtpSenderWithNoTrack() {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800238 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200239 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800240 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
Steve Anton02ee47c2018-01-10 16:26:06 -0800241 }
242
deadbeef20cb0c12017-02-01 20:27:00 -0800243 void OnAudioSenderDestroyed() { audio_sender_destroyed_signal_fired_ = true; }
244
Seth Hampson2d2c8882018-05-16 16:02:32 -0700245 void CreateVideoRtpSender(uint32_t ssrc) {
246 CreateVideoRtpSender(false, ssrc);
247 }
248
pbos5214a0a2016-12-16 15:39:11 -0800249 void CreateVideoRtpSender() { CreateVideoRtpSender(false); }
250
Amit Hilbuch2297d332019-02-19 12:49:22 -0800251 cricket::StreamParams CreateSimulcastStreamParams(int num_layers) {
Florent Castelli892acf02018-10-01 22:47:20 +0200252 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +0100253 ssrcs.reserve(num_layers);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800254 for (int i = 0; i < num_layers; ++i) {
Florent Castelli892acf02018-10-01 22:47:20 +0200255 ssrcs.push_back(kVideoSsrcSimulcast + i);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800256 }
257 return cricket::CreateSimStreamParams("cname", ssrcs);
258 }
259
260 uint32_t CreateVideoRtpSender(const cricket::StreamParams& stream_params) {
Florent Castelli892acf02018-10-01 22:47:20 +0200261 video_media_channel_->AddSendStream(stream_params);
262 uint32_t primary_ssrc = stream_params.first_ssrc();
263 CreateVideoRtpSender(primary_ssrc);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800264 return primary_ssrc;
265 }
266
267 uint32_t CreateVideoRtpSenderWithSimulcast(
268 int num_layers = kVideoSimulcastLayerCount) {
269 return CreateVideoRtpSender(CreateSimulcastStreamParams(num_layers));
270 }
271
272 uint32_t CreateVideoRtpSenderWithSimulcast(
273 const std::vector<std::string>& rids) {
274 cricket::StreamParams stream_params =
275 CreateSimulcastStreamParams(rids.size());
276 std::vector<cricket::RidDescription> rid_descriptions;
277 absl::c_transform(
278 rids, std::back_inserter(rid_descriptions), [](const std::string& rid) {
279 return cricket::RidDescription(rid, cricket::RidDirection::kSend);
280 });
281 stream_params.set_rids(rid_descriptions);
282 return CreateVideoRtpSender(stream_params);
Florent Castelli892acf02018-10-01 22:47:20 +0200283 }
284
Seth Hampson2d2c8882018-05-16 16:02:32 -0700285 void CreateVideoRtpSender(bool is_screencast, uint32_t ssrc = kVideoSsrc) {
pbos5214a0a2016-12-16 15:39:11 -0800286 AddVideoTrack(is_screencast);
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200287 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200288 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200289 video_rtp_sender_ = VideoRtpSender::Create(
290 worker_thread_, video_track_->id(), set_streams_observer.get());
Steve Anton111fdfd2018-06-25 13:03:36 -0700291 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200292 EXPECT_CALL(*set_streams_observer, OnSetStreams());
293 video_rtp_sender_->SetStreams({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800294 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Seth Hampson2d2c8882018-05-16 16:02:32 -0700295 video_rtp_sender_->SetSsrc(ssrc);
296 VerifyVideoChannelInput(ssrc);
deadbeef70ab1a12015-09-28 16:53:55 -0700297 }
Steve Anton02ee47c2018-01-10 16:26:06 -0800298 void CreateVideoRtpSenderWithNoTrack() {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200299 video_rtp_sender_ =
300 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800301 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Steve Anton02ee47c2018-01-10 16:26:06 -0800302 }
303
deadbeef70ab1a12015-09-28 16:53:55 -0700304 void DestroyAudioRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700305 audio_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700306 VerifyVoiceChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700307 }
308
309 void DestroyVideoRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700310 video_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700311 VerifyVideoChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700312 }
313
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100314 void CreateAudioRtpReceiver(
315 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
Tommi4ccdf932021-05-17 14:50:10 +0200316 audio_rtp_receiver_ = rtc::make_ref_counted<AudioRtpReceiver>(
317 rtc::Thread::Current(), kAudioTrackId, streams,
318 /*is_unified_plan=*/true);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800319 audio_rtp_receiver_->SetMediaChannel(voice_media_channel_);
Steve Antond3679212018-01-17 17:41:02 -0800320 audio_rtp_receiver_->SetupMediaChannel(kAudioSsrc);
perkjd61bf802016-03-24 03:16:19 -0700321 audio_track_ = audio_rtp_receiver_->audio_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700322 VerifyVoiceChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700323 }
324
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100325 void CreateVideoRtpReceiver(
326 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
Tommi4ccdf932021-05-17 14:50:10 +0200327 video_rtp_receiver_ = rtc::make_ref_counted<VideoRtpReceiver>(
328 rtc::Thread::Current(), kVideoTrackId, streams);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800329 video_rtp_receiver_->SetMediaChannel(video_media_channel_);
Steve Antond3679212018-01-17 17:41:02 -0800330 video_rtp_receiver_->SetupMediaChannel(kVideoSsrc);
perkjf0dcfe22016-03-10 18:32:00 +0100331 video_track_ = video_rtp_receiver_->video_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700332 VerifyVideoChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700333 }
334
Florent Castelli38332cd2018-11-20 14:08:06 +0100335 void CreateVideoRtpReceiverWithSimulcast(
336 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {},
337 int num_layers = kVideoSimulcastLayerCount) {
338 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +0100339 ssrcs.reserve(num_layers);
Florent Castelli38332cd2018-11-20 14:08:06 +0100340 for (int i = 0; i < num_layers; ++i)
341 ssrcs.push_back(kVideoSsrcSimulcast + i);
342 cricket::StreamParams stream_params =
343 cricket::CreateSimStreamParams("cname", ssrcs);
344 video_media_channel_->AddRecvStream(stream_params);
345 uint32_t primary_ssrc = stream_params.first_ssrc();
346
Tommi4ccdf932021-05-17 14:50:10 +0200347 video_rtp_receiver_ = rtc::make_ref_counted<VideoRtpReceiver>(
348 rtc::Thread::Current(), kVideoTrackId, streams);
Florent Castelli38332cd2018-11-20 14:08:06 +0100349 video_rtp_receiver_->SetMediaChannel(video_media_channel_);
350 video_rtp_receiver_->SetupMediaChannel(primary_ssrc);
351 video_track_ = video_rtp_receiver_->video_track();
352 }
353
deadbeef70ab1a12015-09-28 16:53:55 -0700354 void DestroyAudioRtpReceiver() {
Tommi4ccdf932021-05-17 14:50:10 +0200355 if (!audio_rtp_receiver_)
356 return;
Tommi6589def2022-02-17 23:36:47 +0100357 audio_rtp_receiver_->SetMediaChannel(nullptr);
deadbeef70ab1a12015-09-28 16:53:55 -0700358 audio_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700359 VerifyVoiceChannelNoOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700360 }
361
362 void DestroyVideoRtpReceiver() {
Tommi4ccdf932021-05-17 14:50:10 +0200363 if (!video_rtp_receiver_)
364 return;
365 video_rtp_receiver_->Stop();
Tommi6589def2022-02-17 23:36:47 +0100366 video_rtp_receiver_->SetMediaChannel(nullptr);
deadbeef70ab1a12015-09-28 16:53:55 -0700367 video_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700368 VerifyVideoChannelNoOutput();
369 }
370
371 void VerifyVoiceChannelInput() { VerifyVoiceChannelInput(kAudioSsrc); }
372
373 void VerifyVoiceChannelInput(uint32_t ssrc) {
374 // Verify that the media channel has an audio source, and the stream isn't
375 // muted.
376 EXPECT_TRUE(voice_media_channel_->HasSource(ssrc));
377 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(ssrc));
378 }
379
380 void VerifyVideoChannelInput() { VerifyVideoChannelInput(kVideoSsrc); }
381
382 void VerifyVideoChannelInput(uint32_t ssrc) {
383 // Verify that the media channel has a video source,
384 EXPECT_TRUE(video_media_channel_->HasSource(ssrc));
385 }
386
387 void VerifyVoiceChannelNoInput() { VerifyVoiceChannelNoInput(kAudioSsrc); }
388
389 void VerifyVoiceChannelNoInput(uint32_t ssrc) {
390 // Verify that the media channel's source is reset.
391 EXPECT_FALSE(voice_media_channel_->HasSource(ssrc));
392 }
393
394 void VerifyVideoChannelNoInput() { VerifyVideoChannelNoInput(kVideoSsrc); }
395
396 void VerifyVideoChannelNoInput(uint32_t ssrc) {
397 // Verify that the media channel's source is reset.
398 EXPECT_FALSE(video_media_channel_->HasSource(ssrc));
399 }
400
401 void VerifyVoiceChannelOutput() {
402 // Verify that the volume is initialized to 1.
403 double volume;
404 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
405 EXPECT_EQ(1, volume);
406 }
407
408 void VerifyVideoChannelOutput() {
409 // Verify that the media channel has a sink.
410 EXPECT_TRUE(video_media_channel_->HasSink(kVideoSsrc));
411 }
412
413 void VerifyVoiceChannelNoOutput() {
414 // Verify that the volume is reset to 0.
415 double volume;
416 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
417 EXPECT_EQ(0, volume);
418 }
419
420 void VerifyVideoChannelNoOutput() {
421 // Verify that the media channel's sink is reset.
422 EXPECT_FALSE(video_media_channel_->HasSink(kVideoSsrc));
deadbeef70ab1a12015-09-28 16:53:55 -0700423 }
424
Amit Hilbuch2297d332019-02-19 12:49:22 -0800425 // Verifies that the encoding layers contain the specified RIDs.
426 bool VerifyEncodingLayers(const VideoRtpSender& sender,
427 const std::vector<std::string>& rids) {
428 bool has_failure = HasFailure();
429 RtpParameters parameters = sender.GetParameters();
430 std::vector<std::string> encoding_rids;
431 absl::c_transform(
432 parameters.encodings, std::back_inserter(encoding_rids),
433 [](const RtpEncodingParameters& encoding) { return encoding.rid; });
434 EXPECT_THAT(rids, ContainerEq(encoding_rids));
435 return has_failure || !HasFailure();
436 }
437
438 // Runs a test for disabling the encoding layers on the specified sender.
439 void RunDisableEncodingLayersTest(
440 const std::vector<std::string>& all_layers,
441 const std::vector<std::string>& disabled_layers,
442 VideoRtpSender* sender) {
443 std::vector<std::string> expected;
444 absl::c_copy_if(all_layers, std::back_inserter(expected),
445 [&disabled_layers](const std::string& rid) {
446 return !absl::c_linear_search(disabled_layers, rid);
447 });
448
449 EXPECT_TRUE(VerifyEncodingLayers(*sender, all_layers));
450 sender->DisableEncodingLayers(disabled_layers);
451 EXPECT_TRUE(VerifyEncodingLayers(*sender, expected));
452 }
453
454 // Runs a test for setting an encoding layer as inactive.
455 // This test assumes that some layers have already been disabled.
456 void RunSetLastLayerAsInactiveTest(VideoRtpSender* sender) {
457 auto parameters = sender->GetParameters();
458 if (parameters.encodings.size() == 0) {
459 return;
460 }
461
462 RtpEncodingParameters& encoding = parameters.encodings.back();
463 auto rid = encoding.rid;
464 EXPECT_TRUE(encoding.active);
465 encoding.active = false;
466 auto error = sender->SetParameters(parameters);
467 ASSERT_TRUE(error.ok());
468 parameters = sender->GetParameters();
469 RtpEncodingParameters& result_encoding = parameters.encodings.back();
470 EXPECT_EQ(rid, result_encoding.rid);
471 EXPECT_FALSE(result_encoding.active);
472 }
473
474 // Runs a test for disabling the encoding layers on a sender without a media
475 // channel.
476 void RunDisableSimulcastLayersWithoutMediaEngineTest(
477 const std::vector<std::string>& all_layers,
478 const std::vector<std::string>& disabled_layers) {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200479 auto sender = VideoRtpSender::Create(rtc::Thread::Current(), "1", nullptr);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800480 RtpParameters parameters;
481 parameters.encodings.resize(all_layers.size());
482 for (size_t i = 0; i < all_layers.size(); ++i) {
483 parameters.encodings[i].rid = all_layers[i];
484 }
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800485 sender->set_init_send_encodings(parameters.encodings);
486 RunDisableEncodingLayersTest(all_layers, disabled_layers, sender.get());
487 RunSetLastLayerAsInactiveTest(sender.get());
Amit Hilbuch2297d332019-02-19 12:49:22 -0800488 }
489
490 // Runs a test for disabling the encoding layers on a sender with a media
491 // channel.
492 void RunDisableSimulcastLayersWithMediaEngineTest(
493 const std::vector<std::string>& all_layers,
494 const std::vector<std::string>& disabled_layers) {
495 uint32_t ssrc = CreateVideoRtpSenderWithSimulcast(all_layers);
496 RunDisableEncodingLayersTest(all_layers, disabled_layers,
497 video_rtp_sender_.get());
498
499 auto channel_parameters = video_media_channel_->GetRtpSendParameters(ssrc);
500 ASSERT_EQ(channel_parameters.encodings.size(), all_layers.size());
501 for (size_t i = 0; i < all_layers.size(); ++i) {
502 EXPECT_EQ(all_layers[i], channel_parameters.encodings[i].rid);
503 bool is_active = !absl::c_linear_search(disabled_layers, all_layers[i]);
504 EXPECT_EQ(is_active, channel_parameters.encodings[i].active);
505 }
506
507 RunSetLastLayerAsInactiveTest(video_rtp_sender_.get());
508 }
509
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200510 // Check that minimum Jitter Buffer delay is propagated to the underlying
Artem Titov880fa812021-07-30 22:30:23 +0200511 // `media_channel`.
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200512 void VerifyRtpReceiverDelayBehaviour(cricket::Delayable* media_channel,
513 RtpReceiverInterface* receiver,
514 uint32_t ssrc) {
515 receiver->SetJitterBufferMinimumDelay(/*delay_seconds=*/0.5);
516 absl::optional<int> delay_ms =
517 media_channel->GetBaseMinimumPlayoutDelayMs(ssrc); // In milliseconds.
518 EXPECT_DOUBLE_EQ(0.5, delay_ms.value_or(0) / 1000.0);
519 }
520
deadbeef70ab1a12015-09-28 16:53:55 -0700521 protected:
Tommi4ccdf932021-05-17 14:50:10 +0200522 test::RunLoop run_loop_;
Steve Anton47136dd2018-01-12 10:49:35 -0800523 rtc::Thread* const network_thread_;
524 rtc::Thread* const worker_thread_;
Danil Chapovalov83bbe912019-08-07 12:24:53 +0200525 webrtc::RtcEventLogNull event_log_;
Artem Titov880fa812021-07-30 22:30:23 +0200526 // The `rtp_dtls_transport_` and `rtp_transport_` should be destroyed after
527 // the `channel_manager`.
Zhi Huange830e682018-03-30 10:48:35 -0700528 std::unique_ptr<cricket::DtlsTransportInternal> rtp_dtls_transport_;
529 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport_;
Jonas Orelanda3aa9bd2019-04-17 07:38:40 +0200530 std::unique_ptr<webrtc::VideoBitrateAllocatorFactory>
531 video_bitrate_allocator_factory_;
Artem Titov880fa812021-07-30 22:30:23 +0200532 // `media_engine_` is actually owned by `channel_manager_`.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700533 cricket::FakeMediaEngine* media_engine_;
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200534 std::unique_ptr<cricket::ChannelManager> channel_manager_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700535 cricket::FakeCall fake_call_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700536 cricket::VoiceChannel* voice_channel_;
537 cricket::VideoChannel* video_channel_;
538 cricket::FakeVoiceMediaChannel* voice_media_channel_;
539 cricket::FakeVideoMediaChannel* video_media_channel_;
deadbeef70ab1a12015-09-28 16:53:55 -0700540 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
541 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
542 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
543 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
deadbeefe814a0d2017-02-25 18:15:09 -0800544 rtc::scoped_refptr<MediaStreamInterface> local_stream_;
deadbeef70ab1a12015-09-28 16:53:55 -0700545 rtc::scoped_refptr<VideoTrackInterface> video_track_;
546 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
deadbeef20cb0c12017-02-01 20:27:00 -0800547 bool audio_sender_destroyed_signal_fired_ = false;
Jonas Orelanded99dae2022-03-09 09:28:10 +0100548 webrtc::test::ScopedKeyValueConfig field_trials_;
deadbeef70ab1a12015-09-28 16:53:55 -0700549};
550
Artem Titov880fa812021-07-30 22:30:23 +0200551// Test that `voice_channel_` is updated when an audio track is associated
deadbeef70ab1a12015-09-28 16:53:55 -0700552// and disassociated with an AudioRtpSender.
553TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
554 CreateAudioRtpSender();
555 DestroyAudioRtpSender();
556}
557
Artem Titov880fa812021-07-30 22:30:23 +0200558// Test that `video_channel_` is updated when a video track is associated and
deadbeef70ab1a12015-09-28 16:53:55 -0700559// disassociated with a VideoRtpSender.
560TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
561 CreateVideoRtpSender();
562 DestroyVideoRtpSender();
563}
564
Artem Titov880fa812021-07-30 22:30:23 +0200565// Test that `voice_channel_` is updated when a remote audio track is
deadbeef70ab1a12015-09-28 16:53:55 -0700566// associated and disassociated with an AudioRtpReceiver.
567TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
568 CreateAudioRtpReceiver();
569 DestroyAudioRtpReceiver();
570}
571
Artem Titov880fa812021-07-30 22:30:23 +0200572// Test that `video_channel_` is updated when a remote video track is
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700573// associated and disassociated with a VideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700574TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
575 CreateVideoRtpReceiver();
576 DestroyVideoRtpReceiver();
577}
578
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100579TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiverWithStreams) {
580 CreateAudioRtpReceiver({local_stream_});
581 DestroyAudioRtpReceiver();
582}
583
584TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiverWithStreams) {
585 CreateVideoRtpReceiver({local_stream_});
586 DestroyVideoRtpReceiver();
587}
588
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700589// Test that the AudioRtpSender applies options from the local audio source.
590TEST_F(RtpSenderReceiverTest, LocalAudioSourceOptionsApplied) {
591 cricket::AudioOptions options;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100592 options.echo_cancellation = true;
deadbeef757146b2017-02-10 21:26:48 -0800593 auto source = LocalAudioSource::Create(&options);
Niels Möllere7cc8832022-01-04 15:20:03 +0100594 CreateAudioRtpSender(source);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700595
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100596 EXPECT_EQ(true, voice_media_channel_->options().echo_cancellation);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700597
598 DestroyAudioRtpSender();
599}
600
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700601// Test that the stream is muted when the track is disabled, and unmuted when
602// the track is enabled.
603TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) {
604 CreateAudioRtpSender();
605
606 audio_track_->set_enabled(false);
607 EXPECT_TRUE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
608
609 audio_track_->set_enabled(true);
610 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
611
612 DestroyAudioRtpSender();
613}
614
615// Test that the volume is set to 0 when the track is disabled, and back to
616// 1 when the track is enabled.
deadbeef70ab1a12015-09-28 16:53:55 -0700617TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
618 CreateAudioRtpReceiver();
619
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700620 double volume;
621 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
622 EXPECT_EQ(1, volume);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700623
Tommi4ccdf932021-05-17 14:50:10 +0200624 // Handling of enable/disable is applied asynchronously.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700625 audio_track_->set_enabled(false);
Tommi4ccdf932021-05-17 14:50:10 +0200626 run_loop_.Flush();
627
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700628 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
629 EXPECT_EQ(0, volume);
630
deadbeef70ab1a12015-09-28 16:53:55 -0700631 audio_track_->set_enabled(true);
Tommi4ccdf932021-05-17 14:50:10 +0200632 run_loop_.Flush();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700633 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
634 EXPECT_EQ(1, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700635
636 DestroyAudioRtpReceiver();
637}
638
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700639// Currently no action is taken when a remote video track is disabled or
640// enabled, so there's nothing to test here, other than what is normally
641// verified in DestroyVideoRtpSender.
deadbeef70ab1a12015-09-28 16:53:55 -0700642TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
643 CreateVideoRtpSender();
644
deadbeef70ab1a12015-09-28 16:53:55 -0700645 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700646 video_track_->set_enabled(true);
647
648 DestroyVideoRtpSender();
649}
650
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700651// Test that the state of the video track created by the VideoRtpReceiver is
652// updated when the receiver is destroyed.
perkjf0dcfe22016-03-10 18:32:00 +0100653TEST_F(RtpSenderReceiverTest, RemoteVideoTrackState) {
654 CreateVideoRtpReceiver();
655
656 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track_->state());
657 EXPECT_EQ(webrtc::MediaSourceInterface::kLive,
658 video_track_->GetSource()->state());
659
660 DestroyVideoRtpReceiver();
661
662 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track_->state());
663 EXPECT_EQ(webrtc::MediaSourceInterface::kEnded,
664 video_track_->GetSource()->state());
Tommi4ccdf932021-05-17 14:50:10 +0200665 DestroyVideoRtpReceiver();
perkjf0dcfe22016-03-10 18:32:00 +0100666}
667
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700668// Currently no action is taken when a remote video track is disabled or
669// enabled, so there's nothing to test here, other than what is normally
670// verified in DestroyVideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700671TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
672 CreateVideoRtpReceiver();
673
674 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700675 video_track_->set_enabled(true);
676
677 DestroyVideoRtpReceiver();
678}
679
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700680// Test that the AudioRtpReceiver applies volume changes from the track source
681// to the media channel.
deadbeef70ab1a12015-09-28 16:53:55 -0700682TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
683 CreateAudioRtpReceiver();
684
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700685 double volume;
686 audio_track_->GetSource()->SetVolume(0.5);
Tommi4ccdf932021-05-17 14:50:10 +0200687 run_loop_.Flush();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700688 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
689 EXPECT_EQ(0.5, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700690
691 // Disable the audio track, this should prevent setting the volume.
deadbeef70ab1a12015-09-28 16:53:55 -0700692 audio_track_->set_enabled(false);
Tommi4ccdf932021-05-17 14:50:10 +0200693 RTC_DCHECK_EQ(worker_thread_, run_loop_.task_queue());
694 run_loop_.Flush();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700695 audio_track_->GetSource()->SetVolume(0.8);
696 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
697 EXPECT_EQ(0, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700698
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700699 // When the track is enabled, the previously set volume should take effect.
deadbeef70ab1a12015-09-28 16:53:55 -0700700 audio_track_->set_enabled(true);
Tommi4ccdf932021-05-17 14:50:10 +0200701 run_loop_.Flush();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700702 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
703 EXPECT_EQ(0.8, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700704
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700705 // Try changing volume one more time.
706 audio_track_->GetSource()->SetVolume(0.9);
Tommi4ccdf932021-05-17 14:50:10 +0200707 run_loop_.Flush();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700708 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
709 EXPECT_EQ(0.9, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700710
711 DestroyAudioRtpReceiver();
712}
713
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200714TEST_F(RtpSenderReceiverTest, AudioRtpReceiverDelay) {
715 CreateAudioRtpReceiver();
716 VerifyRtpReceiverDelayBehaviour(voice_media_channel_,
717 audio_rtp_receiver_.get(), kAudioSsrc);
Tommi4ccdf932021-05-17 14:50:10 +0200718 DestroyAudioRtpReceiver();
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200719}
720
721TEST_F(RtpSenderReceiverTest, VideoRtpReceiverDelay) {
722 CreateVideoRtpReceiver();
723 VerifyRtpReceiverDelayBehaviour(video_media_channel_,
724 video_rtp_receiver_.get(), kVideoSsrc);
Tommi4ccdf932021-05-17 14:50:10 +0200725 DestroyVideoRtpReceiver();
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200726}
727
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700728// Test that the media channel isn't enabled for sending if the audio sender
729// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800730TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800731 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800732 rtc::scoped_refptr<AudioTrackInterface> track =
733 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700734
735 // Track but no SSRC.
736 EXPECT_TRUE(audio_rtp_sender_->SetTrack(track));
737 VerifyVoiceChannelNoInput();
738
739 // SSRC but no track.
740 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
741 audio_rtp_sender_->SetSsrc(kAudioSsrc);
742 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800743}
744
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700745// Test that the media channel isn't enabled for sending if the video sender
746// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800747TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800748 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700749
750 // Track but no SSRC.
751 EXPECT_TRUE(video_rtp_sender_->SetTrack(video_track_));
752 VerifyVideoChannelNoInput();
753
754 // SSRC but no track.
755 EXPECT_TRUE(video_rtp_sender_->SetTrack(nullptr));
756 video_rtp_sender_->SetSsrc(kVideoSsrc);
757 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800758}
759
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700760// Test that the media channel is enabled for sending when the audio sender
761// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800762TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800763 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800764 rtc::scoped_refptr<AudioTrackInterface> track =
765 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700766 audio_rtp_sender_->SetSsrc(kAudioSsrc);
767 audio_rtp_sender_->SetTrack(track);
768 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800769
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700770 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800771}
772
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700773// Test that the media channel is enabled for sending when the audio sender
774// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800775TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800776 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800777 rtc::scoped_refptr<AudioTrackInterface> track =
778 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700779 audio_rtp_sender_->SetTrack(track);
780 audio_rtp_sender_->SetSsrc(kAudioSsrc);
781 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800782
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700783 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800784}
785
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700786// Test that the media channel is enabled for sending when the video sender
787// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800788TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
nisseaf510af2016-03-21 08:20:42 -0700789 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800790 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700791 video_rtp_sender_->SetSsrc(kVideoSsrc);
792 video_rtp_sender_->SetTrack(video_track_);
793 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800794
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700795 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800796}
797
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700798// Test that the media channel is enabled for sending when the video sender
799// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800800TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
nisseaf510af2016-03-21 08:20:42 -0700801 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800802 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700803 video_rtp_sender_->SetTrack(video_track_);
804 video_rtp_sender_->SetSsrc(kVideoSsrc);
805 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800806
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700807 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800808}
809
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700810// Test that the media channel stops sending when the audio sender's SSRC is set
811// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800812TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700813 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800814
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700815 audio_rtp_sender_->SetSsrc(0);
816 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800817}
818
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700819// Test that the media channel stops sending when the video sender's SSRC is set
820// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800821TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700822 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800823
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700824 audio_rtp_sender_->SetSsrc(0);
825 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800826}
827
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700828// Test that the media channel stops sending when the audio sender's track is
829// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800830TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700831 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800832
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700833 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
834 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800835}
836
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700837// Test that the media channel stops sending when the video sender's track is
838// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800839TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700840 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800841
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700842 video_rtp_sender_->SetSsrc(0);
843 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800844}
845
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700846// Test that when the audio sender's SSRC is changed, the media channel stops
847// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800848TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700849 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800850
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700851 audio_rtp_sender_->SetSsrc(kAudioSsrc2);
852 VerifyVoiceChannelNoInput(kAudioSsrc);
853 VerifyVoiceChannelInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800854
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700855 audio_rtp_sender_ = nullptr;
856 VerifyVoiceChannelNoInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800857}
858
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700859// Test that when the audio sender's SSRC is changed, the media channel stops
860// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800861TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700862 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800863
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700864 video_rtp_sender_->SetSsrc(kVideoSsrc2);
865 VerifyVideoChannelNoInput(kVideoSsrc);
866 VerifyVideoChannelInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800867
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700868 video_rtp_sender_ = nullptr;
869 VerifyVideoChannelNoInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800870}
871
skvladdc1c62c2016-03-16 19:07:43 -0700872TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) {
873 CreateAudioRtpSender();
874
skvladdc1c62c2016-03-16 19:07:43 -0700875 RtpParameters params = audio_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700876 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -0800877 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -0700878
879 DestroyAudioRtpSender();
880}
881
Florent Castelli892acf02018-10-01 22:47:20 +0200882TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParametersBeforeNegotiation) {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800883 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200884 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +0200885
886 RtpParameters params = audio_rtp_sender_->GetParameters();
887 ASSERT_EQ(1u, params.encodings.size());
888 params.encodings[0].max_bitrate_bps = 90000;
889 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
890
891 params = audio_rtp_sender_->GetParameters();
892 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
893 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
894
895 DestroyAudioRtpSender();
896}
897
898TEST_F(RtpSenderReceiverTest, AudioSenderInitParametersMovedAfterNegotiation) {
899 audio_track_ = AudioTrack::Create(kAudioTrackId, nullptr);
900 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
901
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200902 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200903 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200904 audio_rtp_sender_ = AudioRtpSender::Create(
905 worker_thread_, audio_track_->id(), nullptr, set_streams_observer.get());
Florent Castelli892acf02018-10-01 22:47:20 +0200906 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200907 EXPECT_CALL(*set_streams_observer, OnSetStreams());
908 audio_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli892acf02018-10-01 22:47:20 +0200909
910 std::vector<RtpEncodingParameters> init_encodings(1);
911 init_encodings[0].max_bitrate_bps = 60000;
912 audio_rtp_sender_->set_init_send_encodings(init_encodings);
913
914 RtpParameters params = audio_rtp_sender_->GetParameters();
915 ASSERT_EQ(1u, params.encodings.size());
916 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
917
918 // Simulate the setLocalDescription call
919 std::vector<uint32_t> ssrcs(1, 1);
920 cricket::StreamParams stream_params =
921 cricket::CreateSimStreamParams("cname", ssrcs);
922 voice_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800923 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +0200924 audio_rtp_sender_->SetSsrc(1);
925
926 params = audio_rtp_sender_->GetParameters();
927 ASSERT_EQ(1u, params.encodings.size());
928 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
929
930 DestroyAudioRtpSender();
931}
932
933TEST_F(RtpSenderReceiverTest,
934 AudioSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800935 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200936 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +0200937
938 RtpParameters params;
939 RTCError result = audio_rtp_sender_->SetParameters(params);
940 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
941 DestroyAudioRtpSender();
942}
943
Florent Castellicebf50f2018-05-03 15:31:53 +0200944TEST_F(RtpSenderReceiverTest,
945 AudioSenderMustCallGetParametersBeforeSetParameters) {
946 CreateAudioRtpSender();
947
948 RtpParameters params;
949 RTCError result = audio_rtp_sender_->SetParameters(params);
950 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
951
952 DestroyAudioRtpSender();
953}
954
955TEST_F(RtpSenderReceiverTest,
956 AudioSenderSetParametersInvalidatesTransactionId) {
957 CreateAudioRtpSender();
958
959 RtpParameters params = audio_rtp_sender_->GetParameters();
960 EXPECT_EQ(1u, params.encodings.size());
961 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
962 RTCError result = audio_rtp_sender_->SetParameters(params);
963 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
964
965 DestroyAudioRtpSender();
966}
967
968TEST_F(RtpSenderReceiverTest, AudioSenderDetectTransactionIdModification) {
969 CreateAudioRtpSender();
970
971 RtpParameters params = audio_rtp_sender_->GetParameters();
972 params.transaction_id = "";
973 RTCError result = audio_rtp_sender_->SetParameters(params);
974 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
975
976 DestroyAudioRtpSender();
977}
978
979TEST_F(RtpSenderReceiverTest, AudioSenderCheckTransactionIdRefresh) {
980 CreateAudioRtpSender();
981
982 RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200983 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 15:31:53 +0200984 auto saved_transaction_id = params.transaction_id;
985 params = audio_rtp_sender_->GetParameters();
986 EXPECT_NE(saved_transaction_id, params.transaction_id);
987
988 DestroyAudioRtpSender();
989}
990
991TEST_F(RtpSenderReceiverTest, AudioSenderSetParametersOldValueFail) {
992 CreateAudioRtpSender();
993
994 RtpParameters params = audio_rtp_sender_->GetParameters();
995 RtpParameters second_params = audio_rtp_sender_->GetParameters();
996
997 RTCError result = audio_rtp_sender_->SetParameters(params);
998 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
Seth Hampson2d2c8882018-05-16 16:02:32 -0700999 DestroyAudioRtpSender();
1000}
1001
1002TEST_F(RtpSenderReceiverTest, AudioSenderCantSetUnimplementedRtpParameters) {
1003 CreateAudioRtpSender();
1004 RtpParameters params = audio_rtp_sender_->GetParameters();
1005 EXPECT_EQ(1u, params.encodings.size());
1006
Florent Castelli87b3c512018-07-18 16:00:28 +02001007 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 16:02:32 -07001008 params.mid = "dummy_mid";
1009 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1010 audio_rtp_sender_->SetParameters(params).type());
1011 params = audio_rtp_sender_->GetParameters();
1012
Seth Hampson2d2c8882018-05-16 16:02:32 -07001013 DestroyAudioRtpSender();
1014}
1015
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001016TEST_F(RtpSenderReceiverTest, SetAudioMaxSendBitrate) {
1017 CreateAudioRtpSender();
1018
1019 EXPECT_EQ(-1, voice_media_channel_->max_bps());
1020 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001021 EXPECT_EQ(1U, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -08001022 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001023 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -08001024 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001025
1026 // Read back the parameters and verify they have been changed.
1027 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001028 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001029 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001030
1031 // Verify that the audio channel received the new parameters.
1032 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001033 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001034 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001035
1036 // Verify that the global bitrate limit has not been changed.
1037 EXPECT_EQ(-1, voice_media_channel_->max_bps());
1038
1039 DestroyAudioRtpSender();
1040}
1041
Seth Hampson24722b32017-12-22 09:36:42 -08001042TEST_F(RtpSenderReceiverTest, SetAudioBitratePriority) {
1043 CreateAudioRtpSender();
1044
1045 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001046 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001047 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1048 params.encodings[0].bitrate_priority);
1049 double new_bitrate_priority = 2.0;
1050 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -08001051 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -08001052
1053 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001054 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001055 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1056
1057 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001058 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001059 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1060
1061 DestroyAudioRtpSender();
1062}
1063
skvladdc1c62c2016-03-16 19:07:43 -07001064TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) {
1065 CreateVideoRtpSender();
1066
skvladdc1c62c2016-03-16 19:07:43 -07001067 RtpParameters params = video_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001068 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -08001069 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -07001070
1071 DestroyVideoRtpSender();
1072}
1073
Florent Castelli892acf02018-10-01 22:47:20 +02001074TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParametersBeforeNegotiation) {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001075 video_rtp_sender_ =
1076 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +02001077
1078 RtpParameters params = video_rtp_sender_->GetParameters();
1079 ASSERT_EQ(1u, params.encodings.size());
1080 params.encodings[0].max_bitrate_bps = 90000;
1081 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1082
1083 params = video_rtp_sender_->GetParameters();
1084 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1085 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
1086
1087 DestroyVideoRtpSender();
1088}
1089
1090TEST_F(RtpSenderReceiverTest, VideoSenderInitParametersMovedAfterNegotiation) {
1091 AddVideoTrack(false);
1092
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001093 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001094 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001095 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1096 set_streams_observer.get());
Florent Castelli892acf02018-10-01 22:47:20 +02001097 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001098 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1099 video_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli892acf02018-10-01 22:47:20 +02001100
1101 std::vector<RtpEncodingParameters> init_encodings(2);
1102 init_encodings[0].max_bitrate_bps = 60000;
1103 init_encodings[1].max_bitrate_bps = 900000;
1104 video_rtp_sender_->set_init_send_encodings(init_encodings);
1105
1106 RtpParameters params = video_rtp_sender_->GetParameters();
1107 ASSERT_EQ(2u, params.encodings.size());
1108 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1109 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
1110
1111 // Simulate the setLocalDescription call
1112 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +01001113 ssrcs.reserve(2);
Florent Castelli892acf02018-10-01 22:47:20 +02001114 for (int i = 0; i < 2; ++i)
1115 ssrcs.push_back(kVideoSsrcSimulcast + i);
1116 cricket::StreamParams stream_params =
1117 cricket::CreateSimStreamParams("cname", ssrcs);
1118 video_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -08001119 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +02001120 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
1121
1122 params = video_rtp_sender_->GetParameters();
1123 ASSERT_EQ(2u, params.encodings.size());
1124 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1125 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
1126
1127 DestroyVideoRtpSender();
1128}
1129
1130TEST_F(RtpSenderReceiverTest,
1131 VideoSenderInitParametersMovedAfterManualSimulcastAndNegotiation) {
1132 AddVideoTrack(false);
1133
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001134 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001135 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001136 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1137 set_streams_observer.get());
Florent Castelli892acf02018-10-01 22:47:20 +02001138 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001139 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1140 video_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli892acf02018-10-01 22:47:20 +02001141
1142 std::vector<RtpEncodingParameters> init_encodings(1);
1143 init_encodings[0].max_bitrate_bps = 60000;
1144 video_rtp_sender_->set_init_send_encodings(init_encodings);
1145
1146 RtpParameters params = video_rtp_sender_->GetParameters();
1147 ASSERT_EQ(1u, params.encodings.size());
1148 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1149
1150 // Simulate the setLocalDescription call as if the user used SDP munging
1151 // to enable simulcast
1152 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +01001153 ssrcs.reserve(2);
Florent Castelli892acf02018-10-01 22:47:20 +02001154 for (int i = 0; i < 2; ++i)
1155 ssrcs.push_back(kVideoSsrcSimulcast + i);
1156 cricket::StreamParams stream_params =
1157 cricket::CreateSimStreamParams("cname", ssrcs);
1158 video_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -08001159 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +02001160 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
1161
1162 params = video_rtp_sender_->GetParameters();
1163 ASSERT_EQ(2u, params.encodings.size());
1164 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1165
1166 DestroyVideoRtpSender();
1167}
1168
1169TEST_F(RtpSenderReceiverTest,
1170 VideoSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001171 video_rtp_sender_ =
1172 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +02001173
1174 RtpParameters params;
1175 RTCError result = video_rtp_sender_->SetParameters(params);
1176 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1177 DestroyVideoRtpSender();
1178}
1179
Florent Castellicebf50f2018-05-03 15:31:53 +02001180TEST_F(RtpSenderReceiverTest,
1181 VideoSenderMustCallGetParametersBeforeSetParameters) {
1182 CreateVideoRtpSender();
1183
1184 RtpParameters params;
1185 RTCError result = video_rtp_sender_->SetParameters(params);
1186 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1187
1188 DestroyVideoRtpSender();
1189}
1190
1191TEST_F(RtpSenderReceiverTest,
1192 VideoSenderSetParametersInvalidatesTransactionId) {
1193 CreateVideoRtpSender();
1194
1195 RtpParameters params = video_rtp_sender_->GetParameters();
1196 EXPECT_EQ(1u, params.encodings.size());
1197 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1198 RTCError result = video_rtp_sender_->SetParameters(params);
1199 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1200
1201 DestroyVideoRtpSender();
1202}
1203
1204TEST_F(RtpSenderReceiverTest, VideoSenderDetectTransactionIdModification) {
1205 CreateVideoRtpSender();
1206
1207 RtpParameters params = video_rtp_sender_->GetParameters();
1208 params.transaction_id = "";
1209 RTCError result = video_rtp_sender_->SetParameters(params);
1210 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1211
1212 DestroyVideoRtpSender();
1213}
1214
1215TEST_F(RtpSenderReceiverTest, VideoSenderCheckTransactionIdRefresh) {
1216 CreateVideoRtpSender();
1217
1218 RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001219 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 15:31:53 +02001220 auto saved_transaction_id = params.transaction_id;
1221 params = video_rtp_sender_->GetParameters();
1222 EXPECT_NE(saved_transaction_id, params.transaction_id);
1223
1224 DestroyVideoRtpSender();
1225}
1226
1227TEST_F(RtpSenderReceiverTest, VideoSenderSetParametersOldValueFail) {
1228 CreateVideoRtpSender();
1229
1230 RtpParameters params = video_rtp_sender_->GetParameters();
1231 RtpParameters second_params = video_rtp_sender_->GetParameters();
1232
1233 RTCError result = video_rtp_sender_->SetParameters(params);
1234 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1235
1236 DestroyVideoRtpSender();
1237}
1238
Seth Hampson2d2c8882018-05-16 16:02:32 -07001239TEST_F(RtpSenderReceiverTest, VideoSenderCantSetUnimplementedRtpParameters) {
1240 CreateVideoRtpSender();
1241 RtpParameters params = video_rtp_sender_->GetParameters();
1242 EXPECT_EQ(1u, params.encodings.size());
1243
Florent Castelli87b3c512018-07-18 16:00:28 +02001244 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 16:02:32 -07001245 params.mid = "dummy_mid";
1246 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1247 video_rtp_sender_->SetParameters(params).type());
1248 params = video_rtp_sender_->GetParameters();
1249
Seth Hampson2d2c8882018-05-16 16:02:32 -07001250 DestroyVideoRtpSender();
1251}
1252
Florent Castellic1a0bcb2019-01-29 14:26:48 +01001253TEST_F(RtpSenderReceiverTest, VideoSenderCanSetScaleResolutionDownBy) {
1254 CreateVideoRtpSender();
1255
1256 RtpParameters params = video_rtp_sender_->GetParameters();
1257 params.encodings[0].scale_resolution_down_by = 2;
1258
1259 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1260 params = video_rtp_sender_->GetParameters();
1261 EXPECT_EQ(2, params.encodings[0].scale_resolution_down_by);
1262
1263 DestroyVideoRtpSender();
1264}
1265
1266TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidScaleResolutionDownBy) {
1267 CreateVideoRtpSender();
1268
1269 RtpParameters params = video_rtp_sender_->GetParameters();
1270 params.encodings[0].scale_resolution_down_by = 0.5;
1271 RTCError result = video_rtp_sender_->SetParameters(params);
1272 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1273
1274 DestroyVideoRtpSender();
1275}
1276
Ă…sa Perssonfb195962021-08-16 16:41:56 +02001277TEST_F(RtpSenderReceiverTest, VideoSenderCanSetNumTemporalLayers) {
1278 CreateVideoRtpSender();
1279
1280 RtpParameters params = video_rtp_sender_->GetParameters();
1281 params.encodings[0].num_temporal_layers = 2;
1282
1283 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1284 params = video_rtp_sender_->GetParameters();
1285 EXPECT_EQ(2, params.encodings[0].num_temporal_layers);
1286
1287 DestroyVideoRtpSender();
1288}
1289
1290TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidNumTemporalLayers) {
1291 CreateVideoRtpSender();
1292
1293 RtpParameters params = video_rtp_sender_->GetParameters();
1294 params.encodings[0].num_temporal_layers = webrtc::kMaxTemporalStreams + 1;
1295 RTCError result = video_rtp_sender_->SetParameters(params);
1296 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1297
1298 DestroyVideoRtpSender();
1299}
1300
Florent Castelli907dc802019-12-06 15:03:19 +01001301TEST_F(RtpSenderReceiverTest, VideoSenderCanSetMaxFramerate) {
1302 CreateVideoRtpSender();
1303
1304 RtpParameters params = video_rtp_sender_->GetParameters();
1305 params.encodings[0].max_framerate = 20;
1306
1307 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1308 params = video_rtp_sender_->GetParameters();
1309 EXPECT_EQ(20., params.encodings[0].max_framerate);
1310
1311 DestroyVideoRtpSender();
1312}
1313
1314TEST_F(RtpSenderReceiverTest, VideoSenderCanSetMaxFramerateZero) {
1315 CreateVideoRtpSender();
1316
1317 RtpParameters params = video_rtp_sender_->GetParameters();
1318 params.encodings[0].max_framerate = 0.;
1319
1320 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1321 params = video_rtp_sender_->GetParameters();
1322 EXPECT_EQ(0., params.encodings[0].max_framerate);
1323
1324 DestroyVideoRtpSender();
1325}
1326
1327TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidMaxFramerate) {
1328 CreateVideoRtpSender();
1329
1330 RtpParameters params = video_rtp_sender_->GetParameters();
1331 params.encodings[0].max_framerate = -5.;
1332 RTCError result = video_rtp_sender_->SetParameters(params);
1333 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1334
1335 DestroyVideoRtpSender();
1336}
1337
Seth Hampson2d2c8882018-05-16 16:02:32 -07001338// A video sender can have multiple simulcast layers, in which case it will
1339// contain multiple RtpEncodingParameters. This tests that if this is the case
1340// (simulcast), then we can't set the bitrate_priority, or max_bitrate_bps
1341// for any encodings besides at index 0, because these are both implemented
1342// "per-sender."
1343TEST_F(RtpSenderReceiverTest, VideoSenderCantSetPerSenderEncodingParameters) {
1344 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001345 CreateVideoRtpSenderWithSimulcast();
Seth Hampson2d2c8882018-05-16 16:02:32 -07001346 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001347 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Seth Hampson2d2c8882018-05-16 16:02:32 -07001348
1349 params.encodings[1].bitrate_priority = 2.0;
1350 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1351 video_rtp_sender_->SetParameters(params).type());
1352 params = video_rtp_sender_->GetParameters();
1353
Seth Hampson2d2c8882018-05-16 16:02:32 -07001354 DestroyVideoRtpSender();
1355}
1356
Florent Castelli892acf02018-10-01 22:47:20 +02001357TEST_F(RtpSenderReceiverTest, VideoSenderCantSetReadOnlyEncodingParameters) {
1358 // Add a simulcast specific send stream that contains 2 encoding parameters.
1359 CreateVideoRtpSenderWithSimulcast();
1360 RtpParameters params = video_rtp_sender_->GetParameters();
1361 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
1362
1363 for (size_t i = 0; i < params.encodings.size(); i++) {
1364 params.encodings[i].ssrc = 1337;
1365 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION,
1366 video_rtp_sender_->SetParameters(params).type());
1367 params = video_rtp_sender_->GetParameters();
1368 }
1369
1370 DestroyVideoRtpSender();
1371}
1372
Ă…sa Persson55659812018-06-18 17:51:32 +02001373TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrate) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001374 CreateVideoRtpSender();
1375
1376 EXPECT_EQ(-1, video_media_channel_->max_bps());
1377 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001378 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001379 EXPECT_FALSE(params.encodings[0].min_bitrate_bps);
deadbeefe702b302017-02-04 12:09:01 -08001380 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Ă…sa Persson55659812018-06-18 17:51:32 +02001381 params.encodings[0].min_bitrate_bps = 100;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001382 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -08001383 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001384
1385 // Read back the parameters and verify they have been changed.
1386 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001387 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001388 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001389 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001390
1391 // Verify that the video channel received the new parameters.
1392 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001393 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001394 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001395 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001396
1397 // Verify that the global bitrate limit has not been changed.
1398 EXPECT_EQ(-1, video_media_channel_->max_bps());
1399
1400 DestroyVideoRtpSender();
1401}
1402
Ă…sa Persson55659812018-06-18 17:51:32 +02001403TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrateSimulcast) {
1404 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001405 CreateVideoRtpSenderWithSimulcast();
Ă…sa Persson55659812018-06-18 17:51:32 +02001406
1407 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001408 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001409 params.encodings[0].min_bitrate_bps = 100;
1410 params.encodings[0].max_bitrate_bps = 1000;
1411 params.encodings[1].min_bitrate_bps = 200;
1412 params.encodings[1].max_bitrate_bps = 2000;
1413 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1414
1415 // Verify that the video channel received the new parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001416 params = video_media_channel_->GetRtpSendParameters(kVideoSsrcSimulcast);
1417 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001418 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
1419 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
1420 EXPECT_EQ(200, params.encodings[1].min_bitrate_bps);
1421 EXPECT_EQ(2000, params.encodings[1].max_bitrate_bps);
1422
1423 DestroyVideoRtpSender();
1424}
1425
Seth Hampson24722b32017-12-22 09:36:42 -08001426TEST_F(RtpSenderReceiverTest, SetVideoBitratePriority) {
1427 CreateVideoRtpSender();
1428
1429 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001430 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001431 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1432 params.encodings[0].bitrate_priority);
1433 double new_bitrate_priority = 2.0;
1434 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -08001435 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -08001436
1437 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001438 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001439 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1440
1441 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001442 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001443 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1444
1445 DestroyVideoRtpSender();
1446}
1447
Florent Castelli38332cd2018-11-20 14:08:06 +01001448TEST_F(RtpSenderReceiverTest, VideoReceiverCanGetParametersWithSimulcast) {
1449 CreateVideoRtpReceiverWithSimulcast({}, 2);
1450
1451 RtpParameters params = video_rtp_receiver_->GetParameters();
1452 EXPECT_EQ(2u, params.encodings.size());
1453
1454 DestroyVideoRtpReceiver();
1455}
1456
pbos5214a0a2016-12-16 15:39:11 -08001457// Test that makes sure that a video track content hint translates to the proper
1458// value for sources that are not screencast.
1459TEST_F(RtpSenderReceiverTest, PropagatesVideoTrackContentHint) {
1460 CreateVideoRtpSender();
1461
1462 video_track_->set_enabled(true);
1463
Artem Titov880fa812021-07-30 22:30:23 +02001464 // `video_track_` is not screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001465 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001466 // No content hint should be set by default.
1467 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1468 video_track_->content_hint());
1469 // Setting detailed should turn a non-screencast source into screencast mode.
1470 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001471 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001472 // Removing the content hint should turn the track back into non-screencast
1473 // mode.
1474 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001475 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001476 // Setting fluid should remain in non-screencast mode (its default).
1477 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001478 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 08:53:10 +02001479 // Setting text should have the same effect as Detailed
1480 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
1481 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001482
1483 DestroyVideoRtpSender();
1484}
1485
1486// Test that makes sure that a video track content hint translates to the proper
1487// value for screencast sources.
1488TEST_F(RtpSenderReceiverTest,
1489 PropagatesVideoTrackContentHintForScreencastSource) {
1490 CreateVideoRtpSender(true);
1491
1492 video_track_->set_enabled(true);
1493
Artem Titov880fa812021-07-30 22:30:23 +02001494 // `video_track_` with a screencast source should be screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001495 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001496 // No content hint should be set by default.
1497 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1498 video_track_->content_hint());
1499 // Setting fluid should turn a screencast source into non-screencast mode.
1500 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001501 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001502 // Removing the content hint should turn the track back into screencast mode.
1503 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001504 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001505 // Setting detailed should still remain in screencast mode (its default).
1506 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001507 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 08:53:10 +02001508 // Setting text should have the same effect as Detailed
1509 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
1510 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001511
1512 DestroyVideoRtpSender();
1513}
1514
1515// Test that makes sure any content hints that are set on a track before
1516// VideoRtpSender is ready to send are still applied when it gets ready to send.
1517TEST_F(RtpSenderReceiverTest,
1518 PropagatesVideoTrackContentHintSetBeforeEnabling) {
1519 AddVideoTrack();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001520 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001521 std::make_unique<MockSetStreamsObserver>();
pbos5214a0a2016-12-16 15:39:11 -08001522 // Setting detailed overrides the default non-screencast mode. This should be
1523 // applied even if the track is set on construction.
1524 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001525 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1526 set_streams_observer.get());
Steve Anton111fdfd2018-06-25 13:03:36 -07001527 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001528 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1529 video_rtp_sender_->SetStreams({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -08001530 video_rtp_sender_->SetMediaChannel(video_media_channel_);
pbos5214a0a2016-12-16 15:39:11 -08001531 video_track_->set_enabled(true);
1532
1533 // Sender is not ready to send (no SSRC) so no option should have been set.
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001534 EXPECT_EQ(absl::nullopt, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001535
1536 // Verify that the content hint is accounted for when video_rtp_sender_ does
1537 // get enabled.
1538 video_rtp_sender_->SetSsrc(kVideoSsrc);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001539 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001540
1541 // And removing the hint should go back to false (to verify that false was
1542 // default correctly).
1543 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001544 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001545
1546 DestroyVideoRtpSender();
1547}
1548
deadbeef20cb0c12017-02-01 20:27:00 -08001549TEST_F(RtpSenderReceiverTest, AudioSenderHasDtmfSender) {
1550 CreateAudioRtpSender();
1551 EXPECT_NE(nullptr, audio_rtp_sender_->GetDtmfSender());
1552}
1553
1554TEST_F(RtpSenderReceiverTest, VideoSenderDoesNotHaveDtmfSender) {
1555 CreateVideoRtpSender();
1556 EXPECT_EQ(nullptr, video_rtp_sender_->GetDtmfSender());
1557}
1558
Artem Titov880fa812021-07-30 22:30:23 +02001559// Test that the DTMF sender is really using `voice_channel_`, and thus returns
1560// true/false from CanSendDtmf based on what `voice_channel_` returns.
deadbeef20cb0c12017-02-01 20:27:00 -08001561TEST_F(RtpSenderReceiverTest, CanInsertDtmf) {
1562 AddDtmfCodec();
1563 CreateAudioRtpSender();
1564 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1565 ASSERT_NE(nullptr, dtmf_sender);
1566 EXPECT_TRUE(dtmf_sender->CanInsertDtmf());
1567}
1568
1569TEST_F(RtpSenderReceiverTest, CanNotInsertDtmf) {
1570 CreateAudioRtpSender();
1571 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1572 ASSERT_NE(nullptr, dtmf_sender);
1573 // DTMF codec has not been added, as it was in the above test.
1574 EXPECT_FALSE(dtmf_sender->CanInsertDtmf());
1575}
1576
1577TEST_F(RtpSenderReceiverTest, InsertDtmf) {
1578 AddDtmfCodec();
1579 CreateAudioRtpSender();
1580 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1581 ASSERT_NE(nullptr, dtmf_sender);
1582
1583 EXPECT_EQ(0U, voice_media_channel_->dtmf_info_queue().size());
1584
1585 // Insert DTMF
1586 const int expected_duration = 90;
1587 dtmf_sender->InsertDtmf("012", expected_duration, 100);
1588
1589 // Verify
1590 ASSERT_EQ_WAIT(3U, voice_media_channel_->dtmf_info_queue().size(),
1591 kDefaultTimeout);
1592 const uint32_t send_ssrc =
1593 voice_media_channel_->send_streams()[0].first_ssrc();
1594 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[0],
1595 send_ssrc, 0, expected_duration));
1596 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[1],
1597 send_ssrc, 1, expected_duration));
1598 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[2],
1599 send_ssrc, 2, expected_duration));
1600}
1601
1602// Make sure the signal from "GetOnDestroyedSignal()" fires when the sender is
1603// destroyed, which is needed for the DTMF sender.
1604TEST_F(RtpSenderReceiverTest, TestOnDestroyedSignal) {
1605 CreateAudioRtpSender();
1606 EXPECT_FALSE(audio_sender_destroyed_signal_fired_);
1607 audio_rtp_sender_ = nullptr;
1608 EXPECT_TRUE(audio_sender_destroyed_signal_fired_);
1609}
1610
Benjamin Wright84583f62018-10-04 14:22:34 -07001611// Validate that the default FrameEncryptor setting is nullptr.
1612TEST_F(RtpSenderReceiverTest, AudioSenderCanSetFrameEncryptor) {
1613 CreateAudioRtpSender();
1614 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1615 new FakeFrameEncryptor());
1616 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1617 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1618 EXPECT_EQ(fake_frame_encryptor.get(),
1619 audio_rtp_sender_->GetFrameEncryptor().get());
1620}
1621
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001622// Validate that setting a FrameEncryptor after the send stream is stopped does
1623// nothing.
1624TEST_F(RtpSenderReceiverTest, AudioSenderCannotSetFrameEncryptorAfterStop) {
1625 CreateAudioRtpSender();
1626 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1627 new FakeFrameEncryptor());
1628 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1629 audio_rtp_sender_->Stop();
1630 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1631 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1632}
1633
Benjamin Wright84583f62018-10-04 14:22:34 -07001634// Validate that the default FrameEncryptor setting is nullptr.
1635TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetFrameDecryptor) {
1636 CreateAudioRtpReceiver();
1637 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
Tomas Gunnarssonb3517fe2022-03-18 19:32:38 +01001638 rtc::make_ref_counted<FakeFrameDecryptor>());
Benjamin Wright84583f62018-10-04 14:22:34 -07001639 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
1640 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1641 EXPECT_EQ(fake_frame_decryptor.get(),
1642 audio_rtp_receiver_->GetFrameDecryptor().get());
Tommi4ccdf932021-05-17 14:50:10 +02001643 DestroyAudioRtpReceiver();
Benjamin Wright84583f62018-10-04 14:22:34 -07001644}
1645
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001646// Validate that the default FrameEncryptor setting is nullptr.
1647TEST_F(RtpSenderReceiverTest, AudioReceiverCannotSetFrameDecryptorAfterStop) {
1648 CreateAudioRtpReceiver();
1649 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
Tomas Gunnarssonb3517fe2022-03-18 19:32:38 +01001650 rtc::make_ref_counted<FakeFrameDecryptor>());
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001651 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
Tommi6589def2022-02-17 23:36:47 +01001652 audio_rtp_receiver_->SetMediaChannel(nullptr);
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001653 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1654 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
Tommi4ccdf932021-05-17 14:50:10 +02001655 DestroyAudioRtpReceiver();
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001656}
1657
1658// Validate that the default FrameEncryptor setting is nullptr.
1659TEST_F(RtpSenderReceiverTest, VideoSenderCanSetFrameEncryptor) {
1660 CreateVideoRtpSender();
1661 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1662 new FakeFrameEncryptor());
1663 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1664 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1665 EXPECT_EQ(fake_frame_encryptor.get(),
1666 video_rtp_sender_->GetFrameEncryptor().get());
1667}
1668
1669// Validate that setting a FrameEncryptor after the send stream is stopped does
1670// nothing.
1671TEST_F(RtpSenderReceiverTest, VideoSenderCannotSetFrameEncryptorAfterStop) {
1672 CreateVideoRtpSender();
1673 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1674 new FakeFrameEncryptor());
1675 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1676 video_rtp_sender_->Stop();
1677 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1678 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1679}
1680
1681// Validate that the default FrameEncryptor setting is nullptr.
1682TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetFrameDecryptor) {
1683 CreateVideoRtpReceiver();
1684 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
Tomas Gunnarssonb3517fe2022-03-18 19:32:38 +01001685 rtc::make_ref_counted<FakeFrameDecryptor>());
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001686 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
1687 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1688 EXPECT_EQ(fake_frame_decryptor.get(),
1689 video_rtp_receiver_->GetFrameDecryptor().get());
Tommi4ccdf932021-05-17 14:50:10 +02001690 DestroyVideoRtpReceiver();
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001691}
1692
1693// Validate that the default FrameEncryptor setting is nullptr.
1694TEST_F(RtpSenderReceiverTest, VideoReceiverCannotSetFrameDecryptorAfterStop) {
1695 CreateVideoRtpReceiver();
1696 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
Tomas Gunnarssonb3517fe2022-03-18 19:32:38 +01001697 rtc::make_ref_counted<FakeFrameDecryptor>());
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001698 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
Tommi6589def2022-02-17 23:36:47 +01001699 video_rtp_receiver_->SetMediaChannel(nullptr);
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001700 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1701 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
Tommi4ccdf932021-05-17 14:50:10 +02001702 DestroyVideoRtpReceiver();
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001703}
1704
Amit Hilbuch619b2942019-02-26 15:55:19 -08001705// Checks that calling the internal methods for get/set parameters do not
1706// invalidate any parameters retreived by clients.
1707TEST_F(RtpSenderReceiverTest,
1708 InternalParameterMethodsDoNotInvalidateTransaction) {
1709 CreateVideoRtpSender();
1710 RtpParameters parameters = video_rtp_sender_->GetParameters();
1711 RtpParameters new_parameters = video_rtp_sender_->GetParametersInternal();
1712 new_parameters.encodings[0].active = false;
1713 video_rtp_sender_->SetParametersInternal(new_parameters);
1714 new_parameters.encodings[0].active = true;
1715 video_rtp_sender_->SetParametersInternal(new_parameters);
1716 parameters.encodings[0].active = false;
1717 EXPECT_TRUE(video_rtp_sender_->SetParameters(parameters).ok());
1718}
1719
Amit Hilbuch2297d332019-02-19 12:49:22 -08001720// Helper method for syntactic sugar for accepting a vector with '{}' notation.
1721std::pair<RidList, RidList> CreatePairOfRidVectors(
1722 const std::vector<std::string>& first,
1723 const std::vector<std::string>& second) {
1724 return std::make_pair(first, second);
1725}
1726
1727// These parameters are used to test disabling simulcast layers.
1728const std::pair<RidList, RidList> kDisableSimulcastLayersParameters[] = {
1729 // Tests removing the first layer. This is a special case because
1730 // the first layer's SSRC is also the 'primary' SSRC used to associate the
1731 // parameters to the media channel.
1732 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"1"}),
1733 // Tests removing some layers.
1734 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"2", "4"}),
1735 // Tests simulcast rejected scenario all layers except first are rejected.
1736 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"2", "3", "4"}),
1737 // Tests removing all layers.
1738 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"1", "2", "3", "4"}),
1739};
1740
1741// Runs test for disabling layers on a sender without a media engine set.
1742TEST_P(RtpSenderReceiverTest, DisableSimulcastLayersWithoutMediaEngine) {
1743 auto parameter = GetParam();
1744 RunDisableSimulcastLayersWithoutMediaEngineTest(parameter.first,
1745 parameter.second);
1746}
1747
1748// Runs test for disabling layers on a sender with a media engine set.
1749TEST_P(RtpSenderReceiverTest, DisableSimulcastLayersWithMediaEngine) {
1750 auto parameter = GetParam();
1751 RunDisableSimulcastLayersWithMediaEngineTest(parameter.first,
1752 parameter.second);
1753}
1754
1755INSTANTIATE_TEST_SUITE_P(
1756 DisableSimulcastLayersInSender,
1757 RtpSenderReceiverTest,
1758 ::testing::ValuesIn(kDisableSimulcastLayersParameters));
1759
deadbeef70ab1a12015-09-28 16:53:55 -07001760} // namespace webrtc