blob: a189e6517bec7530135f8101f1aae1dad2b66ee0 [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/dtls_srtp_transport.h"
56#include "pc/local_audio_source.h"
57#include "pc/media_stream.h"
Steve Anton10542f22019-01-11 09:11:00 -080058#include "pc/rtp_sender.h"
59#include "pc/rtp_transport_internal.h"
60#include "pc/test/fake_video_track_source.h"
Ruslan Burakov501bfba2019-02-11 10:29:19 +010061#include "pc/video_rtp_receiver.h"
Steve Anton10542f22019-01-11 09:11:00 -080062#include "pc/video_track.h"
Yves Gerey3e707812018-11-28 16:47:49 +010063#include "rtc_base/checks.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020064#include "rtc_base/gunit.h"
Yves Gerey3e707812018-11-28 16:47:49 +010065#include "rtc_base/thread.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020066#include "test/gmock.h"
67#include "test/gtest.h"
Tommi4ccdf932021-05-17 14:50:10 +020068#include "test/run_loop.h"
Jonas Orelanded99dae2022-03-09 09:28:10 +010069#include "test/scoped_key_value_config.h"
deadbeef70ab1a12015-09-28 16:53:55 -070070
71using ::testing::_;
Amit Hilbuch2297d332019-02-19 12:49:22 -080072using ::testing::ContainerEq;
deadbeef70ab1a12015-09-28 16:53:55 -070073using ::testing::Exactly;
deadbeef5dd42fd2016-05-02 16:20:01 -070074using ::testing::InvokeWithoutArgs;
skvladdc1c62c2016-03-16 19:07:43 -070075using ::testing::Return;
Amit Hilbuch2297d332019-02-19 12:49:22 -080076using RidList = std::vector<std::string>;
deadbeef70ab1a12015-09-28 16:53:55 -070077
deadbeef20cb0c12017-02-01 20:27:00 -080078namespace {
79
Seth Hampson845e8782018-03-02 11:34:10 -080080static const char kStreamId1[] = "local_stream_1";
deadbeef70ab1a12015-09-28 16:53:55 -070081static const char kVideoTrackId[] = "video_1";
82static const char kAudioTrackId[] = "audio_1";
Peter Boström0c4e06b2015-10-07 12:23:21 +020083static const uint32_t kVideoSsrc = 98;
deadbeeffac06552015-11-25 11:26:01 -080084static const uint32_t kVideoSsrc2 = 100;
Peter Boström0c4e06b2015-10-07 12:23:21 +020085static const uint32_t kAudioSsrc = 99;
deadbeeffac06552015-11-25 11:26:01 -080086static const uint32_t kAudioSsrc2 = 101;
Florent Castelli892acf02018-10-01 22:47:20 +020087static const uint32_t kVideoSsrcSimulcast = 102;
88static const uint32_t kVideoSimulcastLayerCount = 2;
deadbeef20cb0c12017-02-01 20:27:00 -080089static const int kDefaultTimeout = 10000; // 10 seconds.
Guido Urdaneta1ff16c82019-05-20 19:31:53 +020090
91class MockSetStreamsObserver
92 : public webrtc::RtpSenderBase::SetStreamsObserver {
93 public:
Danil Chapovalov3a353122020-05-15 11:16:53 +020094 MOCK_METHOD(void, OnSetStreams, (), (override));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +020095};
96
deadbeef20cb0c12017-02-01 20:27:00 -080097} // namespace
deadbeef70ab1a12015-09-28 16:53:55 -070098
99namespace webrtc {
100
Amit Hilbuch2297d332019-02-19 12:49:22 -0800101class RtpSenderReceiverTest
Mirko Bonadei6a489f22019-04-09 15:11:12 +0200102 : public ::testing::Test,
Fredrik Solenbergda2afbd2022-08-03 12:07:51 +0200103 public ::testing::WithParamInterface<std::pair<RidList, RidList>> {
tkchin3784b4a2016-06-24 19:31:47 -0700104 public:
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700105 RtpSenderReceiverTest()
Steve Anton47136dd2018-01-12 10:49:35 -0800106 : network_thread_(rtc::Thread::Current()),
107 worker_thread_(rtc::Thread::Current()),
Jonas Orelanda3aa9bd2019-04-17 07:38:40 +0200108 video_bitrate_allocator_factory_(
109 webrtc::CreateBuiltinVideoBitrateAllocatorFactory()),
Steve Anton47136dd2018-01-12 10:49:35 -0800110 // Create fake media engine/etc. so we can create channels to use to
111 // test RtpSenders/RtpReceivers.
Harald Alvestrand0ac50b92022-05-18 07:51:34 +0000112 media_engine_(std::make_unique<cricket::FakeMediaEngine>()),
Tomas Gunnarssone984aa22021-04-19 09:21:06 +0200113 fake_call_(worker_thread_, network_thread_),
Seth Hampson845e8782018-03-02 11:34:10 -0800114 local_stream_(MediaStream::Create(kStreamId1)) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200115 rtp_dtls_transport_ = std::make_unique<cricket::FakeDtlsTransport>(
Zhi Huange830e682018-03-30 10:48:35 -0700116 "fake_dtls_transport", cricket::ICE_CANDIDATE_COMPONENT_RTP);
117 rtp_transport_ = CreateDtlsSrtpTransport();
118
Harald Alvestrand485457f2022-05-23 08:46:57 +0000119 // Create the channels, discard the result; we get them later.
120 // Fake media channels are owned by the media engine.
121 media_engine_->voice().CreateMediaChannel(
122 &fake_call_, cricket::MediaConfig(), cricket::AudioOptions(),
123 webrtc::CryptoOptions());
124 media_engine_->video().CreateMediaChannel(
125 &fake_call_, cricket::MediaConfig(), cricket::VideoOptions(),
126 webrtc::CryptoOptions(), video_bitrate_allocator_factory_.get());
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +0100127
Harald Alvestrand485457f2022-05-23 08:46:57 +0000128 voice_media_channel_ = absl::WrapUnique(media_engine_->GetVoiceChannel(0));
129 video_media_channel_ = absl::WrapUnique(media_engine_->GetVideoChannel(0));
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +0100130
Harald Alvestrand485457f2022-05-23 08:46:57 +0000131 RTC_CHECK(voice_media_channel());
132 RTC_CHECK(video_media_channel());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700133
134 // Create streams for predefined SSRCs. Streams need to exist in order
135 // for the senders and receievers to apply parameters to them.
136 // Normally these would be created by SetLocalDescription and
137 // SetRemoteDescription.
138 voice_media_channel_->AddSendStream(
139 cricket::StreamParams::CreateLegacy(kAudioSsrc));
140 voice_media_channel_->AddRecvStream(
141 cricket::StreamParams::CreateLegacy(kAudioSsrc));
142 voice_media_channel_->AddSendStream(
143 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
144 voice_media_channel_->AddRecvStream(
145 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
146 video_media_channel_->AddSendStream(
147 cricket::StreamParams::CreateLegacy(kVideoSsrc));
148 video_media_channel_->AddRecvStream(
149 cricket::StreamParams::CreateLegacy(kVideoSsrc));
150 video_media_channel_->AddSendStream(
151 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
152 video_media_channel_->AddRecvStream(
153 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
tkchin3784b4a2016-06-24 19:31:47 -0700154 }
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700155
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200156 ~RtpSenderReceiverTest() {
157 audio_rtp_sender_ = nullptr;
158 video_rtp_sender_ = nullptr;
159 audio_rtp_receiver_ = nullptr;
160 video_rtp_receiver_ = nullptr;
161 local_stream_ = nullptr;
162 video_track_ = nullptr;
163 audio_track_ = nullptr;
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200164 }
165
Zhi Huange830e682018-03-30 10:48:35 -0700166 std::unique_ptr<webrtc::RtpTransportInternal> CreateDtlsSrtpTransport() {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200167 auto dtls_srtp_transport = std::make_unique<webrtc::DtlsSrtpTransport>(
Jonas Orelanded99dae2022-03-09 09:28:10 +0100168 /*rtcp_mux_required=*/true, field_trials_);
Zhi Huange830e682018-03-30 10:48:35 -0700169 dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport_.get(),
170 /*rtcp_dtls_transport=*/nullptr);
171 return dtls_srtp_transport;
172 }
173
deadbeef20cb0c12017-02-01 20:27:00 -0800174 // Needed to use DTMF sender.
175 void AddDtmfCodec() {
176 cricket::AudioSendParameters params;
177 const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000,
178 0, 1);
179 params.codecs.push_back(kTelephoneEventCodec);
Harald Alvestrand485457f2022-05-23 08:46:57 +0000180 voice_media_channel()->SetSendParameters(params);
deadbeef20cb0c12017-02-01 20:27:00 -0800181 }
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700182
pbos5214a0a2016-12-16 15:39:11 -0800183 void AddVideoTrack() { AddVideoTrack(false); }
184
185 void AddVideoTrack(bool is_screencast) {
perkja3ede6c2016-03-08 01:27:48 +0100186 rtc::scoped_refptr<VideoTrackSourceInterface> source(
pbos5214a0a2016-12-16 15:39:11 -0800187 FakeVideoTrackSource::Create(is_screencast));
perkj773be362017-07-31 23:22:01 -0700188 video_track_ =
189 VideoTrack::Create(kVideoTrackId, source, rtc::Thread::Current());
Harald Alvestrand2f7ad282022-04-21 11:35:43 +0000190 EXPECT_TRUE(local_stream_->AddTrack(video_track_));
deadbeef70ab1a12015-09-28 16:53:55 -0700191 }
192
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700193 void CreateAudioRtpSender() { CreateAudioRtpSender(nullptr); }
194
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +0100195 void CreateAudioRtpSender(
196 const rtc::scoped_refptr<LocalAudioSource>& source) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700197 audio_track_ = AudioTrack::Create(kAudioTrackId, source);
Harald Alvestrand2f7ad282022-04-21 11:35:43 +0000198 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200199 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200200 std::make_unique<MockSetStreamsObserver>();
Steve Anton47136dd2018-01-12 10:49:35 -0800201 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200202 AudioRtpSender::Create(worker_thread_, audio_track_->id(), nullptr,
203 set_streams_observer.get());
Niels Möllerafb246b2022-04-20 14:26:50 +0200204 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_.get()));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200205 EXPECT_CALL(*set_streams_observer, OnSetStreams());
206 audio_rtp_sender_->SetStreams({local_stream_->id()});
Harald Alvestrandc0d44d92022-12-13 12:57:24 +0000207 audio_rtp_sender_->SetMediaChannel(voice_media_channel()->AsSendChannel());
deadbeeffac06552015-11-25 11:26:01 -0800208 audio_rtp_sender_->SetSsrc(kAudioSsrc);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700209 VerifyVoiceChannelInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700210 }
211
Steve Anton02ee47c2018-01-10 16:26:06 -0800212 void CreateAudioRtpSenderWithNoTrack() {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800213 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200214 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
Harald Alvestrandc0d44d92022-12-13 12:57:24 +0000215 audio_rtp_sender_->SetMediaChannel(
216 voice_media_channel()->AsVoiceSendChannel());
Steve Anton02ee47c2018-01-10 16:26:06 -0800217 }
218
Seth Hampson2d2c8882018-05-16 16:02:32 -0700219 void CreateVideoRtpSender(uint32_t ssrc) {
220 CreateVideoRtpSender(false, ssrc);
221 }
222
pbos5214a0a2016-12-16 15:39:11 -0800223 void CreateVideoRtpSender() { CreateVideoRtpSender(false); }
224
Amit Hilbuch2297d332019-02-19 12:49:22 -0800225 cricket::StreamParams CreateSimulcastStreamParams(int num_layers) {
Florent Castelli892acf02018-10-01 22:47:20 +0200226 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +0100227 ssrcs.reserve(num_layers);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800228 for (int i = 0; i < num_layers; ++i) {
Florent Castelli892acf02018-10-01 22:47:20 +0200229 ssrcs.push_back(kVideoSsrcSimulcast + i);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800230 }
231 return cricket::CreateSimStreamParams("cname", ssrcs);
232 }
233
234 uint32_t CreateVideoRtpSender(const cricket::StreamParams& stream_params) {
Florent Castelli892acf02018-10-01 22:47:20 +0200235 video_media_channel_->AddSendStream(stream_params);
236 uint32_t primary_ssrc = stream_params.first_ssrc();
237 CreateVideoRtpSender(primary_ssrc);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800238 return primary_ssrc;
239 }
240
241 uint32_t CreateVideoRtpSenderWithSimulcast(
242 int num_layers = kVideoSimulcastLayerCount) {
243 return CreateVideoRtpSender(CreateSimulcastStreamParams(num_layers));
244 }
245
246 uint32_t CreateVideoRtpSenderWithSimulcast(
247 const std::vector<std::string>& rids) {
248 cricket::StreamParams stream_params =
249 CreateSimulcastStreamParams(rids.size());
250 std::vector<cricket::RidDescription> rid_descriptions;
251 absl::c_transform(
252 rids, std::back_inserter(rid_descriptions), [](const std::string& rid) {
253 return cricket::RidDescription(rid, cricket::RidDirection::kSend);
254 });
255 stream_params.set_rids(rid_descriptions);
256 return CreateVideoRtpSender(stream_params);
Florent Castelli892acf02018-10-01 22:47:20 +0200257 }
258
Seth Hampson2d2c8882018-05-16 16:02:32 -0700259 void CreateVideoRtpSender(bool is_screencast, uint32_t ssrc = kVideoSsrc) {
pbos5214a0a2016-12-16 15:39:11 -0800260 AddVideoTrack(is_screencast);
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200261 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200262 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200263 video_rtp_sender_ = VideoRtpSender::Create(
264 worker_thread_, video_track_->id(), set_streams_observer.get());
Niels Möllerafb246b2022-04-20 14:26:50 +0200265 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200266 EXPECT_CALL(*set_streams_observer, OnSetStreams());
267 video_rtp_sender_->SetStreams({local_stream_->id()});
Harald Alvestrandc0d44d92022-12-13 12:57:24 +0000268 video_rtp_sender_->SetMediaChannel(
269 video_media_channel()->AsVideoSendChannel());
Seth Hampson2d2c8882018-05-16 16:02:32 -0700270 video_rtp_sender_->SetSsrc(ssrc);
271 VerifyVideoChannelInput(ssrc);
deadbeef70ab1a12015-09-28 16:53:55 -0700272 }
Steve Anton02ee47c2018-01-10 16:26:06 -0800273 void CreateVideoRtpSenderWithNoTrack() {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200274 video_rtp_sender_ =
275 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Harald Alvestrandc0d44d92022-12-13 12:57:24 +0000276 video_rtp_sender_->SetMediaChannel(
277 video_media_channel()->AsVideoSendChannel());
Steve Anton02ee47c2018-01-10 16:26:06 -0800278 }
279
deadbeef70ab1a12015-09-28 16:53:55 -0700280 void DestroyAudioRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700281 audio_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700282 VerifyVoiceChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700283 }
284
285 void DestroyVideoRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700286 video_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700287 VerifyVideoChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700288 }
289
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100290 void CreateAudioRtpReceiver(
291 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
Tommi4ccdf932021-05-17 14:50:10 +0200292 audio_rtp_receiver_ = rtc::make_ref_counted<AudioRtpReceiver>(
293 rtc::Thread::Current(), kAudioTrackId, streams,
294 /*is_unified_plan=*/true);
Harald Alvestrandc0d44d92022-12-13 12:57:24 +0000295 audio_rtp_receiver_->SetMediaChannel(
296 voice_media_channel()->AsVoiceReceiveChannel());
Steve Antond3679212018-01-17 17:41:02 -0800297 audio_rtp_receiver_->SetupMediaChannel(kAudioSsrc);
perkjd61bf802016-03-24 03:16:19 -0700298 audio_track_ = audio_rtp_receiver_->audio_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700299 VerifyVoiceChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700300 }
301
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100302 void CreateVideoRtpReceiver(
303 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
Tommi4ccdf932021-05-17 14:50:10 +0200304 video_rtp_receiver_ = rtc::make_ref_counted<VideoRtpReceiver>(
305 rtc::Thread::Current(), kVideoTrackId, streams);
Harald Alvestrandc0d44d92022-12-13 12:57:24 +0000306 video_rtp_receiver_->SetMediaChannel(
307 video_media_channel()->AsVideoReceiveChannel());
Steve Antond3679212018-01-17 17:41:02 -0800308 video_rtp_receiver_->SetupMediaChannel(kVideoSsrc);
perkjf0dcfe22016-03-10 18:32:00 +0100309 video_track_ = video_rtp_receiver_->video_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700310 VerifyVideoChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700311 }
312
Florent Castelli38332cd2018-11-20 14:08:06 +0100313 void CreateVideoRtpReceiverWithSimulcast(
314 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {},
315 int num_layers = kVideoSimulcastLayerCount) {
316 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +0100317 ssrcs.reserve(num_layers);
Florent Castelli38332cd2018-11-20 14:08:06 +0100318 for (int i = 0; i < num_layers; ++i)
319 ssrcs.push_back(kVideoSsrcSimulcast + i);
320 cricket::StreamParams stream_params =
321 cricket::CreateSimStreamParams("cname", ssrcs);
322 video_media_channel_->AddRecvStream(stream_params);
323 uint32_t primary_ssrc = stream_params.first_ssrc();
324
Tommi4ccdf932021-05-17 14:50:10 +0200325 video_rtp_receiver_ = rtc::make_ref_counted<VideoRtpReceiver>(
326 rtc::Thread::Current(), kVideoTrackId, streams);
Harald Alvestrandc0d44d92022-12-13 12:57:24 +0000327 video_rtp_receiver_->SetMediaChannel(
328 video_media_channel()->AsVideoReceiveChannel());
Florent Castelli38332cd2018-11-20 14:08:06 +0100329 video_rtp_receiver_->SetupMediaChannel(primary_ssrc);
330 video_track_ = video_rtp_receiver_->video_track();
331 }
332
deadbeef70ab1a12015-09-28 16:53:55 -0700333 void DestroyAudioRtpReceiver() {
Tommi4ccdf932021-05-17 14:50:10 +0200334 if (!audio_rtp_receiver_)
335 return;
Tommi6589def2022-02-17 23:36:47 +0100336 audio_rtp_receiver_->SetMediaChannel(nullptr);
deadbeef70ab1a12015-09-28 16:53:55 -0700337 audio_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700338 VerifyVoiceChannelNoOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700339 }
340
341 void DestroyVideoRtpReceiver() {
Tommi4ccdf932021-05-17 14:50:10 +0200342 if (!video_rtp_receiver_)
343 return;
344 video_rtp_receiver_->Stop();
Tommi6589def2022-02-17 23:36:47 +0100345 video_rtp_receiver_->SetMediaChannel(nullptr);
deadbeef70ab1a12015-09-28 16:53:55 -0700346 video_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700347 VerifyVideoChannelNoOutput();
348 }
349
350 void VerifyVoiceChannelInput() { VerifyVoiceChannelInput(kAudioSsrc); }
351
352 void VerifyVoiceChannelInput(uint32_t ssrc) {
353 // Verify that the media channel has an audio source, and the stream isn't
354 // muted.
Harald Alvestrand485457f2022-05-23 08:46:57 +0000355 EXPECT_TRUE(voice_media_channel()->HasSource(ssrc));
356 EXPECT_FALSE(voice_media_channel()->IsStreamMuted(ssrc));
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700357 }
358
359 void VerifyVideoChannelInput() { VerifyVideoChannelInput(kVideoSsrc); }
360
361 void VerifyVideoChannelInput(uint32_t ssrc) {
362 // Verify that the media channel has a video source,
363 EXPECT_TRUE(video_media_channel_->HasSource(ssrc));
364 }
365
366 void VerifyVoiceChannelNoInput() { VerifyVoiceChannelNoInput(kAudioSsrc); }
367
368 void VerifyVoiceChannelNoInput(uint32_t ssrc) {
369 // Verify that the media channel's source is reset.
Harald Alvestrand485457f2022-05-23 08:46:57 +0000370 EXPECT_FALSE(voice_media_channel()->HasSource(ssrc));
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700371 }
372
373 void VerifyVideoChannelNoInput() { VerifyVideoChannelNoInput(kVideoSsrc); }
374
375 void VerifyVideoChannelNoInput(uint32_t ssrc) {
376 // Verify that the media channel's source is reset.
377 EXPECT_FALSE(video_media_channel_->HasSource(ssrc));
378 }
379
380 void VerifyVoiceChannelOutput() {
381 // Verify that the volume is initialized to 1.
382 double volume;
Harald Alvestrand485457f2022-05-23 08:46:57 +0000383 EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700384 EXPECT_EQ(1, volume);
385 }
386
387 void VerifyVideoChannelOutput() {
388 // Verify that the media channel has a sink.
389 EXPECT_TRUE(video_media_channel_->HasSink(kVideoSsrc));
390 }
391
392 void VerifyVoiceChannelNoOutput() {
393 // Verify that the volume is reset to 0.
394 double volume;
Harald Alvestrand485457f2022-05-23 08:46:57 +0000395 EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700396 EXPECT_EQ(0, volume);
397 }
398
399 void VerifyVideoChannelNoOutput() {
400 // Verify that the media channel's sink is reset.
401 EXPECT_FALSE(video_media_channel_->HasSink(kVideoSsrc));
deadbeef70ab1a12015-09-28 16:53:55 -0700402 }
403
Amit Hilbuch2297d332019-02-19 12:49:22 -0800404 // Verifies that the encoding layers contain the specified RIDs.
405 bool VerifyEncodingLayers(const VideoRtpSender& sender,
406 const std::vector<std::string>& rids) {
407 bool has_failure = HasFailure();
408 RtpParameters parameters = sender.GetParameters();
409 std::vector<std::string> encoding_rids;
410 absl::c_transform(
411 parameters.encodings, std::back_inserter(encoding_rids),
412 [](const RtpEncodingParameters& encoding) { return encoding.rid; });
413 EXPECT_THAT(rids, ContainerEq(encoding_rids));
414 return has_failure || !HasFailure();
415 }
416
417 // Runs a test for disabling the encoding layers on the specified sender.
418 void RunDisableEncodingLayersTest(
419 const std::vector<std::string>& all_layers,
420 const std::vector<std::string>& disabled_layers,
421 VideoRtpSender* sender) {
422 std::vector<std::string> expected;
423 absl::c_copy_if(all_layers, std::back_inserter(expected),
424 [&disabled_layers](const std::string& rid) {
425 return !absl::c_linear_search(disabled_layers, rid);
426 });
427
428 EXPECT_TRUE(VerifyEncodingLayers(*sender, all_layers));
429 sender->DisableEncodingLayers(disabled_layers);
430 EXPECT_TRUE(VerifyEncodingLayers(*sender, expected));
431 }
432
433 // Runs a test for setting an encoding layer as inactive.
434 // This test assumes that some layers have already been disabled.
435 void RunSetLastLayerAsInactiveTest(VideoRtpSender* sender) {
436 auto parameters = sender->GetParameters();
437 if (parameters.encodings.size() == 0) {
438 return;
439 }
440
441 RtpEncodingParameters& encoding = parameters.encodings.back();
442 auto rid = encoding.rid;
443 EXPECT_TRUE(encoding.active);
444 encoding.active = false;
445 auto error = sender->SetParameters(parameters);
446 ASSERT_TRUE(error.ok());
447 parameters = sender->GetParameters();
448 RtpEncodingParameters& result_encoding = parameters.encodings.back();
449 EXPECT_EQ(rid, result_encoding.rid);
450 EXPECT_FALSE(result_encoding.active);
451 }
452
453 // Runs a test for disabling the encoding layers on a sender without a media
454 // channel.
455 void RunDisableSimulcastLayersWithoutMediaEngineTest(
456 const std::vector<std::string>& all_layers,
457 const std::vector<std::string>& disabled_layers) {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200458 auto sender = VideoRtpSender::Create(rtc::Thread::Current(), "1", nullptr);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800459 RtpParameters parameters;
460 parameters.encodings.resize(all_layers.size());
461 for (size_t i = 0; i < all_layers.size(); ++i) {
462 parameters.encodings[i].rid = all_layers[i];
463 }
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800464 sender->set_init_send_encodings(parameters.encodings);
465 RunDisableEncodingLayersTest(all_layers, disabled_layers, sender.get());
466 RunSetLastLayerAsInactiveTest(sender.get());
Amit Hilbuch2297d332019-02-19 12:49:22 -0800467 }
468
469 // Runs a test for disabling the encoding layers on a sender with a media
470 // channel.
471 void RunDisableSimulcastLayersWithMediaEngineTest(
472 const std::vector<std::string>& all_layers,
473 const std::vector<std::string>& disabled_layers) {
474 uint32_t ssrc = CreateVideoRtpSenderWithSimulcast(all_layers);
475 RunDisableEncodingLayersTest(all_layers, disabled_layers,
476 video_rtp_sender_.get());
477
478 auto channel_parameters = video_media_channel_->GetRtpSendParameters(ssrc);
479 ASSERT_EQ(channel_parameters.encodings.size(), all_layers.size());
480 for (size_t i = 0; i < all_layers.size(); ++i) {
481 EXPECT_EQ(all_layers[i], channel_parameters.encodings[i].rid);
482 bool is_active = !absl::c_linear_search(disabled_layers, all_layers[i]);
483 EXPECT_EQ(is_active, channel_parameters.encodings[i].active);
484 }
485
486 RunSetLastLayerAsInactiveTest(video_rtp_sender_.get());
487 }
488
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200489 // Check that minimum Jitter Buffer delay is propagated to the underlying
Artem Titov880fa812021-07-30 22:30:23 +0200490 // `media_channel`.
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200491 void VerifyRtpReceiverDelayBehaviour(cricket::Delayable* media_channel,
492 RtpReceiverInterface* receiver,
493 uint32_t ssrc) {
494 receiver->SetJitterBufferMinimumDelay(/*delay_seconds=*/0.5);
495 absl::optional<int> delay_ms =
496 media_channel->GetBaseMinimumPlayoutDelayMs(ssrc); // In milliseconds.
497 EXPECT_DOUBLE_EQ(0.5, delay_ms.value_or(0) / 1000.0);
498 }
499
deadbeef70ab1a12015-09-28 16:53:55 -0700500 protected:
Harald Alvestrand485457f2022-05-23 08:46:57 +0000501 cricket::FakeVideoMediaChannel* video_media_channel() {
502 return video_media_channel_.get();
503 }
504 cricket::FakeVoiceMediaChannel* voice_media_channel() {
505 return voice_media_channel_.get();
506 }
507
Tommi4ccdf932021-05-17 14:50:10 +0200508 test::RunLoop run_loop_;
Steve Anton47136dd2018-01-12 10:49:35 -0800509 rtc::Thread* const network_thread_;
510 rtc::Thread* const worker_thread_;
Danil Chapovalov83bbe912019-08-07 12:24:53 +0200511 webrtc::RtcEventLogNull event_log_;
Artem Titov880fa812021-07-30 22:30:23 +0200512 // The `rtp_dtls_transport_` and `rtp_transport_` should be destroyed after
513 // the `channel_manager`.
Zhi Huange830e682018-03-30 10:48:35 -0700514 std::unique_ptr<cricket::DtlsTransportInternal> rtp_dtls_transport_;
515 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport_;
Jonas Orelanda3aa9bd2019-04-17 07:38:40 +0200516 std::unique_ptr<webrtc::VideoBitrateAllocatorFactory>
517 video_bitrate_allocator_factory_;
Harald Alvestrand0ac50b92022-05-18 07:51:34 +0000518 std::unique_ptr<cricket::FakeMediaEngine> media_engine_;
519 rtc::UniqueRandomIdGenerator ssrc_generator_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700520 cricket::FakeCall fake_call_;
Harald Alvestrand485457f2022-05-23 08:46:57 +0000521 std::unique_ptr<cricket::FakeVoiceMediaChannel> voice_media_channel_;
522 std::unique_ptr<cricket::FakeVideoMediaChannel> video_media_channel_;
deadbeef70ab1a12015-09-28 16:53:55 -0700523 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
524 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
525 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
526 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
deadbeefe814a0d2017-02-25 18:15:09 -0800527 rtc::scoped_refptr<MediaStreamInterface> local_stream_;
deadbeef70ab1a12015-09-28 16:53:55 -0700528 rtc::scoped_refptr<VideoTrackInterface> video_track_;
529 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
Jonas Orelanded99dae2022-03-09 09:28:10 +0100530 webrtc::test::ScopedKeyValueConfig field_trials_;
deadbeef70ab1a12015-09-28 16:53:55 -0700531};
532
Artem Titov880fa812021-07-30 22:30:23 +0200533// Test that `voice_channel_` is updated when an audio track is associated
deadbeef70ab1a12015-09-28 16:53:55 -0700534// and disassociated with an AudioRtpSender.
535TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
536 CreateAudioRtpSender();
537 DestroyAudioRtpSender();
538}
539
Artem Titov880fa812021-07-30 22:30:23 +0200540// Test that `video_channel_` is updated when a video track is associated and
deadbeef70ab1a12015-09-28 16:53:55 -0700541// disassociated with a VideoRtpSender.
542TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
543 CreateVideoRtpSender();
544 DestroyVideoRtpSender();
545}
546
Artem Titov880fa812021-07-30 22:30:23 +0200547// Test that `voice_channel_` is updated when a remote audio track is
deadbeef70ab1a12015-09-28 16:53:55 -0700548// associated and disassociated with an AudioRtpReceiver.
549TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
550 CreateAudioRtpReceiver();
551 DestroyAudioRtpReceiver();
552}
553
Artem Titov880fa812021-07-30 22:30:23 +0200554// Test that `video_channel_` is updated when a remote video track is
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700555// associated and disassociated with a VideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700556TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
557 CreateVideoRtpReceiver();
558 DestroyVideoRtpReceiver();
559}
560
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100561TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiverWithStreams) {
562 CreateAudioRtpReceiver({local_stream_});
563 DestroyAudioRtpReceiver();
564}
565
566TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiverWithStreams) {
567 CreateVideoRtpReceiver({local_stream_});
568 DestroyVideoRtpReceiver();
569}
570
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700571// Test that the AudioRtpSender applies options from the local audio source.
572TEST_F(RtpSenderReceiverTest, LocalAudioSourceOptionsApplied) {
573 cricket::AudioOptions options;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100574 options.echo_cancellation = true;
deadbeef757146b2017-02-10 21:26:48 -0800575 auto source = LocalAudioSource::Create(&options);
Niels Möllere7cc8832022-01-04 15:20:03 +0100576 CreateAudioRtpSender(source);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700577
Harald Alvestrand485457f2022-05-23 08:46:57 +0000578 EXPECT_EQ(true, voice_media_channel()->options().echo_cancellation);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700579
580 DestroyAudioRtpSender();
581}
582
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700583// Test that the stream is muted when the track is disabled, and unmuted when
584// the track is enabled.
585TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) {
586 CreateAudioRtpSender();
587
588 audio_track_->set_enabled(false);
Harald Alvestrand485457f2022-05-23 08:46:57 +0000589 EXPECT_TRUE(voice_media_channel()->IsStreamMuted(kAudioSsrc));
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700590
591 audio_track_->set_enabled(true);
Harald Alvestrand485457f2022-05-23 08:46:57 +0000592 EXPECT_FALSE(voice_media_channel()->IsStreamMuted(kAudioSsrc));
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700593
594 DestroyAudioRtpSender();
595}
596
597// Test that the volume is set to 0 when the track is disabled, and back to
598// 1 when the track is enabled.
deadbeef70ab1a12015-09-28 16:53:55 -0700599TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
600 CreateAudioRtpReceiver();
601
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700602 double volume;
Harald Alvestrand485457f2022-05-23 08:46:57 +0000603 EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700604 EXPECT_EQ(1, volume);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700605
Tommi4ccdf932021-05-17 14:50:10 +0200606 // Handling of enable/disable is applied asynchronously.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700607 audio_track_->set_enabled(false);
Tommi4ccdf932021-05-17 14:50:10 +0200608 run_loop_.Flush();
609
Harald Alvestrand485457f2022-05-23 08:46:57 +0000610 EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700611 EXPECT_EQ(0, volume);
612
deadbeef70ab1a12015-09-28 16:53:55 -0700613 audio_track_->set_enabled(true);
Tommi4ccdf932021-05-17 14:50:10 +0200614 run_loop_.Flush();
Harald Alvestrand485457f2022-05-23 08:46:57 +0000615 EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700616 EXPECT_EQ(1, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700617
618 DestroyAudioRtpReceiver();
619}
620
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700621// Currently no action is taken when a remote video track is disabled or
622// enabled, so there's nothing to test here, other than what is normally
623// verified in DestroyVideoRtpSender.
deadbeef70ab1a12015-09-28 16:53:55 -0700624TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
625 CreateVideoRtpSender();
626
deadbeef70ab1a12015-09-28 16:53:55 -0700627 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700628 video_track_->set_enabled(true);
629
630 DestroyVideoRtpSender();
631}
632
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700633// Test that the state of the video track created by the VideoRtpReceiver is
634// updated when the receiver is destroyed.
perkjf0dcfe22016-03-10 18:32:00 +0100635TEST_F(RtpSenderReceiverTest, RemoteVideoTrackState) {
636 CreateVideoRtpReceiver();
637
638 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track_->state());
639 EXPECT_EQ(webrtc::MediaSourceInterface::kLive,
640 video_track_->GetSource()->state());
641
642 DestroyVideoRtpReceiver();
643
644 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track_->state());
645 EXPECT_EQ(webrtc::MediaSourceInterface::kEnded,
646 video_track_->GetSource()->state());
Tommi4ccdf932021-05-17 14:50:10 +0200647 DestroyVideoRtpReceiver();
perkjf0dcfe22016-03-10 18:32:00 +0100648}
649
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700650// Currently no action is taken when a remote video track is disabled or
651// enabled, so there's nothing to test here, other than what is normally
652// verified in DestroyVideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700653TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
654 CreateVideoRtpReceiver();
655
656 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700657 video_track_->set_enabled(true);
658
659 DestroyVideoRtpReceiver();
660}
661
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700662// Test that the AudioRtpReceiver applies volume changes from the track source
663// to the media channel.
deadbeef70ab1a12015-09-28 16:53:55 -0700664TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
665 CreateAudioRtpReceiver();
666
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700667 double volume;
668 audio_track_->GetSource()->SetVolume(0.5);
Tommi4ccdf932021-05-17 14:50:10 +0200669 run_loop_.Flush();
Harald Alvestrand485457f2022-05-23 08:46:57 +0000670 EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700671 EXPECT_EQ(0.5, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700672
673 // Disable the audio track, this should prevent setting the volume.
deadbeef70ab1a12015-09-28 16:53:55 -0700674 audio_track_->set_enabled(false);
Tommi4ccdf932021-05-17 14:50:10 +0200675 RTC_DCHECK_EQ(worker_thread_, run_loop_.task_queue());
676 run_loop_.Flush();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700677 audio_track_->GetSource()->SetVolume(0.8);
Harald Alvestrand485457f2022-05-23 08:46:57 +0000678 EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700679 EXPECT_EQ(0, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700680
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700681 // When the track is enabled, the previously set volume should take effect.
deadbeef70ab1a12015-09-28 16:53:55 -0700682 audio_track_->set_enabled(true);
Tommi4ccdf932021-05-17 14:50:10 +0200683 run_loop_.Flush();
Harald Alvestrand485457f2022-05-23 08:46:57 +0000684 EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700685 EXPECT_EQ(0.8, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700686
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700687 // Try changing volume one more time.
688 audio_track_->GetSource()->SetVolume(0.9);
Tommi4ccdf932021-05-17 14:50:10 +0200689 run_loop_.Flush();
Harald Alvestrand485457f2022-05-23 08:46:57 +0000690 EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700691 EXPECT_EQ(0.9, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700692
693 DestroyAudioRtpReceiver();
694}
695
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200696TEST_F(RtpSenderReceiverTest, AudioRtpReceiverDelay) {
697 CreateAudioRtpReceiver();
Harald Alvestrandc0d44d92022-12-13 12:57:24 +0000698 VerifyRtpReceiverDelayBehaviour(
699 voice_media_channel()->AsVoiceReceiveChannel(), audio_rtp_receiver_.get(),
700 kAudioSsrc);
Tommi4ccdf932021-05-17 14:50:10 +0200701 DestroyAudioRtpReceiver();
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200702}
703
704TEST_F(RtpSenderReceiverTest, VideoRtpReceiverDelay) {
705 CreateVideoRtpReceiver();
Harald Alvestrandc0d44d92022-12-13 12:57:24 +0000706 VerifyRtpReceiverDelayBehaviour(
707 video_media_channel()->AsVideoReceiveChannel(), video_rtp_receiver_.get(),
708 kVideoSsrc);
Tommi4ccdf932021-05-17 14:50:10 +0200709 DestroyVideoRtpReceiver();
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200710}
711
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700712// Test that the media channel isn't enabled for sending if the audio sender
713// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800714TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800715 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800716 rtc::scoped_refptr<AudioTrackInterface> track =
717 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700718
719 // Track but no SSRC.
Niels Möllerafb246b2022-04-20 14:26:50 +0200720 EXPECT_TRUE(audio_rtp_sender_->SetTrack(track.get()));
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700721 VerifyVoiceChannelNoInput();
722
723 // SSRC but no track.
724 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
725 audio_rtp_sender_->SetSsrc(kAudioSsrc);
726 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800727}
728
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700729// Test that the media channel isn't enabled for sending if the video sender
730// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800731TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800732 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700733
734 // Track but no SSRC.
Niels Möllerafb246b2022-04-20 14:26:50 +0200735 EXPECT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700736 VerifyVideoChannelNoInput();
737
738 // SSRC but no track.
739 EXPECT_TRUE(video_rtp_sender_->SetTrack(nullptr));
740 video_rtp_sender_->SetSsrc(kVideoSsrc);
741 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800742}
743
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700744// Test that the media channel is enabled for sending when the audio sender
745// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800746TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800747 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800748 rtc::scoped_refptr<AudioTrackInterface> track =
749 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700750 audio_rtp_sender_->SetSsrc(kAudioSsrc);
Niels Möllerafb246b2022-04-20 14:26:50 +0200751 audio_rtp_sender_->SetTrack(track.get());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700752 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800753
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700754 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800755}
756
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700757// Test that the media channel is enabled for sending when the audio sender
758// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800759TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800760 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800761 rtc::scoped_refptr<AudioTrackInterface> track =
762 AudioTrack::Create(kAudioTrackId, nullptr);
Niels Möllerafb246b2022-04-20 14:26:50 +0200763 audio_rtp_sender_->SetTrack(track.get());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700764 audio_rtp_sender_->SetSsrc(kAudioSsrc);
765 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800766
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700767 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800768}
769
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700770// Test that the media channel is enabled for sending when the video sender
771// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800772TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
nisseaf510af2016-03-21 08:20:42 -0700773 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800774 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700775 video_rtp_sender_->SetSsrc(kVideoSsrc);
Niels Möllerafb246b2022-04-20 14:26:50 +0200776 video_rtp_sender_->SetTrack(video_track_.get());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700777 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800778
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700779 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800780}
781
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700782// Test that the media channel is enabled for sending when the video sender
783// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800784TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
nisseaf510af2016-03-21 08:20:42 -0700785 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800786 CreateVideoRtpSenderWithNoTrack();
Niels Möllerafb246b2022-04-20 14:26:50 +0200787 video_rtp_sender_->SetTrack(video_track_.get());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700788 video_rtp_sender_->SetSsrc(kVideoSsrc);
789 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800790
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700791 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800792}
793
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700794// Test that the media channel stops sending when the audio sender's SSRC is set
795// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800796TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700797 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800798
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700799 audio_rtp_sender_->SetSsrc(0);
800 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800801}
802
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700803// Test that the media channel stops sending when the video sender's SSRC is set
804// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800805TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700806 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800807
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700808 audio_rtp_sender_->SetSsrc(0);
809 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800810}
811
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700812// Test that the media channel stops sending when the audio sender's track is
813// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800814TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700815 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800816
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700817 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
818 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800819}
820
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700821// Test that the media channel stops sending when the video sender's track is
822// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800823TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700824 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800825
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700826 video_rtp_sender_->SetSsrc(0);
827 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800828}
829
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700830// Test that when the audio sender's SSRC is changed, the media channel stops
831// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800832TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700833 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800834
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700835 audio_rtp_sender_->SetSsrc(kAudioSsrc2);
836 VerifyVoiceChannelNoInput(kAudioSsrc);
837 VerifyVoiceChannelInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800838
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700839 audio_rtp_sender_ = nullptr;
840 VerifyVoiceChannelNoInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800841}
842
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700843// Test that when the audio sender's SSRC is changed, the media channel stops
844// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800845TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700846 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800847
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700848 video_rtp_sender_->SetSsrc(kVideoSsrc2);
849 VerifyVideoChannelNoInput(kVideoSsrc);
850 VerifyVideoChannelInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800851
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700852 video_rtp_sender_ = nullptr;
853 VerifyVideoChannelNoInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800854}
855
skvladdc1c62c2016-03-16 19:07:43 -0700856TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) {
857 CreateAudioRtpSender();
858
skvladdc1c62c2016-03-16 19:07:43 -0700859 RtpParameters params = audio_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700860 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -0800861 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -0700862
863 DestroyAudioRtpSender();
864}
865
Florent Castelliacabb362022-10-18 17:05:16 +0200866TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParametersAsync) {
867 CreateAudioRtpSender();
868
869 RtpParameters params = audio_rtp_sender_->GetParameters();
870 EXPECT_EQ(1u, params.encodings.size());
871 absl::optional<webrtc::RTCError> result;
872 audio_rtp_sender_->SetParametersAsync(
873 params, [&result](webrtc::RTCError error) { result = error; });
874 run_loop_.Flush();
875 EXPECT_TRUE(result->ok());
876
877 DestroyAudioRtpSender();
878}
879
Florent Castelli892acf02018-10-01 22:47:20 +0200880TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParametersBeforeNegotiation) {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800881 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200882 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +0200883
884 RtpParameters params = audio_rtp_sender_->GetParameters();
885 ASSERT_EQ(1u, params.encodings.size());
886 params.encodings[0].max_bitrate_bps = 90000;
887 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
888
889 params = audio_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +0200890 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
Florent Castelliacabb362022-10-18 17:05:16 +0200891 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
892
893 DestroyAudioRtpSender();
894}
895
896TEST_F(RtpSenderReceiverTest,
897 AudioSenderCanSetParametersAsyncBeforeNegotiation) {
898 audio_rtp_sender_ =
899 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
900
901 absl::optional<webrtc::RTCError> result;
902 RtpParameters params = audio_rtp_sender_->GetParameters();
903 ASSERT_EQ(1u, params.encodings.size());
904 params.encodings[0].max_bitrate_bps = 90000;
905
906 audio_rtp_sender_->SetParametersAsync(
907 params, [&result](webrtc::RTCError error) { result = error; });
908 run_loop_.Flush();
909 EXPECT_TRUE(result->ok());
910
911 params = audio_rtp_sender_->GetParameters();
912 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
913
914 audio_rtp_sender_->SetParametersAsync(
915 params, [&result](webrtc::RTCError error) { result = error; });
916 run_loop_.Flush();
917 EXPECT_TRUE(result->ok());
Florent Castelli892acf02018-10-01 22:47:20 +0200918
919 DestroyAudioRtpSender();
920}
921
922TEST_F(RtpSenderReceiverTest, AudioSenderInitParametersMovedAfterNegotiation) {
923 audio_track_ = AudioTrack::Create(kAudioTrackId, nullptr);
Harald Alvestrand2f7ad282022-04-21 11:35:43 +0000924 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
Florent Castelli892acf02018-10-01 22:47:20 +0200925
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200926 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200927 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200928 audio_rtp_sender_ = AudioRtpSender::Create(
929 worker_thread_, audio_track_->id(), nullptr, set_streams_observer.get());
Niels Möllerafb246b2022-04-20 14:26:50 +0200930 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_.get()));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200931 EXPECT_CALL(*set_streams_observer, OnSetStreams());
932 audio_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli892acf02018-10-01 22:47:20 +0200933
934 std::vector<RtpEncodingParameters> init_encodings(1);
935 init_encodings[0].max_bitrate_bps = 60000;
936 audio_rtp_sender_->set_init_send_encodings(init_encodings);
937
938 RtpParameters params = audio_rtp_sender_->GetParameters();
939 ASSERT_EQ(1u, params.encodings.size());
940 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
941
942 // Simulate the setLocalDescription call
943 std::vector<uint32_t> ssrcs(1, 1);
944 cricket::StreamParams stream_params =
945 cricket::CreateSimStreamParams("cname", ssrcs);
Harald Alvestrand485457f2022-05-23 08:46:57 +0000946 voice_media_channel()->AddSendStream(stream_params);
Harald Alvestrandc0d44d92022-12-13 12:57:24 +0000947 audio_rtp_sender_->SetMediaChannel(
948 voice_media_channel()->AsVoiceSendChannel());
Florent Castelli892acf02018-10-01 22:47:20 +0200949 audio_rtp_sender_->SetSsrc(1);
950
951 params = audio_rtp_sender_->GetParameters();
952 ASSERT_EQ(1u, params.encodings.size());
953 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
954
955 DestroyAudioRtpSender();
956}
957
958TEST_F(RtpSenderReceiverTest,
959 AudioSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800960 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200961 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +0200962
963 RtpParameters params;
964 RTCError result = audio_rtp_sender_->SetParameters(params);
965 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
966 DestroyAudioRtpSender();
967}
968
Florent Castellicebf50f2018-05-03 15:31:53 +0200969TEST_F(RtpSenderReceiverTest,
970 AudioSenderMustCallGetParametersBeforeSetParameters) {
971 CreateAudioRtpSender();
972
973 RtpParameters params;
974 RTCError result = audio_rtp_sender_->SetParameters(params);
975 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
976
977 DestroyAudioRtpSender();
978}
979
980TEST_F(RtpSenderReceiverTest,
981 AudioSenderSetParametersInvalidatesTransactionId) {
982 CreateAudioRtpSender();
983
984 RtpParameters params = audio_rtp_sender_->GetParameters();
985 EXPECT_EQ(1u, params.encodings.size());
986 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
987 RTCError result = audio_rtp_sender_->SetParameters(params);
988 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
989
990 DestroyAudioRtpSender();
991}
992
Florent Castelliacabb362022-10-18 17:05:16 +0200993TEST_F(RtpSenderReceiverTest,
994 AudioSenderSetParametersAsyncInvalidatesTransactionId) {
995 CreateAudioRtpSender();
996
997 RtpParameters params = audio_rtp_sender_->GetParameters();
998 EXPECT_EQ(1u, params.encodings.size());
999 absl::optional<webrtc::RTCError> result;
1000 audio_rtp_sender_->SetParametersAsync(
1001 params, [&result](webrtc::RTCError error) { result = error; });
1002 run_loop_.Flush();
1003 EXPECT_TRUE(result->ok());
1004 audio_rtp_sender_->SetParametersAsync(
1005 params, [&result](webrtc::RTCError error) { result = error; });
1006 run_loop_.Flush();
1007 EXPECT_EQ(RTCErrorType::INVALID_STATE, result->type());
1008
1009 DestroyAudioRtpSender();
1010}
1011
Florent Castellicebf50f2018-05-03 15:31:53 +02001012TEST_F(RtpSenderReceiverTest, AudioSenderDetectTransactionIdModification) {
1013 CreateAudioRtpSender();
1014
1015 RtpParameters params = audio_rtp_sender_->GetParameters();
1016 params.transaction_id = "";
1017 RTCError result = audio_rtp_sender_->SetParameters(params);
1018 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1019
1020 DestroyAudioRtpSender();
1021}
1022
1023TEST_F(RtpSenderReceiverTest, AudioSenderCheckTransactionIdRefresh) {
1024 CreateAudioRtpSender();
1025
1026 RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001027 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 15:31:53 +02001028 auto saved_transaction_id = params.transaction_id;
1029 params = audio_rtp_sender_->GetParameters();
1030 EXPECT_NE(saved_transaction_id, params.transaction_id);
1031
1032 DestroyAudioRtpSender();
1033}
1034
1035TEST_F(RtpSenderReceiverTest, AudioSenderSetParametersOldValueFail) {
1036 CreateAudioRtpSender();
1037
1038 RtpParameters params = audio_rtp_sender_->GetParameters();
1039 RtpParameters second_params = audio_rtp_sender_->GetParameters();
1040
1041 RTCError result = audio_rtp_sender_->SetParameters(params);
1042 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
Seth Hampson2d2c8882018-05-16 16:02:32 -07001043 DestroyAudioRtpSender();
1044}
1045
1046TEST_F(RtpSenderReceiverTest, AudioSenderCantSetUnimplementedRtpParameters) {
1047 CreateAudioRtpSender();
1048 RtpParameters params = audio_rtp_sender_->GetParameters();
1049 EXPECT_EQ(1u, params.encodings.size());
1050
Florent Castelli87b3c512018-07-18 16:00:28 +02001051 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 16:02:32 -07001052 params.mid = "dummy_mid";
1053 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1054 audio_rtp_sender_->SetParameters(params).type());
1055 params = audio_rtp_sender_->GetParameters();
1056
Seth Hampson2d2c8882018-05-16 16:02:32 -07001057 DestroyAudioRtpSender();
1058}
1059
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001060TEST_F(RtpSenderReceiverTest, SetAudioMaxSendBitrate) {
1061 CreateAudioRtpSender();
1062
Harald Alvestrand485457f2022-05-23 08:46:57 +00001063 EXPECT_EQ(-1, voice_media_channel()->max_bps());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001064 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001065 EXPECT_EQ(1U, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -08001066 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001067 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -08001068 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001069
1070 // Read back the parameters and verify they have been changed.
1071 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001072 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001073 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001074
1075 // Verify that the audio channel received the new parameters.
Harald Alvestrand485457f2022-05-23 08:46:57 +00001076 params = voice_media_channel()->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001077 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001078 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001079
1080 // Verify that the global bitrate limit has not been changed.
Harald Alvestrand485457f2022-05-23 08:46:57 +00001081 EXPECT_EQ(-1, voice_media_channel()->max_bps());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001082
1083 DestroyAudioRtpSender();
1084}
1085
Seth Hampson24722b32017-12-22 09:36:42 -08001086TEST_F(RtpSenderReceiverTest, SetAudioBitratePriority) {
1087 CreateAudioRtpSender();
1088
1089 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001090 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001091 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1092 params.encodings[0].bitrate_priority);
1093 double new_bitrate_priority = 2.0;
1094 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -08001095 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -08001096
1097 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001098 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001099 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1100
Harald Alvestrand485457f2022-05-23 08:46:57 +00001101 params = voice_media_channel()->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001102 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001103 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1104
1105 DestroyAudioRtpSender();
1106}
1107
skvladdc1c62c2016-03-16 19:07:43 -07001108TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) {
1109 CreateVideoRtpSender();
1110
skvladdc1c62c2016-03-16 19:07:43 -07001111 RtpParameters params = video_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001112 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -08001113 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -07001114
1115 DestroyVideoRtpSender();
1116}
1117
Florent Castelliacabb362022-10-18 17:05:16 +02001118TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParametersAsync) {
1119 CreateVideoRtpSender();
1120
1121 RtpParameters params = video_rtp_sender_->GetParameters();
1122 EXPECT_EQ(1u, params.encodings.size());
1123 absl::optional<webrtc::RTCError> result;
1124 video_rtp_sender_->SetParametersAsync(
1125 params, [&result](webrtc::RTCError error) { result = error; });
1126 run_loop_.Flush();
1127 EXPECT_TRUE(result->ok());
1128
1129 DestroyVideoRtpSender();
1130}
1131
Florent Castelli892acf02018-10-01 22:47:20 +02001132TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParametersBeforeNegotiation) {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001133 video_rtp_sender_ =
1134 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +02001135
1136 RtpParameters params = video_rtp_sender_->GetParameters();
1137 ASSERT_EQ(1u, params.encodings.size());
1138 params.encodings[0].max_bitrate_bps = 90000;
1139 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1140
1141 params = video_rtp_sender_->GetParameters();
1142 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1143 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
1144
1145 DestroyVideoRtpSender();
1146}
1147
Florent Castelliacabb362022-10-18 17:05:16 +02001148TEST_F(RtpSenderReceiverTest,
1149 VideoSenderCanSetParametersAsyncBeforeNegotiation) {
1150 video_rtp_sender_ =
1151 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
1152
1153 absl::optional<webrtc::RTCError> result;
1154 RtpParameters params = video_rtp_sender_->GetParameters();
1155 ASSERT_EQ(1u, params.encodings.size());
1156 params.encodings[0].max_bitrate_bps = 90000;
1157 video_rtp_sender_->SetParametersAsync(
1158 params, [&result](webrtc::RTCError error) { result = error; });
1159 run_loop_.Flush();
1160 EXPECT_TRUE(result->ok());
1161
1162 params = video_rtp_sender_->GetParameters();
1163 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
1164 video_rtp_sender_->SetParametersAsync(
1165 params, [&result](webrtc::RTCError error) { result = error; });
1166 run_loop_.Flush();
1167 EXPECT_TRUE(result->ok());
1168
1169 DestroyVideoRtpSender();
1170}
1171
Florent Castelli892acf02018-10-01 22:47:20 +02001172TEST_F(RtpSenderReceiverTest, VideoSenderInitParametersMovedAfterNegotiation) {
1173 AddVideoTrack(false);
1174
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001175 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001176 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001177 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1178 set_streams_observer.get());
Niels Möllerafb246b2022-04-20 14:26:50 +02001179 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001180 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1181 video_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli892acf02018-10-01 22:47:20 +02001182
1183 std::vector<RtpEncodingParameters> init_encodings(2);
1184 init_encodings[0].max_bitrate_bps = 60000;
1185 init_encodings[1].max_bitrate_bps = 900000;
1186 video_rtp_sender_->set_init_send_encodings(init_encodings);
1187
1188 RtpParameters params = video_rtp_sender_->GetParameters();
1189 ASSERT_EQ(2u, params.encodings.size());
1190 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1191 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
1192
1193 // Simulate the setLocalDescription call
1194 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +01001195 ssrcs.reserve(2);
Florent Castelli892acf02018-10-01 22:47:20 +02001196 for (int i = 0; i < 2; ++i)
1197 ssrcs.push_back(kVideoSsrcSimulcast + i);
1198 cricket::StreamParams stream_params =
1199 cricket::CreateSimStreamParams("cname", ssrcs);
Harald Alvestrand485457f2022-05-23 08:46:57 +00001200 video_media_channel()->AddSendStream(stream_params);
Harald Alvestrandc0d44d92022-12-13 12:57:24 +00001201 video_rtp_sender_->SetMediaChannel(
1202 video_media_channel()->AsVideoSendChannel());
Florent Castelli892acf02018-10-01 22:47:20 +02001203 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
1204
1205 params = video_rtp_sender_->GetParameters();
1206 ASSERT_EQ(2u, params.encodings.size());
1207 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1208 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
1209
1210 DestroyVideoRtpSender();
1211}
1212
1213TEST_F(RtpSenderReceiverTest,
1214 VideoSenderInitParametersMovedAfterManualSimulcastAndNegotiation) {
1215 AddVideoTrack(false);
1216
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001217 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001218 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001219 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1220 set_streams_observer.get());
Niels Möllerafb246b2022-04-20 14:26:50 +02001221 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001222 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1223 video_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli892acf02018-10-01 22:47:20 +02001224
1225 std::vector<RtpEncodingParameters> init_encodings(1);
1226 init_encodings[0].max_bitrate_bps = 60000;
1227 video_rtp_sender_->set_init_send_encodings(init_encodings);
1228
1229 RtpParameters params = video_rtp_sender_->GetParameters();
1230 ASSERT_EQ(1u, params.encodings.size());
1231 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1232
1233 // Simulate the setLocalDescription call as if the user used SDP munging
1234 // to enable simulcast
1235 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +01001236 ssrcs.reserve(2);
Florent Castelli892acf02018-10-01 22:47:20 +02001237 for (int i = 0; i < 2; ++i)
1238 ssrcs.push_back(kVideoSsrcSimulcast + i);
1239 cricket::StreamParams stream_params =
1240 cricket::CreateSimStreamParams("cname", ssrcs);
Harald Alvestrand485457f2022-05-23 08:46:57 +00001241 video_media_channel()->AddSendStream(stream_params);
Harald Alvestrandc0d44d92022-12-13 12:57:24 +00001242 video_rtp_sender_->SetMediaChannel(
1243 video_media_channel()->AsVideoSendChannel());
Florent Castelli892acf02018-10-01 22:47:20 +02001244 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
1245
1246 params = video_rtp_sender_->GetParameters();
1247 ASSERT_EQ(2u, params.encodings.size());
1248 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1249
1250 DestroyVideoRtpSender();
1251}
1252
Harald Alvestrand3fe8b0d2022-07-01 07:36:59 +00001253#if GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
1254using RtpSenderReceiverDeathTest = RtpSenderReceiverTest;
1255
1256TEST_F(RtpSenderReceiverDeathTest,
1257 VideoSenderManualRemoveSimulcastFailsDeathTest) {
1258 AddVideoTrack(false);
1259
1260 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
1261 std::make_unique<MockSetStreamsObserver>();
1262 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1263 set_streams_observer.get());
1264 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
1265 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1266 video_rtp_sender_->SetStreams({local_stream_->id()});
1267
1268 std::vector<RtpEncodingParameters> init_encodings(2);
1269 init_encodings[0].max_bitrate_bps = 60000;
1270 init_encodings[1].max_bitrate_bps = 120000;
1271 video_rtp_sender_->set_init_send_encodings(init_encodings);
1272
1273 RtpParameters params = video_rtp_sender_->GetParameters();
1274 ASSERT_EQ(2u, params.encodings.size());
1275 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1276
1277 // Simulate the setLocalDescription call as if the user used SDP munging
1278 // to disable simulcast.
1279 std::vector<uint32_t> ssrcs;
1280 ssrcs.reserve(2);
1281 for (int i = 0; i < 2; ++i)
1282 ssrcs.push_back(kVideoSsrcSimulcast + i);
1283 cricket::StreamParams stream_params =
1284 cricket::StreamParams::CreateLegacy(kVideoSsrc);
1285 video_media_channel()->AddSendStream(stream_params);
Harald Alvestrandc0d44d92022-12-13 12:57:24 +00001286 video_rtp_sender_->SetMediaChannel(
1287 video_media_channel()->AsVideoSendChannel());
Harald Alvestrand3fe8b0d2022-07-01 07:36:59 +00001288 EXPECT_DEATH(video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast), "");
1289}
1290#endif
1291
Florent Castelli892acf02018-10-01 22:47:20 +02001292TEST_F(RtpSenderReceiverTest,
1293 VideoSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001294 video_rtp_sender_ =
1295 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +02001296
1297 RtpParameters params;
1298 RTCError result = video_rtp_sender_->SetParameters(params);
1299 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1300 DestroyVideoRtpSender();
1301}
1302
Florent Castellicebf50f2018-05-03 15:31:53 +02001303TEST_F(RtpSenderReceiverTest,
1304 VideoSenderMustCallGetParametersBeforeSetParameters) {
1305 CreateVideoRtpSender();
1306
1307 RtpParameters params;
1308 RTCError result = video_rtp_sender_->SetParameters(params);
1309 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1310
1311 DestroyVideoRtpSender();
1312}
1313
1314TEST_F(RtpSenderReceiverTest,
1315 VideoSenderSetParametersInvalidatesTransactionId) {
1316 CreateVideoRtpSender();
1317
1318 RtpParameters params = video_rtp_sender_->GetParameters();
1319 EXPECT_EQ(1u, params.encodings.size());
1320 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1321 RTCError result = video_rtp_sender_->SetParameters(params);
1322 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1323
1324 DestroyVideoRtpSender();
1325}
1326
Florent Castelliacabb362022-10-18 17:05:16 +02001327TEST_F(RtpSenderReceiverTest,
1328 VideoSenderSetParametersAsyncInvalidatesTransactionId) {
1329 CreateVideoRtpSender();
1330
1331 RtpParameters params = video_rtp_sender_->GetParameters();
1332 EXPECT_EQ(1u, params.encodings.size());
1333 absl::optional<webrtc::RTCError> result;
1334 video_rtp_sender_->SetParametersAsync(
1335 params, [&result](webrtc::RTCError error) { result = error; });
1336 run_loop_.Flush();
1337 EXPECT_TRUE(result->ok());
1338 video_rtp_sender_->SetParametersAsync(
1339 params, [&result](webrtc::RTCError error) { result = error; });
1340 run_loop_.Flush();
1341 EXPECT_EQ(RTCErrorType::INVALID_STATE, result->type());
1342
1343 DestroyVideoRtpSender();
1344}
1345
Florent Castellicebf50f2018-05-03 15:31:53 +02001346TEST_F(RtpSenderReceiverTest, VideoSenderDetectTransactionIdModification) {
1347 CreateVideoRtpSender();
1348
1349 RtpParameters params = video_rtp_sender_->GetParameters();
1350 params.transaction_id = "";
1351 RTCError result = video_rtp_sender_->SetParameters(params);
1352 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1353
1354 DestroyVideoRtpSender();
1355}
1356
1357TEST_F(RtpSenderReceiverTest, VideoSenderCheckTransactionIdRefresh) {
1358 CreateVideoRtpSender();
1359
1360 RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001361 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 15:31:53 +02001362 auto saved_transaction_id = params.transaction_id;
1363 params = video_rtp_sender_->GetParameters();
1364 EXPECT_NE(saved_transaction_id, params.transaction_id);
1365
1366 DestroyVideoRtpSender();
1367}
1368
1369TEST_F(RtpSenderReceiverTest, VideoSenderSetParametersOldValueFail) {
1370 CreateVideoRtpSender();
1371
1372 RtpParameters params = video_rtp_sender_->GetParameters();
1373 RtpParameters second_params = video_rtp_sender_->GetParameters();
1374
1375 RTCError result = video_rtp_sender_->SetParameters(params);
1376 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1377
1378 DestroyVideoRtpSender();
1379}
1380
Seth Hampson2d2c8882018-05-16 16:02:32 -07001381TEST_F(RtpSenderReceiverTest, VideoSenderCantSetUnimplementedRtpParameters) {
1382 CreateVideoRtpSender();
1383 RtpParameters params = video_rtp_sender_->GetParameters();
1384 EXPECT_EQ(1u, params.encodings.size());
1385
Florent Castelli87b3c512018-07-18 16:00:28 +02001386 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 16:02:32 -07001387 params.mid = "dummy_mid";
1388 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1389 video_rtp_sender_->SetParameters(params).type());
1390 params = video_rtp_sender_->GetParameters();
1391
Seth Hampson2d2c8882018-05-16 16:02:32 -07001392 DestroyVideoRtpSender();
1393}
1394
Florent Castellic1a0bcb2019-01-29 14:26:48 +01001395TEST_F(RtpSenderReceiverTest, VideoSenderCanSetScaleResolutionDownBy) {
1396 CreateVideoRtpSender();
1397
1398 RtpParameters params = video_rtp_sender_->GetParameters();
1399 params.encodings[0].scale_resolution_down_by = 2;
1400
1401 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1402 params = video_rtp_sender_->GetParameters();
1403 EXPECT_EQ(2, params.encodings[0].scale_resolution_down_by);
1404
1405 DestroyVideoRtpSender();
1406}
1407
1408TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidScaleResolutionDownBy) {
1409 CreateVideoRtpSender();
1410
1411 RtpParameters params = video_rtp_sender_->GetParameters();
1412 params.encodings[0].scale_resolution_down_by = 0.5;
1413 RTCError result = video_rtp_sender_->SetParameters(params);
1414 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1415
1416 DestroyVideoRtpSender();
1417}
1418
Ă…sa Perssonfb195962021-08-16 16:41:56 +02001419TEST_F(RtpSenderReceiverTest, VideoSenderCanSetNumTemporalLayers) {
1420 CreateVideoRtpSender();
1421
1422 RtpParameters params = video_rtp_sender_->GetParameters();
1423 params.encodings[0].num_temporal_layers = 2;
1424
1425 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1426 params = video_rtp_sender_->GetParameters();
1427 EXPECT_EQ(2, params.encodings[0].num_temporal_layers);
1428
1429 DestroyVideoRtpSender();
1430}
1431
1432TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidNumTemporalLayers) {
1433 CreateVideoRtpSender();
1434
1435 RtpParameters params = video_rtp_sender_->GetParameters();
1436 params.encodings[0].num_temporal_layers = webrtc::kMaxTemporalStreams + 1;
1437 RTCError result = video_rtp_sender_->SetParameters(params);
1438 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1439
1440 DestroyVideoRtpSender();
1441}
1442
Florent Castelli907dc802019-12-06 15:03:19 +01001443TEST_F(RtpSenderReceiverTest, VideoSenderCanSetMaxFramerate) {
1444 CreateVideoRtpSender();
1445
1446 RtpParameters params = video_rtp_sender_->GetParameters();
1447 params.encodings[0].max_framerate = 20;
1448
1449 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1450 params = video_rtp_sender_->GetParameters();
1451 EXPECT_EQ(20., params.encodings[0].max_framerate);
1452
1453 DestroyVideoRtpSender();
1454}
1455
1456TEST_F(RtpSenderReceiverTest, VideoSenderCanSetMaxFramerateZero) {
1457 CreateVideoRtpSender();
1458
1459 RtpParameters params = video_rtp_sender_->GetParameters();
1460 params.encodings[0].max_framerate = 0.;
1461
1462 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1463 params = video_rtp_sender_->GetParameters();
1464 EXPECT_EQ(0., params.encodings[0].max_framerate);
1465
1466 DestroyVideoRtpSender();
1467}
1468
1469TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidMaxFramerate) {
1470 CreateVideoRtpSender();
1471
1472 RtpParameters params = video_rtp_sender_->GetParameters();
1473 params.encodings[0].max_framerate = -5.;
1474 RTCError result = video_rtp_sender_->SetParameters(params);
1475 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1476
1477 DestroyVideoRtpSender();
1478}
1479
Seth Hampson2d2c8882018-05-16 16:02:32 -07001480// A video sender can have multiple simulcast layers, in which case it will
1481// contain multiple RtpEncodingParameters. This tests that if this is the case
1482// (simulcast), then we can't set the bitrate_priority, or max_bitrate_bps
1483// for any encodings besides at index 0, because these are both implemented
1484// "per-sender."
1485TEST_F(RtpSenderReceiverTest, VideoSenderCantSetPerSenderEncodingParameters) {
1486 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001487 CreateVideoRtpSenderWithSimulcast();
Seth Hampson2d2c8882018-05-16 16:02:32 -07001488 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001489 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Seth Hampson2d2c8882018-05-16 16:02:32 -07001490
1491 params.encodings[1].bitrate_priority = 2.0;
1492 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1493 video_rtp_sender_->SetParameters(params).type());
1494 params = video_rtp_sender_->GetParameters();
1495
Seth Hampson2d2c8882018-05-16 16:02:32 -07001496 DestroyVideoRtpSender();
1497}
1498
Florent Castelli892acf02018-10-01 22:47:20 +02001499TEST_F(RtpSenderReceiverTest, VideoSenderCantSetReadOnlyEncodingParameters) {
1500 // Add a simulcast specific send stream that contains 2 encoding parameters.
1501 CreateVideoRtpSenderWithSimulcast();
1502 RtpParameters params = video_rtp_sender_->GetParameters();
1503 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
1504
1505 for (size_t i = 0; i < params.encodings.size(); i++) {
1506 params.encodings[i].ssrc = 1337;
1507 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION,
1508 video_rtp_sender_->SetParameters(params).type());
1509 params = video_rtp_sender_->GetParameters();
1510 }
1511
1512 DestroyVideoRtpSender();
1513}
1514
Ă…sa Persson55659812018-06-18 17:51:32 +02001515TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrate) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001516 CreateVideoRtpSender();
1517
Harald Alvestrand485457f2022-05-23 08:46:57 +00001518 EXPECT_EQ(-1, video_media_channel()->max_bps());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001519 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001520 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001521 EXPECT_FALSE(params.encodings[0].min_bitrate_bps);
deadbeefe702b302017-02-04 12:09:01 -08001522 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Ă…sa Persson55659812018-06-18 17:51:32 +02001523 params.encodings[0].min_bitrate_bps = 100;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001524 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -08001525 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001526
1527 // Read back the parameters and verify they have been changed.
1528 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001529 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001530 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001531 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001532
1533 // Verify that the video channel received the new parameters.
Harald Alvestrand485457f2022-05-23 08:46:57 +00001534 params = video_media_channel()->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001535 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001536 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001537 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001538
1539 // Verify that the global bitrate limit has not been changed.
Harald Alvestrand485457f2022-05-23 08:46:57 +00001540 EXPECT_EQ(-1, video_media_channel()->max_bps());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001541
1542 DestroyVideoRtpSender();
1543}
1544
Ă…sa Persson55659812018-06-18 17:51:32 +02001545TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrateSimulcast) {
1546 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001547 CreateVideoRtpSenderWithSimulcast();
Ă…sa Persson55659812018-06-18 17:51:32 +02001548
1549 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001550 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001551 params.encodings[0].min_bitrate_bps = 100;
1552 params.encodings[0].max_bitrate_bps = 1000;
1553 params.encodings[1].min_bitrate_bps = 200;
1554 params.encodings[1].max_bitrate_bps = 2000;
1555 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1556
1557 // Verify that the video channel received the new parameters.
Harald Alvestrand485457f2022-05-23 08:46:57 +00001558 params = video_media_channel()->GetRtpSendParameters(kVideoSsrcSimulcast);
Florent Castelli892acf02018-10-01 22:47:20 +02001559 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001560 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
1561 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
1562 EXPECT_EQ(200, params.encodings[1].min_bitrate_bps);
1563 EXPECT_EQ(2000, params.encodings[1].max_bitrate_bps);
1564
1565 DestroyVideoRtpSender();
1566}
1567
Seth Hampson24722b32017-12-22 09:36:42 -08001568TEST_F(RtpSenderReceiverTest, SetVideoBitratePriority) {
1569 CreateVideoRtpSender();
1570
1571 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001572 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001573 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1574 params.encodings[0].bitrate_priority);
1575 double new_bitrate_priority = 2.0;
1576 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -08001577 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -08001578
1579 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001580 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001581 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1582
Harald Alvestrand485457f2022-05-23 08:46:57 +00001583 params = video_media_channel()->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001584 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001585 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1586
1587 DestroyVideoRtpSender();
1588}
1589
Florent Castelli38332cd2018-11-20 14:08:06 +01001590TEST_F(RtpSenderReceiverTest, VideoReceiverCanGetParametersWithSimulcast) {
1591 CreateVideoRtpReceiverWithSimulcast({}, 2);
1592
1593 RtpParameters params = video_rtp_receiver_->GetParameters();
1594 EXPECT_EQ(2u, params.encodings.size());
1595
1596 DestroyVideoRtpReceiver();
1597}
1598
Philipp Hanckeb83cd922022-11-09 11:06:38 +01001599TEST_F(RtpSenderReceiverTest, GenerateKeyFrameWithAudio) {
1600 CreateAudioRtpSender();
1601
1602 auto error = audio_rtp_sender_->GenerateKeyFrame({});
1603 EXPECT_FALSE(error.ok());
1604 EXPECT_EQ(error.type(), RTCErrorType::UNSUPPORTED_OPERATION);
1605
1606 DestroyAudioRtpSender();
1607}
1608
1609TEST_F(RtpSenderReceiverTest, GenerateKeyFrameWithVideo) {
1610 CreateVideoRtpSenderWithSimulcast({"1", "2", "3"});
1611
1612 auto error = video_rtp_sender_->GenerateKeyFrame({});
1613 EXPECT_TRUE(error.ok());
1614
1615 error = video_rtp_sender_->GenerateKeyFrame({"1"});
1616 EXPECT_TRUE(error.ok());
1617
1618 error = video_rtp_sender_->GenerateKeyFrame({""});
1619 EXPECT_FALSE(error.ok());
1620 EXPECT_EQ(error.type(), RTCErrorType::INVALID_PARAMETER);
1621
1622 error = video_rtp_sender_->GenerateKeyFrame({"no-such-rid"});
1623 EXPECT_FALSE(error.ok());
1624 EXPECT_EQ(error.type(), RTCErrorType::INVALID_PARAMETER);
1625
1626 DestroyVideoRtpSender();
1627}
1628
pbos5214a0a2016-12-16 15:39:11 -08001629// Test that makes sure that a video track content hint translates to the proper
1630// value for sources that are not screencast.
1631TEST_F(RtpSenderReceiverTest, PropagatesVideoTrackContentHint) {
1632 CreateVideoRtpSender();
1633
1634 video_track_->set_enabled(true);
1635
Artem Titov880fa812021-07-30 22:30:23 +02001636 // `video_track_` is not screencast by default.
Harald Alvestrand485457f2022-05-23 08:46:57 +00001637 EXPECT_EQ(false, video_media_channel()->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001638 // No content hint should be set by default.
1639 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1640 video_track_->content_hint());
1641 // Setting detailed should turn a non-screencast source into screencast mode.
1642 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Harald Alvestrand485457f2022-05-23 08:46:57 +00001643 EXPECT_EQ(true, video_media_channel()->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001644 // Removing the content hint should turn the track back into non-screencast
1645 // mode.
1646 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Harald Alvestrand485457f2022-05-23 08:46:57 +00001647 EXPECT_EQ(false, video_media_channel()->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001648 // Setting fluid should remain in non-screencast mode (its default).
1649 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Harald Alvestrand485457f2022-05-23 08:46:57 +00001650 EXPECT_EQ(false, video_media_channel()->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 08:53:10 +02001651 // Setting text should have the same effect as Detailed
1652 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
Harald Alvestrand485457f2022-05-23 08:46:57 +00001653 EXPECT_EQ(true, video_media_channel()->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001654
1655 DestroyVideoRtpSender();
1656}
1657
1658// Test that makes sure that a video track content hint translates to the proper
1659// value for screencast sources.
1660TEST_F(RtpSenderReceiverTest,
1661 PropagatesVideoTrackContentHintForScreencastSource) {
1662 CreateVideoRtpSender(true);
1663
1664 video_track_->set_enabled(true);
1665
Artem Titov880fa812021-07-30 22:30:23 +02001666 // `video_track_` with a screencast source should be screencast by default.
Harald Alvestrand485457f2022-05-23 08:46:57 +00001667 EXPECT_EQ(true, video_media_channel()->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001668 // No content hint should be set by default.
1669 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1670 video_track_->content_hint());
1671 // Setting fluid should turn a screencast source into non-screencast mode.
1672 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Harald Alvestrand485457f2022-05-23 08:46:57 +00001673 EXPECT_EQ(false, video_media_channel()->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001674 // Removing the content hint should turn the track back into screencast mode.
1675 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Harald Alvestrand485457f2022-05-23 08:46:57 +00001676 EXPECT_EQ(true, video_media_channel()->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001677 // Setting detailed should still remain in screencast mode (its default).
1678 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Harald Alvestrand485457f2022-05-23 08:46:57 +00001679 EXPECT_EQ(true, video_media_channel()->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 08:53:10 +02001680 // Setting text should have the same effect as Detailed
1681 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
Harald Alvestrand485457f2022-05-23 08:46:57 +00001682 EXPECT_EQ(true, video_media_channel()->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001683
1684 DestroyVideoRtpSender();
1685}
1686
1687// Test that makes sure any content hints that are set on a track before
1688// VideoRtpSender is ready to send are still applied when it gets ready to send.
1689TEST_F(RtpSenderReceiverTest,
1690 PropagatesVideoTrackContentHintSetBeforeEnabling) {
1691 AddVideoTrack();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001692 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001693 std::make_unique<MockSetStreamsObserver>();
pbos5214a0a2016-12-16 15:39:11 -08001694 // Setting detailed overrides the default non-screencast mode. This should be
1695 // applied even if the track is set on construction.
1696 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001697 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1698 set_streams_observer.get());
Niels Möllerafb246b2022-04-20 14:26:50 +02001699 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001700 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1701 video_rtp_sender_->SetStreams({local_stream_->id()});
Harald Alvestrandc0d44d92022-12-13 12:57:24 +00001702 video_rtp_sender_->SetMediaChannel(
1703 video_media_channel()->AsVideoSendChannel());
pbos5214a0a2016-12-16 15:39:11 -08001704 video_track_->set_enabled(true);
1705
1706 // Sender is not ready to send (no SSRC) so no option should have been set.
Harald Alvestrand485457f2022-05-23 08:46:57 +00001707 EXPECT_EQ(absl::nullopt, video_media_channel()->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001708
1709 // Verify that the content hint is accounted for when video_rtp_sender_ does
1710 // get enabled.
1711 video_rtp_sender_->SetSsrc(kVideoSsrc);
Harald Alvestrand485457f2022-05-23 08:46:57 +00001712 EXPECT_EQ(true, video_media_channel()->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001713
1714 // And removing the hint should go back to false (to verify that false was
1715 // default correctly).
1716 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Harald Alvestrand485457f2022-05-23 08:46:57 +00001717 EXPECT_EQ(false, video_media_channel()->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001718
1719 DestroyVideoRtpSender();
1720}
1721
deadbeef20cb0c12017-02-01 20:27:00 -08001722TEST_F(RtpSenderReceiverTest, AudioSenderHasDtmfSender) {
1723 CreateAudioRtpSender();
1724 EXPECT_NE(nullptr, audio_rtp_sender_->GetDtmfSender());
1725}
1726
1727TEST_F(RtpSenderReceiverTest, VideoSenderDoesNotHaveDtmfSender) {
1728 CreateVideoRtpSender();
1729 EXPECT_EQ(nullptr, video_rtp_sender_->GetDtmfSender());
1730}
1731
Artem Titov880fa812021-07-30 22:30:23 +02001732// Test that the DTMF sender is really using `voice_channel_`, and thus returns
1733// true/false from CanSendDtmf based on what `voice_channel_` returns.
deadbeef20cb0c12017-02-01 20:27:00 -08001734TEST_F(RtpSenderReceiverTest, CanInsertDtmf) {
1735 AddDtmfCodec();
1736 CreateAudioRtpSender();
1737 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1738 ASSERT_NE(nullptr, dtmf_sender);
1739 EXPECT_TRUE(dtmf_sender->CanInsertDtmf());
1740}
1741
1742TEST_F(RtpSenderReceiverTest, CanNotInsertDtmf) {
1743 CreateAudioRtpSender();
1744 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1745 ASSERT_NE(nullptr, dtmf_sender);
1746 // DTMF codec has not been added, as it was in the above test.
1747 EXPECT_FALSE(dtmf_sender->CanInsertDtmf());
1748}
1749
1750TEST_F(RtpSenderReceiverTest, InsertDtmf) {
1751 AddDtmfCodec();
1752 CreateAudioRtpSender();
1753 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1754 ASSERT_NE(nullptr, dtmf_sender);
1755
Harald Alvestrand485457f2022-05-23 08:46:57 +00001756 EXPECT_EQ(0U, voice_media_channel()->dtmf_info_queue().size());
deadbeef20cb0c12017-02-01 20:27:00 -08001757
1758 // Insert DTMF
1759 const int expected_duration = 90;
1760 dtmf_sender->InsertDtmf("012", expected_duration, 100);
1761
1762 // Verify
Harald Alvestrand485457f2022-05-23 08:46:57 +00001763 ASSERT_EQ_WAIT(3U, voice_media_channel()->dtmf_info_queue().size(),
deadbeef20cb0c12017-02-01 20:27:00 -08001764 kDefaultTimeout);
1765 const uint32_t send_ssrc =
Harald Alvestrand485457f2022-05-23 08:46:57 +00001766 voice_media_channel()->send_streams()[0].first_ssrc();
1767 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel()->dtmf_info_queue()[0],
deadbeef20cb0c12017-02-01 20:27:00 -08001768 send_ssrc, 0, expected_duration));
Harald Alvestrand485457f2022-05-23 08:46:57 +00001769 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel()->dtmf_info_queue()[1],
deadbeef20cb0c12017-02-01 20:27:00 -08001770 send_ssrc, 1, expected_duration));
Harald Alvestrand485457f2022-05-23 08:46:57 +00001771 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel()->dtmf_info_queue()[2],
deadbeef20cb0c12017-02-01 20:27:00 -08001772 send_ssrc, 2, expected_duration));
1773}
1774
Benjamin Wright84583f62018-10-04 14:22:34 -07001775// Validate that the default FrameEncryptor setting is nullptr.
1776TEST_F(RtpSenderReceiverTest, AudioSenderCanSetFrameEncryptor) {
1777 CreateAudioRtpSender();
1778 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1779 new FakeFrameEncryptor());
1780 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1781 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1782 EXPECT_EQ(fake_frame_encryptor.get(),
1783 audio_rtp_sender_->GetFrameEncryptor().get());
1784}
1785
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001786// Validate that setting a FrameEncryptor after the send stream is stopped does
1787// nothing.
1788TEST_F(RtpSenderReceiverTest, AudioSenderCannotSetFrameEncryptorAfterStop) {
1789 CreateAudioRtpSender();
1790 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1791 new FakeFrameEncryptor());
1792 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1793 audio_rtp_sender_->Stop();
1794 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1795 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1796}
1797
Benjamin Wright84583f62018-10-04 14:22:34 -07001798// Validate that the default FrameEncryptor setting is nullptr.
1799TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetFrameDecryptor) {
1800 CreateAudioRtpReceiver();
1801 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
Tomas Gunnarssonb3517fe2022-03-18 19:32:38 +01001802 rtc::make_ref_counted<FakeFrameDecryptor>());
Benjamin Wright84583f62018-10-04 14:22:34 -07001803 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
1804 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1805 EXPECT_EQ(fake_frame_decryptor.get(),
1806 audio_rtp_receiver_->GetFrameDecryptor().get());
Tommi4ccdf932021-05-17 14:50:10 +02001807 DestroyAudioRtpReceiver();
Benjamin Wright84583f62018-10-04 14:22:34 -07001808}
1809
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001810// Validate that the default FrameEncryptor setting is nullptr.
1811TEST_F(RtpSenderReceiverTest, AudioReceiverCannotSetFrameDecryptorAfterStop) {
1812 CreateAudioRtpReceiver();
1813 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
Tomas Gunnarssonb3517fe2022-03-18 19:32:38 +01001814 rtc::make_ref_counted<FakeFrameDecryptor>());
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001815 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
Tommi6589def2022-02-17 23:36:47 +01001816 audio_rtp_receiver_->SetMediaChannel(nullptr);
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001817 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1818 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
Tommi4ccdf932021-05-17 14:50:10 +02001819 DestroyAudioRtpReceiver();
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001820}
1821
1822// Validate that the default FrameEncryptor setting is nullptr.
1823TEST_F(RtpSenderReceiverTest, VideoSenderCanSetFrameEncryptor) {
1824 CreateVideoRtpSender();
1825 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1826 new FakeFrameEncryptor());
1827 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1828 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1829 EXPECT_EQ(fake_frame_encryptor.get(),
1830 video_rtp_sender_->GetFrameEncryptor().get());
1831}
1832
1833// Validate that setting a FrameEncryptor after the send stream is stopped does
1834// nothing.
1835TEST_F(RtpSenderReceiverTest, VideoSenderCannotSetFrameEncryptorAfterStop) {
1836 CreateVideoRtpSender();
1837 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1838 new FakeFrameEncryptor());
1839 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1840 video_rtp_sender_->Stop();
1841 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1842 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1843}
1844
1845// Validate that the default FrameEncryptor setting is nullptr.
1846TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetFrameDecryptor) {
1847 CreateVideoRtpReceiver();
1848 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
Tomas Gunnarssonb3517fe2022-03-18 19:32:38 +01001849 rtc::make_ref_counted<FakeFrameDecryptor>());
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001850 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
1851 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1852 EXPECT_EQ(fake_frame_decryptor.get(),
1853 video_rtp_receiver_->GetFrameDecryptor().get());
Tommi4ccdf932021-05-17 14:50:10 +02001854 DestroyVideoRtpReceiver();
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001855}
1856
1857// Validate that the default FrameEncryptor setting is nullptr.
1858TEST_F(RtpSenderReceiverTest, VideoReceiverCannotSetFrameDecryptorAfterStop) {
1859 CreateVideoRtpReceiver();
1860 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
Tomas Gunnarssonb3517fe2022-03-18 19:32:38 +01001861 rtc::make_ref_counted<FakeFrameDecryptor>());
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001862 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
Tommi6589def2022-02-17 23:36:47 +01001863 video_rtp_receiver_->SetMediaChannel(nullptr);
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001864 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1865 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
Tommi4ccdf932021-05-17 14:50:10 +02001866 DestroyVideoRtpReceiver();
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001867}
1868
Amit Hilbuch619b2942019-02-26 15:55:19 -08001869// Checks that calling the internal methods for get/set parameters do not
1870// invalidate any parameters retreived by clients.
1871TEST_F(RtpSenderReceiverTest,
1872 InternalParameterMethodsDoNotInvalidateTransaction) {
1873 CreateVideoRtpSender();
1874 RtpParameters parameters = video_rtp_sender_->GetParameters();
1875 RtpParameters new_parameters = video_rtp_sender_->GetParametersInternal();
1876 new_parameters.encodings[0].active = false;
Florent Castelliacabb362022-10-18 17:05:16 +02001877 video_rtp_sender_->SetParametersInternal(new_parameters, nullptr, true);
Amit Hilbuch619b2942019-02-26 15:55:19 -08001878 new_parameters.encodings[0].active = true;
Florent Castelliacabb362022-10-18 17:05:16 +02001879 video_rtp_sender_->SetParametersInternal(new_parameters, nullptr, true);
Amit Hilbuch619b2942019-02-26 15:55:19 -08001880 parameters.encodings[0].active = false;
1881 EXPECT_TRUE(video_rtp_sender_->SetParameters(parameters).ok());
1882}
1883
Amit Hilbuch2297d332019-02-19 12:49:22 -08001884// Helper method for syntactic sugar for accepting a vector with '{}' notation.
1885std::pair<RidList, RidList> CreatePairOfRidVectors(
1886 const std::vector<std::string>& first,
1887 const std::vector<std::string>& second) {
1888 return std::make_pair(first, second);
1889}
1890
1891// These parameters are used to test disabling simulcast layers.
1892const std::pair<RidList, RidList> kDisableSimulcastLayersParameters[] = {
1893 // Tests removing the first layer. This is a special case because
1894 // the first layer's SSRC is also the 'primary' SSRC used to associate the
1895 // parameters to the media channel.
1896 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"1"}),
1897 // Tests removing some layers.
1898 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"2", "4"}),
1899 // Tests simulcast rejected scenario all layers except first are rejected.
1900 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"2", "3", "4"}),
1901 // Tests removing all layers.
1902 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"1", "2", "3", "4"}),
1903};
1904
1905// Runs test for disabling layers on a sender without a media engine set.
1906TEST_P(RtpSenderReceiverTest, DisableSimulcastLayersWithoutMediaEngine) {
1907 auto parameter = GetParam();
1908 RunDisableSimulcastLayersWithoutMediaEngineTest(parameter.first,
1909 parameter.second);
1910}
1911
1912// Runs test for disabling layers on a sender with a media engine set.
1913TEST_P(RtpSenderReceiverTest, DisableSimulcastLayersWithMediaEngine) {
1914 auto parameter = GetParam();
1915 RunDisableSimulcastLayersWithMediaEngineTest(parameter.first,
1916 parameter.second);
1917}
1918
1919INSTANTIATE_TEST_SUITE_P(
1920 DisableSimulcastLayersInSender,
1921 RtpSenderReceiverTest,
1922 ::testing::ValuesIn(kDisableSimulcastLayersParameters));
1923
deadbeef70ab1a12015-09-28 16:53:55 -07001924} // namespace webrtc