blob: 42072dece5be8ae4b96a5dd66567f5a5e055e6d2 [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 Alvestrand485457f2022-05-23 08:46:57 +0000207 audio_rtp_sender_->SetMediaChannel(voice_media_channel());
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 Alvestrand485457f2022-05-23 08:46:57 +0000215 audio_rtp_sender_->SetMediaChannel(voice_media_channel());
Steve Anton02ee47c2018-01-10 16:26:06 -0800216 }
217
Seth Hampson2d2c8882018-05-16 16:02:32 -0700218 void CreateVideoRtpSender(uint32_t ssrc) {
219 CreateVideoRtpSender(false, ssrc);
220 }
221
pbos5214a0a2016-12-16 15:39:11 -0800222 void CreateVideoRtpSender() { CreateVideoRtpSender(false); }
223
Amit Hilbuch2297d332019-02-19 12:49:22 -0800224 cricket::StreamParams CreateSimulcastStreamParams(int num_layers) {
Florent Castelli892acf02018-10-01 22:47:20 +0200225 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +0100226 ssrcs.reserve(num_layers);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800227 for (int i = 0; i < num_layers; ++i) {
Florent Castelli892acf02018-10-01 22:47:20 +0200228 ssrcs.push_back(kVideoSsrcSimulcast + i);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800229 }
230 return cricket::CreateSimStreamParams("cname", ssrcs);
231 }
232
233 uint32_t CreateVideoRtpSender(const cricket::StreamParams& stream_params) {
Florent Castelli892acf02018-10-01 22:47:20 +0200234 video_media_channel_->AddSendStream(stream_params);
235 uint32_t primary_ssrc = stream_params.first_ssrc();
236 CreateVideoRtpSender(primary_ssrc);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800237 return primary_ssrc;
238 }
239
240 uint32_t CreateVideoRtpSenderWithSimulcast(
241 int num_layers = kVideoSimulcastLayerCount) {
242 return CreateVideoRtpSender(CreateSimulcastStreamParams(num_layers));
243 }
244
245 uint32_t CreateVideoRtpSenderWithSimulcast(
246 const std::vector<std::string>& rids) {
247 cricket::StreamParams stream_params =
248 CreateSimulcastStreamParams(rids.size());
249 std::vector<cricket::RidDescription> rid_descriptions;
250 absl::c_transform(
251 rids, std::back_inserter(rid_descriptions), [](const std::string& rid) {
252 return cricket::RidDescription(rid, cricket::RidDirection::kSend);
253 });
254 stream_params.set_rids(rid_descriptions);
255 return CreateVideoRtpSender(stream_params);
Florent Castelli892acf02018-10-01 22:47:20 +0200256 }
257
Seth Hampson2d2c8882018-05-16 16:02:32 -0700258 void CreateVideoRtpSender(bool is_screencast, uint32_t ssrc = kVideoSsrc) {
pbos5214a0a2016-12-16 15:39:11 -0800259 AddVideoTrack(is_screencast);
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200260 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200261 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200262 video_rtp_sender_ = VideoRtpSender::Create(
263 worker_thread_, video_track_->id(), set_streams_observer.get());
Niels Möllerafb246b2022-04-20 14:26:50 +0200264 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200265 EXPECT_CALL(*set_streams_observer, OnSetStreams());
266 video_rtp_sender_->SetStreams({local_stream_->id()});
Harald Alvestrand485457f2022-05-23 08:46:57 +0000267 video_rtp_sender_->SetMediaChannel(video_media_channel());
Seth Hampson2d2c8882018-05-16 16:02:32 -0700268 video_rtp_sender_->SetSsrc(ssrc);
269 VerifyVideoChannelInput(ssrc);
deadbeef70ab1a12015-09-28 16:53:55 -0700270 }
Steve Anton02ee47c2018-01-10 16:26:06 -0800271 void CreateVideoRtpSenderWithNoTrack() {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200272 video_rtp_sender_ =
273 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Harald Alvestrand485457f2022-05-23 08:46:57 +0000274 video_rtp_sender_->SetMediaChannel(video_media_channel());
Steve Anton02ee47c2018-01-10 16:26:06 -0800275 }
276
deadbeef70ab1a12015-09-28 16:53:55 -0700277 void DestroyAudioRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700278 audio_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700279 VerifyVoiceChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700280 }
281
282 void DestroyVideoRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700283 video_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700284 VerifyVideoChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700285 }
286
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100287 void CreateAudioRtpReceiver(
288 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
Tommi4ccdf932021-05-17 14:50:10 +0200289 audio_rtp_receiver_ = rtc::make_ref_counted<AudioRtpReceiver>(
290 rtc::Thread::Current(), kAudioTrackId, streams,
291 /*is_unified_plan=*/true);
Harald Alvestrand485457f2022-05-23 08:46:57 +0000292 audio_rtp_receiver_->SetMediaChannel(voice_media_channel());
Steve Antond3679212018-01-17 17:41:02 -0800293 audio_rtp_receiver_->SetupMediaChannel(kAudioSsrc);
perkjd61bf802016-03-24 03:16:19 -0700294 audio_track_ = audio_rtp_receiver_->audio_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700295 VerifyVoiceChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700296 }
297
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100298 void CreateVideoRtpReceiver(
299 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
Tommi4ccdf932021-05-17 14:50:10 +0200300 video_rtp_receiver_ = rtc::make_ref_counted<VideoRtpReceiver>(
301 rtc::Thread::Current(), kVideoTrackId, streams);
Harald Alvestrand485457f2022-05-23 08:46:57 +0000302 video_rtp_receiver_->SetMediaChannel(video_media_channel());
Steve Antond3679212018-01-17 17:41:02 -0800303 video_rtp_receiver_->SetupMediaChannel(kVideoSsrc);
perkjf0dcfe22016-03-10 18:32:00 +0100304 video_track_ = video_rtp_receiver_->video_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700305 VerifyVideoChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700306 }
307
Florent Castelli38332cd2018-11-20 14:08:06 +0100308 void CreateVideoRtpReceiverWithSimulcast(
309 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {},
310 int num_layers = kVideoSimulcastLayerCount) {
311 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +0100312 ssrcs.reserve(num_layers);
Florent Castelli38332cd2018-11-20 14:08:06 +0100313 for (int i = 0; i < num_layers; ++i)
314 ssrcs.push_back(kVideoSsrcSimulcast + i);
315 cricket::StreamParams stream_params =
316 cricket::CreateSimStreamParams("cname", ssrcs);
317 video_media_channel_->AddRecvStream(stream_params);
318 uint32_t primary_ssrc = stream_params.first_ssrc();
319
Tommi4ccdf932021-05-17 14:50:10 +0200320 video_rtp_receiver_ = rtc::make_ref_counted<VideoRtpReceiver>(
321 rtc::Thread::Current(), kVideoTrackId, streams);
Harald Alvestrand485457f2022-05-23 08:46:57 +0000322 video_rtp_receiver_->SetMediaChannel(video_media_channel());
Florent Castelli38332cd2018-11-20 14:08:06 +0100323 video_rtp_receiver_->SetupMediaChannel(primary_ssrc);
324 video_track_ = video_rtp_receiver_->video_track();
325 }
326
deadbeef70ab1a12015-09-28 16:53:55 -0700327 void DestroyAudioRtpReceiver() {
Tommi4ccdf932021-05-17 14:50:10 +0200328 if (!audio_rtp_receiver_)
329 return;
Tommi6589def2022-02-17 23:36:47 +0100330 audio_rtp_receiver_->SetMediaChannel(nullptr);
deadbeef70ab1a12015-09-28 16:53:55 -0700331 audio_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700332 VerifyVoiceChannelNoOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700333 }
334
335 void DestroyVideoRtpReceiver() {
Tommi4ccdf932021-05-17 14:50:10 +0200336 if (!video_rtp_receiver_)
337 return;
338 video_rtp_receiver_->Stop();
Tommi6589def2022-02-17 23:36:47 +0100339 video_rtp_receiver_->SetMediaChannel(nullptr);
deadbeef70ab1a12015-09-28 16:53:55 -0700340 video_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700341 VerifyVideoChannelNoOutput();
342 }
343
344 void VerifyVoiceChannelInput() { VerifyVoiceChannelInput(kAudioSsrc); }
345
346 void VerifyVoiceChannelInput(uint32_t ssrc) {
347 // Verify that the media channel has an audio source, and the stream isn't
348 // muted.
Harald Alvestrand485457f2022-05-23 08:46:57 +0000349 EXPECT_TRUE(voice_media_channel()->HasSource(ssrc));
350 EXPECT_FALSE(voice_media_channel()->IsStreamMuted(ssrc));
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700351 }
352
353 void VerifyVideoChannelInput() { VerifyVideoChannelInput(kVideoSsrc); }
354
355 void VerifyVideoChannelInput(uint32_t ssrc) {
356 // Verify that the media channel has a video source,
357 EXPECT_TRUE(video_media_channel_->HasSource(ssrc));
358 }
359
360 void VerifyVoiceChannelNoInput() { VerifyVoiceChannelNoInput(kAudioSsrc); }
361
362 void VerifyVoiceChannelNoInput(uint32_t ssrc) {
363 // Verify that the media channel's source is reset.
Harald Alvestrand485457f2022-05-23 08:46:57 +0000364 EXPECT_FALSE(voice_media_channel()->HasSource(ssrc));
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700365 }
366
367 void VerifyVideoChannelNoInput() { VerifyVideoChannelNoInput(kVideoSsrc); }
368
369 void VerifyVideoChannelNoInput(uint32_t ssrc) {
370 // Verify that the media channel's source is reset.
371 EXPECT_FALSE(video_media_channel_->HasSource(ssrc));
372 }
373
374 void VerifyVoiceChannelOutput() {
375 // Verify that the volume is initialized to 1.
376 double volume;
Harald Alvestrand485457f2022-05-23 08:46:57 +0000377 EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700378 EXPECT_EQ(1, volume);
379 }
380
381 void VerifyVideoChannelOutput() {
382 // Verify that the media channel has a sink.
383 EXPECT_TRUE(video_media_channel_->HasSink(kVideoSsrc));
384 }
385
386 void VerifyVoiceChannelNoOutput() {
387 // Verify that the volume is reset to 0.
388 double volume;
Harald Alvestrand485457f2022-05-23 08:46:57 +0000389 EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700390 EXPECT_EQ(0, volume);
391 }
392
393 void VerifyVideoChannelNoOutput() {
394 // Verify that the media channel's sink is reset.
395 EXPECT_FALSE(video_media_channel_->HasSink(kVideoSsrc));
deadbeef70ab1a12015-09-28 16:53:55 -0700396 }
397
Amit Hilbuch2297d332019-02-19 12:49:22 -0800398 // Verifies that the encoding layers contain the specified RIDs.
399 bool VerifyEncodingLayers(const VideoRtpSender& sender,
400 const std::vector<std::string>& rids) {
401 bool has_failure = HasFailure();
402 RtpParameters parameters = sender.GetParameters();
403 std::vector<std::string> encoding_rids;
404 absl::c_transform(
405 parameters.encodings, std::back_inserter(encoding_rids),
406 [](const RtpEncodingParameters& encoding) { return encoding.rid; });
407 EXPECT_THAT(rids, ContainerEq(encoding_rids));
408 return has_failure || !HasFailure();
409 }
410
411 // Runs a test for disabling the encoding layers on the specified sender.
412 void RunDisableEncodingLayersTest(
413 const std::vector<std::string>& all_layers,
414 const std::vector<std::string>& disabled_layers,
415 VideoRtpSender* sender) {
416 std::vector<std::string> expected;
417 absl::c_copy_if(all_layers, std::back_inserter(expected),
418 [&disabled_layers](const std::string& rid) {
419 return !absl::c_linear_search(disabled_layers, rid);
420 });
421
422 EXPECT_TRUE(VerifyEncodingLayers(*sender, all_layers));
423 sender->DisableEncodingLayers(disabled_layers);
424 EXPECT_TRUE(VerifyEncodingLayers(*sender, expected));
425 }
426
427 // Runs a test for setting an encoding layer as inactive.
428 // This test assumes that some layers have already been disabled.
429 void RunSetLastLayerAsInactiveTest(VideoRtpSender* sender) {
430 auto parameters = sender->GetParameters();
431 if (parameters.encodings.size() == 0) {
432 return;
433 }
434
435 RtpEncodingParameters& encoding = parameters.encodings.back();
436 auto rid = encoding.rid;
437 EXPECT_TRUE(encoding.active);
438 encoding.active = false;
439 auto error = sender->SetParameters(parameters);
440 ASSERT_TRUE(error.ok());
441 parameters = sender->GetParameters();
442 RtpEncodingParameters& result_encoding = parameters.encodings.back();
443 EXPECT_EQ(rid, result_encoding.rid);
444 EXPECT_FALSE(result_encoding.active);
445 }
446
447 // Runs a test for disabling the encoding layers on a sender without a media
448 // channel.
449 void RunDisableSimulcastLayersWithoutMediaEngineTest(
450 const std::vector<std::string>& all_layers,
451 const std::vector<std::string>& disabled_layers) {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200452 auto sender = VideoRtpSender::Create(rtc::Thread::Current(), "1", nullptr);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800453 RtpParameters parameters;
454 parameters.encodings.resize(all_layers.size());
455 for (size_t i = 0; i < all_layers.size(); ++i) {
456 parameters.encodings[i].rid = all_layers[i];
457 }
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800458 sender->set_init_send_encodings(parameters.encodings);
459 RunDisableEncodingLayersTest(all_layers, disabled_layers, sender.get());
460 RunSetLastLayerAsInactiveTest(sender.get());
Amit Hilbuch2297d332019-02-19 12:49:22 -0800461 }
462
463 // Runs a test for disabling the encoding layers on a sender with a media
464 // channel.
465 void RunDisableSimulcastLayersWithMediaEngineTest(
466 const std::vector<std::string>& all_layers,
467 const std::vector<std::string>& disabled_layers) {
468 uint32_t ssrc = CreateVideoRtpSenderWithSimulcast(all_layers);
469 RunDisableEncodingLayersTest(all_layers, disabled_layers,
470 video_rtp_sender_.get());
471
472 auto channel_parameters = video_media_channel_->GetRtpSendParameters(ssrc);
473 ASSERT_EQ(channel_parameters.encodings.size(), all_layers.size());
474 for (size_t i = 0; i < all_layers.size(); ++i) {
475 EXPECT_EQ(all_layers[i], channel_parameters.encodings[i].rid);
476 bool is_active = !absl::c_linear_search(disabled_layers, all_layers[i]);
477 EXPECT_EQ(is_active, channel_parameters.encodings[i].active);
478 }
479
480 RunSetLastLayerAsInactiveTest(video_rtp_sender_.get());
481 }
482
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200483 // Check that minimum Jitter Buffer delay is propagated to the underlying
Artem Titov880fa812021-07-30 22:30:23 +0200484 // `media_channel`.
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200485 void VerifyRtpReceiverDelayBehaviour(cricket::Delayable* media_channel,
486 RtpReceiverInterface* receiver,
487 uint32_t ssrc) {
488 receiver->SetJitterBufferMinimumDelay(/*delay_seconds=*/0.5);
489 absl::optional<int> delay_ms =
490 media_channel->GetBaseMinimumPlayoutDelayMs(ssrc); // In milliseconds.
491 EXPECT_DOUBLE_EQ(0.5, delay_ms.value_or(0) / 1000.0);
492 }
493
deadbeef70ab1a12015-09-28 16:53:55 -0700494 protected:
Harald Alvestrand485457f2022-05-23 08:46:57 +0000495 cricket::FakeVideoMediaChannel* video_media_channel() {
496 return video_media_channel_.get();
497 }
498 cricket::FakeVoiceMediaChannel* voice_media_channel() {
499 return voice_media_channel_.get();
500 }
501
Tommi4ccdf932021-05-17 14:50:10 +0200502 test::RunLoop run_loop_;
Steve Anton47136dd2018-01-12 10:49:35 -0800503 rtc::Thread* const network_thread_;
504 rtc::Thread* const worker_thread_;
Danil Chapovalov83bbe912019-08-07 12:24:53 +0200505 webrtc::RtcEventLogNull event_log_;
Artem Titov880fa812021-07-30 22:30:23 +0200506 // The `rtp_dtls_transport_` and `rtp_transport_` should be destroyed after
507 // the `channel_manager`.
Zhi Huange830e682018-03-30 10:48:35 -0700508 std::unique_ptr<cricket::DtlsTransportInternal> rtp_dtls_transport_;
509 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport_;
Jonas Orelanda3aa9bd2019-04-17 07:38:40 +0200510 std::unique_ptr<webrtc::VideoBitrateAllocatorFactory>
511 video_bitrate_allocator_factory_;
Harald Alvestrand0ac50b92022-05-18 07:51:34 +0000512 std::unique_ptr<cricket::FakeMediaEngine> media_engine_;
513 rtc::UniqueRandomIdGenerator ssrc_generator_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700514 cricket::FakeCall fake_call_;
Harald Alvestrand485457f2022-05-23 08:46:57 +0000515 std::unique_ptr<cricket::FakeVoiceMediaChannel> voice_media_channel_;
516 std::unique_ptr<cricket::FakeVideoMediaChannel> video_media_channel_;
deadbeef70ab1a12015-09-28 16:53:55 -0700517 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
518 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
519 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
520 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
deadbeefe814a0d2017-02-25 18:15:09 -0800521 rtc::scoped_refptr<MediaStreamInterface> local_stream_;
deadbeef70ab1a12015-09-28 16:53:55 -0700522 rtc::scoped_refptr<VideoTrackInterface> video_track_;
523 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
Jonas Orelanded99dae2022-03-09 09:28:10 +0100524 webrtc::test::ScopedKeyValueConfig field_trials_;
deadbeef70ab1a12015-09-28 16:53:55 -0700525};
526
Artem Titov880fa812021-07-30 22:30:23 +0200527// Test that `voice_channel_` is updated when an audio track is associated
deadbeef70ab1a12015-09-28 16:53:55 -0700528// and disassociated with an AudioRtpSender.
529TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
530 CreateAudioRtpSender();
531 DestroyAudioRtpSender();
532}
533
Artem Titov880fa812021-07-30 22:30:23 +0200534// Test that `video_channel_` is updated when a video track is associated and
deadbeef70ab1a12015-09-28 16:53:55 -0700535// disassociated with a VideoRtpSender.
536TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
537 CreateVideoRtpSender();
538 DestroyVideoRtpSender();
539}
540
Artem Titov880fa812021-07-30 22:30:23 +0200541// Test that `voice_channel_` is updated when a remote audio track is
deadbeef70ab1a12015-09-28 16:53:55 -0700542// associated and disassociated with an AudioRtpReceiver.
543TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
544 CreateAudioRtpReceiver();
545 DestroyAudioRtpReceiver();
546}
547
Artem Titov880fa812021-07-30 22:30:23 +0200548// Test that `video_channel_` is updated when a remote video track is
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700549// associated and disassociated with a VideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700550TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
551 CreateVideoRtpReceiver();
552 DestroyVideoRtpReceiver();
553}
554
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100555TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiverWithStreams) {
556 CreateAudioRtpReceiver({local_stream_});
557 DestroyAudioRtpReceiver();
558}
559
560TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiverWithStreams) {
561 CreateVideoRtpReceiver({local_stream_});
562 DestroyVideoRtpReceiver();
563}
564
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700565// Test that the AudioRtpSender applies options from the local audio source.
566TEST_F(RtpSenderReceiverTest, LocalAudioSourceOptionsApplied) {
567 cricket::AudioOptions options;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100568 options.echo_cancellation = true;
deadbeef757146b2017-02-10 21:26:48 -0800569 auto source = LocalAudioSource::Create(&options);
Niels Möllere7cc8832022-01-04 15:20:03 +0100570 CreateAudioRtpSender(source);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700571
Harald Alvestrand485457f2022-05-23 08:46:57 +0000572 EXPECT_EQ(true, voice_media_channel()->options().echo_cancellation);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700573
574 DestroyAudioRtpSender();
575}
576
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700577// Test that the stream is muted when the track is disabled, and unmuted when
578// the track is enabled.
579TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) {
580 CreateAudioRtpSender();
581
582 audio_track_->set_enabled(false);
Harald Alvestrand485457f2022-05-23 08:46:57 +0000583 EXPECT_TRUE(voice_media_channel()->IsStreamMuted(kAudioSsrc));
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700584
585 audio_track_->set_enabled(true);
Harald Alvestrand485457f2022-05-23 08:46:57 +0000586 EXPECT_FALSE(voice_media_channel()->IsStreamMuted(kAudioSsrc));
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700587
588 DestroyAudioRtpSender();
589}
590
591// Test that the volume is set to 0 when the track is disabled, and back to
592// 1 when the track is enabled.
deadbeef70ab1a12015-09-28 16:53:55 -0700593TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
594 CreateAudioRtpReceiver();
595
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700596 double volume;
Harald Alvestrand485457f2022-05-23 08:46:57 +0000597 EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700598 EXPECT_EQ(1, volume);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700599
Tommi4ccdf932021-05-17 14:50:10 +0200600 // Handling of enable/disable is applied asynchronously.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700601 audio_track_->set_enabled(false);
Tommi4ccdf932021-05-17 14:50:10 +0200602 run_loop_.Flush();
603
Harald Alvestrand485457f2022-05-23 08:46:57 +0000604 EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700605 EXPECT_EQ(0, volume);
606
deadbeef70ab1a12015-09-28 16:53:55 -0700607 audio_track_->set_enabled(true);
Tommi4ccdf932021-05-17 14:50:10 +0200608 run_loop_.Flush();
Harald Alvestrand485457f2022-05-23 08:46:57 +0000609 EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700610 EXPECT_EQ(1, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700611
612 DestroyAudioRtpReceiver();
613}
614
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700615// Currently no action is taken when a remote video track is disabled or
616// enabled, so there's nothing to test here, other than what is normally
617// verified in DestroyVideoRtpSender.
deadbeef70ab1a12015-09-28 16:53:55 -0700618TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
619 CreateVideoRtpSender();
620
deadbeef70ab1a12015-09-28 16:53:55 -0700621 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700622 video_track_->set_enabled(true);
623
624 DestroyVideoRtpSender();
625}
626
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700627// Test that the state of the video track created by the VideoRtpReceiver is
628// updated when the receiver is destroyed.
perkjf0dcfe22016-03-10 18:32:00 +0100629TEST_F(RtpSenderReceiverTest, RemoteVideoTrackState) {
630 CreateVideoRtpReceiver();
631
632 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track_->state());
633 EXPECT_EQ(webrtc::MediaSourceInterface::kLive,
634 video_track_->GetSource()->state());
635
636 DestroyVideoRtpReceiver();
637
638 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track_->state());
639 EXPECT_EQ(webrtc::MediaSourceInterface::kEnded,
640 video_track_->GetSource()->state());
Tommi4ccdf932021-05-17 14:50:10 +0200641 DestroyVideoRtpReceiver();
perkjf0dcfe22016-03-10 18:32:00 +0100642}
643
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700644// Currently no action is taken when a remote video track is disabled or
645// enabled, so there's nothing to test here, other than what is normally
646// verified in DestroyVideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700647TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
648 CreateVideoRtpReceiver();
649
650 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700651 video_track_->set_enabled(true);
652
653 DestroyVideoRtpReceiver();
654}
655
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700656// Test that the AudioRtpReceiver applies volume changes from the track source
657// to the media channel.
deadbeef70ab1a12015-09-28 16:53:55 -0700658TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
659 CreateAudioRtpReceiver();
660
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700661 double volume;
662 audio_track_->GetSource()->SetVolume(0.5);
Tommi4ccdf932021-05-17 14:50:10 +0200663 run_loop_.Flush();
Harald Alvestrand485457f2022-05-23 08:46:57 +0000664 EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700665 EXPECT_EQ(0.5, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700666
667 // Disable the audio track, this should prevent setting the volume.
deadbeef70ab1a12015-09-28 16:53:55 -0700668 audio_track_->set_enabled(false);
Tommi4ccdf932021-05-17 14:50:10 +0200669 RTC_DCHECK_EQ(worker_thread_, run_loop_.task_queue());
670 run_loop_.Flush();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700671 audio_track_->GetSource()->SetVolume(0.8);
Harald Alvestrand485457f2022-05-23 08:46:57 +0000672 EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700673 EXPECT_EQ(0, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700674
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700675 // When the track is enabled, the previously set volume should take effect.
deadbeef70ab1a12015-09-28 16:53:55 -0700676 audio_track_->set_enabled(true);
Tommi4ccdf932021-05-17 14:50:10 +0200677 run_loop_.Flush();
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.8, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700680
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700681 // Try changing volume one more time.
682 audio_track_->GetSource()->SetVolume(0.9);
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.9, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700686
687 DestroyAudioRtpReceiver();
688}
689
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200690TEST_F(RtpSenderReceiverTest, AudioRtpReceiverDelay) {
691 CreateAudioRtpReceiver();
Harald Alvestrand485457f2022-05-23 08:46:57 +0000692 VerifyRtpReceiverDelayBehaviour(voice_media_channel(),
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200693 audio_rtp_receiver_.get(), kAudioSsrc);
Tommi4ccdf932021-05-17 14:50:10 +0200694 DestroyAudioRtpReceiver();
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200695}
696
697TEST_F(RtpSenderReceiverTest, VideoRtpReceiverDelay) {
698 CreateVideoRtpReceiver();
Harald Alvestrand485457f2022-05-23 08:46:57 +0000699 VerifyRtpReceiverDelayBehaviour(video_media_channel(),
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200700 video_rtp_receiver_.get(), kVideoSsrc);
Tommi4ccdf932021-05-17 14:50:10 +0200701 DestroyVideoRtpReceiver();
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200702}
703
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700704// Test that the media channel isn't enabled for sending if the audio sender
705// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800706TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800707 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800708 rtc::scoped_refptr<AudioTrackInterface> track =
709 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700710
711 // Track but no SSRC.
Niels Möllerafb246b2022-04-20 14:26:50 +0200712 EXPECT_TRUE(audio_rtp_sender_->SetTrack(track.get()));
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700713 VerifyVoiceChannelNoInput();
714
715 // SSRC but no track.
716 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
717 audio_rtp_sender_->SetSsrc(kAudioSsrc);
718 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800719}
720
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700721// Test that the media channel isn't enabled for sending if the video sender
722// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800723TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800724 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700725
726 // Track but no SSRC.
Niels Möllerafb246b2022-04-20 14:26:50 +0200727 EXPECT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700728 VerifyVideoChannelNoInput();
729
730 // SSRC but no track.
731 EXPECT_TRUE(video_rtp_sender_->SetTrack(nullptr));
732 video_rtp_sender_->SetSsrc(kVideoSsrc);
733 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800734}
735
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700736// Test that the media channel is enabled for sending when the audio sender
737// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800738TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800739 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800740 rtc::scoped_refptr<AudioTrackInterface> track =
741 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700742 audio_rtp_sender_->SetSsrc(kAudioSsrc);
Niels Möllerafb246b2022-04-20 14:26:50 +0200743 audio_rtp_sender_->SetTrack(track.get());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700744 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800745
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700746 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800747}
748
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700749// Test that the media channel is enabled for sending when the audio sender
750// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800751TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800752 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800753 rtc::scoped_refptr<AudioTrackInterface> track =
754 AudioTrack::Create(kAudioTrackId, nullptr);
Niels Möllerafb246b2022-04-20 14:26:50 +0200755 audio_rtp_sender_->SetTrack(track.get());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700756 audio_rtp_sender_->SetSsrc(kAudioSsrc);
757 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800758
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700759 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800760}
761
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700762// Test that the media channel is enabled for sending when the video sender
763// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800764TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
nisseaf510af2016-03-21 08:20:42 -0700765 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800766 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700767 video_rtp_sender_->SetSsrc(kVideoSsrc);
Niels Möllerafb246b2022-04-20 14:26:50 +0200768 video_rtp_sender_->SetTrack(video_track_.get());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700769 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800770
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700771 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800772}
773
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700774// Test that the media channel is enabled for sending when the video sender
775// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800776TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
nisseaf510af2016-03-21 08:20:42 -0700777 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800778 CreateVideoRtpSenderWithNoTrack();
Niels Möllerafb246b2022-04-20 14:26:50 +0200779 video_rtp_sender_->SetTrack(video_track_.get());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700780 video_rtp_sender_->SetSsrc(kVideoSsrc);
781 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800782
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700783 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800784}
785
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700786// Test that the media channel stops sending when the audio sender's SSRC is set
787// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800788TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700789 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800790
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700791 audio_rtp_sender_->SetSsrc(0);
792 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800793}
794
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700795// Test that the media channel stops sending when the video sender's SSRC is set
796// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800797TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700798 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800799
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700800 audio_rtp_sender_->SetSsrc(0);
801 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800802}
803
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700804// Test that the media channel stops sending when the audio sender's track is
805// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800806TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700807 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800808
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700809 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
810 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800811}
812
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700813// Test that the media channel stops sending when the video sender's track is
814// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800815TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700816 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800817
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700818 video_rtp_sender_->SetSsrc(0);
819 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800820}
821
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700822// Test that when the audio sender's SSRC is changed, the media channel stops
823// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800824TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700825 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800826
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700827 audio_rtp_sender_->SetSsrc(kAudioSsrc2);
828 VerifyVoiceChannelNoInput(kAudioSsrc);
829 VerifyVoiceChannelInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800830
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700831 audio_rtp_sender_ = nullptr;
832 VerifyVoiceChannelNoInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800833}
834
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700835// Test that when the audio sender's SSRC is changed, the media channel stops
836// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800837TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700838 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800839
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700840 video_rtp_sender_->SetSsrc(kVideoSsrc2);
841 VerifyVideoChannelNoInput(kVideoSsrc);
842 VerifyVideoChannelInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800843
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700844 video_rtp_sender_ = nullptr;
845 VerifyVideoChannelNoInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800846}
847
skvladdc1c62c2016-03-16 19:07:43 -0700848TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) {
849 CreateAudioRtpSender();
850
skvladdc1c62c2016-03-16 19:07:43 -0700851 RtpParameters params = audio_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700852 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -0800853 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -0700854
855 DestroyAudioRtpSender();
856}
857
Florent Castelliacabb362022-10-18 17:05:16 +0200858TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParametersAsync) {
859 CreateAudioRtpSender();
860
861 RtpParameters params = audio_rtp_sender_->GetParameters();
862 EXPECT_EQ(1u, params.encodings.size());
863 absl::optional<webrtc::RTCError> result;
864 audio_rtp_sender_->SetParametersAsync(
865 params, [&result](webrtc::RTCError error) { result = error; });
866 run_loop_.Flush();
867 EXPECT_TRUE(result->ok());
868
869 DestroyAudioRtpSender();
870}
871
Florent Castelli892acf02018-10-01 22:47:20 +0200872TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParametersBeforeNegotiation) {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800873 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200874 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +0200875
876 RtpParameters params = audio_rtp_sender_->GetParameters();
877 ASSERT_EQ(1u, params.encodings.size());
878 params.encodings[0].max_bitrate_bps = 90000;
879 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
880
881 params = audio_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +0200882 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
Florent Castelliacabb362022-10-18 17:05:16 +0200883 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
884
885 DestroyAudioRtpSender();
886}
887
888TEST_F(RtpSenderReceiverTest,
889 AudioSenderCanSetParametersAsyncBeforeNegotiation) {
890 audio_rtp_sender_ =
891 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
892
893 absl::optional<webrtc::RTCError> result;
894 RtpParameters params = audio_rtp_sender_->GetParameters();
895 ASSERT_EQ(1u, params.encodings.size());
896 params.encodings[0].max_bitrate_bps = 90000;
897
898 audio_rtp_sender_->SetParametersAsync(
899 params, [&result](webrtc::RTCError error) { result = error; });
900 run_loop_.Flush();
901 EXPECT_TRUE(result->ok());
902
903 params = audio_rtp_sender_->GetParameters();
904 EXPECT_EQ(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());
Florent Castelli892acf02018-10-01 22:47:20 +0200910
911 DestroyAudioRtpSender();
912}
913
914TEST_F(RtpSenderReceiverTest, AudioSenderInitParametersMovedAfterNegotiation) {
915 audio_track_ = AudioTrack::Create(kAudioTrackId, nullptr);
Harald Alvestrand2f7ad282022-04-21 11:35:43 +0000916 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
Florent Castelli892acf02018-10-01 22:47:20 +0200917
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200918 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200919 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200920 audio_rtp_sender_ = AudioRtpSender::Create(
921 worker_thread_, audio_track_->id(), nullptr, set_streams_observer.get());
Niels Möllerafb246b2022-04-20 14:26:50 +0200922 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_.get()));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200923 EXPECT_CALL(*set_streams_observer, OnSetStreams());
924 audio_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli892acf02018-10-01 22:47:20 +0200925
926 std::vector<RtpEncodingParameters> init_encodings(1);
927 init_encodings[0].max_bitrate_bps = 60000;
928 audio_rtp_sender_->set_init_send_encodings(init_encodings);
929
930 RtpParameters params = audio_rtp_sender_->GetParameters();
931 ASSERT_EQ(1u, params.encodings.size());
932 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
933
934 // Simulate the setLocalDescription call
935 std::vector<uint32_t> ssrcs(1, 1);
936 cricket::StreamParams stream_params =
937 cricket::CreateSimStreamParams("cname", ssrcs);
Harald Alvestrand485457f2022-05-23 08:46:57 +0000938 voice_media_channel()->AddSendStream(stream_params);
939 audio_rtp_sender_->SetMediaChannel(voice_media_channel());
Florent Castelli892acf02018-10-01 22:47:20 +0200940 audio_rtp_sender_->SetSsrc(1);
941
942 params = audio_rtp_sender_->GetParameters();
943 ASSERT_EQ(1u, params.encodings.size());
944 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
945
946 DestroyAudioRtpSender();
947}
948
949TEST_F(RtpSenderReceiverTest,
950 AudioSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800951 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200952 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +0200953
954 RtpParameters params;
955 RTCError result = audio_rtp_sender_->SetParameters(params);
956 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
957 DestroyAudioRtpSender();
958}
959
Florent Castellicebf50f2018-05-03 15:31:53 +0200960TEST_F(RtpSenderReceiverTest,
961 AudioSenderMustCallGetParametersBeforeSetParameters) {
962 CreateAudioRtpSender();
963
964 RtpParameters params;
965 RTCError result = audio_rtp_sender_->SetParameters(params);
966 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
967
968 DestroyAudioRtpSender();
969}
970
971TEST_F(RtpSenderReceiverTest,
972 AudioSenderSetParametersInvalidatesTransactionId) {
973 CreateAudioRtpSender();
974
975 RtpParameters params = audio_rtp_sender_->GetParameters();
976 EXPECT_EQ(1u, params.encodings.size());
977 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
978 RTCError result = audio_rtp_sender_->SetParameters(params);
979 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
980
981 DestroyAudioRtpSender();
982}
983
Florent Castelliacabb362022-10-18 17:05:16 +0200984TEST_F(RtpSenderReceiverTest,
985 AudioSenderSetParametersAsyncInvalidatesTransactionId) {
986 CreateAudioRtpSender();
987
988 RtpParameters params = audio_rtp_sender_->GetParameters();
989 EXPECT_EQ(1u, params.encodings.size());
990 absl::optional<webrtc::RTCError> result;
991 audio_rtp_sender_->SetParametersAsync(
992 params, [&result](webrtc::RTCError error) { result = error; });
993 run_loop_.Flush();
994 EXPECT_TRUE(result->ok());
995 audio_rtp_sender_->SetParametersAsync(
996 params, [&result](webrtc::RTCError error) { result = error; });
997 run_loop_.Flush();
998 EXPECT_EQ(RTCErrorType::INVALID_STATE, result->type());
999
1000 DestroyAudioRtpSender();
1001}
1002
Florent Castellicebf50f2018-05-03 15:31:53 +02001003TEST_F(RtpSenderReceiverTest, AudioSenderDetectTransactionIdModification) {
1004 CreateAudioRtpSender();
1005
1006 RtpParameters params = audio_rtp_sender_->GetParameters();
1007 params.transaction_id = "";
1008 RTCError result = audio_rtp_sender_->SetParameters(params);
1009 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1010
1011 DestroyAudioRtpSender();
1012}
1013
1014TEST_F(RtpSenderReceiverTest, AudioSenderCheckTransactionIdRefresh) {
1015 CreateAudioRtpSender();
1016
1017 RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001018 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 15:31:53 +02001019 auto saved_transaction_id = params.transaction_id;
1020 params = audio_rtp_sender_->GetParameters();
1021 EXPECT_NE(saved_transaction_id, params.transaction_id);
1022
1023 DestroyAudioRtpSender();
1024}
1025
1026TEST_F(RtpSenderReceiverTest, AudioSenderSetParametersOldValueFail) {
1027 CreateAudioRtpSender();
1028
1029 RtpParameters params = audio_rtp_sender_->GetParameters();
1030 RtpParameters second_params = audio_rtp_sender_->GetParameters();
1031
1032 RTCError result = audio_rtp_sender_->SetParameters(params);
1033 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
Seth Hampson2d2c8882018-05-16 16:02:32 -07001034 DestroyAudioRtpSender();
1035}
1036
1037TEST_F(RtpSenderReceiverTest, AudioSenderCantSetUnimplementedRtpParameters) {
1038 CreateAudioRtpSender();
1039 RtpParameters params = audio_rtp_sender_->GetParameters();
1040 EXPECT_EQ(1u, params.encodings.size());
1041
Florent Castelli87b3c512018-07-18 16:00:28 +02001042 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 16:02:32 -07001043 params.mid = "dummy_mid";
1044 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1045 audio_rtp_sender_->SetParameters(params).type());
1046 params = audio_rtp_sender_->GetParameters();
1047
Seth Hampson2d2c8882018-05-16 16:02:32 -07001048 DestroyAudioRtpSender();
1049}
1050
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001051TEST_F(RtpSenderReceiverTest, SetAudioMaxSendBitrate) {
1052 CreateAudioRtpSender();
1053
Harald Alvestrand485457f2022-05-23 08:46:57 +00001054 EXPECT_EQ(-1, voice_media_channel()->max_bps());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001055 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001056 EXPECT_EQ(1U, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -08001057 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001058 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -08001059 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001060
1061 // Read back the parameters and verify they have been changed.
1062 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001063 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001064 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001065
1066 // Verify that the audio channel received the new parameters.
Harald Alvestrand485457f2022-05-23 08:46:57 +00001067 params = voice_media_channel()->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001068 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001069 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001070
1071 // Verify that the global bitrate limit has not been changed.
Harald Alvestrand485457f2022-05-23 08:46:57 +00001072 EXPECT_EQ(-1, voice_media_channel()->max_bps());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001073
1074 DestroyAudioRtpSender();
1075}
1076
Seth Hampson24722b32017-12-22 09:36:42 -08001077TEST_F(RtpSenderReceiverTest, SetAudioBitratePriority) {
1078 CreateAudioRtpSender();
1079
1080 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001081 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001082 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1083 params.encodings[0].bitrate_priority);
1084 double new_bitrate_priority = 2.0;
1085 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -08001086 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -08001087
1088 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001089 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001090 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1091
Harald Alvestrand485457f2022-05-23 08:46:57 +00001092 params = voice_media_channel()->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001093 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001094 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1095
1096 DestroyAudioRtpSender();
1097}
1098
skvladdc1c62c2016-03-16 19:07:43 -07001099TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) {
1100 CreateVideoRtpSender();
1101
skvladdc1c62c2016-03-16 19:07:43 -07001102 RtpParameters params = video_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001103 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -08001104 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -07001105
1106 DestroyVideoRtpSender();
1107}
1108
Florent Castelliacabb362022-10-18 17:05:16 +02001109TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParametersAsync) {
1110 CreateVideoRtpSender();
1111
1112 RtpParameters params = video_rtp_sender_->GetParameters();
1113 EXPECT_EQ(1u, params.encodings.size());
1114 absl::optional<webrtc::RTCError> result;
1115 video_rtp_sender_->SetParametersAsync(
1116 params, [&result](webrtc::RTCError error) { result = error; });
1117 run_loop_.Flush();
1118 EXPECT_TRUE(result->ok());
1119
1120 DestroyVideoRtpSender();
1121}
1122
Florent Castelli892acf02018-10-01 22:47:20 +02001123TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParametersBeforeNegotiation) {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001124 video_rtp_sender_ =
1125 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +02001126
1127 RtpParameters params = video_rtp_sender_->GetParameters();
1128 ASSERT_EQ(1u, params.encodings.size());
1129 params.encodings[0].max_bitrate_bps = 90000;
1130 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1131
1132 params = video_rtp_sender_->GetParameters();
1133 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1134 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
1135
1136 DestroyVideoRtpSender();
1137}
1138
Florent Castelliacabb362022-10-18 17:05:16 +02001139TEST_F(RtpSenderReceiverTest,
1140 VideoSenderCanSetParametersAsyncBeforeNegotiation) {
1141 video_rtp_sender_ =
1142 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
1143
1144 absl::optional<webrtc::RTCError> result;
1145 RtpParameters params = video_rtp_sender_->GetParameters();
1146 ASSERT_EQ(1u, params.encodings.size());
1147 params.encodings[0].max_bitrate_bps = 90000;
1148 video_rtp_sender_->SetParametersAsync(
1149 params, [&result](webrtc::RTCError error) { result = error; });
1150 run_loop_.Flush();
1151 EXPECT_TRUE(result->ok());
1152
1153 params = video_rtp_sender_->GetParameters();
1154 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
1155 video_rtp_sender_->SetParametersAsync(
1156 params, [&result](webrtc::RTCError error) { result = error; });
1157 run_loop_.Flush();
1158 EXPECT_TRUE(result->ok());
1159
1160 DestroyVideoRtpSender();
1161}
1162
Florent Castelli892acf02018-10-01 22:47:20 +02001163TEST_F(RtpSenderReceiverTest, VideoSenderInitParametersMovedAfterNegotiation) {
1164 AddVideoTrack(false);
1165
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001166 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001167 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001168 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1169 set_streams_observer.get());
Niels Möllerafb246b2022-04-20 14:26:50 +02001170 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001171 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1172 video_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli892acf02018-10-01 22:47:20 +02001173
1174 std::vector<RtpEncodingParameters> init_encodings(2);
1175 init_encodings[0].max_bitrate_bps = 60000;
1176 init_encodings[1].max_bitrate_bps = 900000;
1177 video_rtp_sender_->set_init_send_encodings(init_encodings);
1178
1179 RtpParameters params = video_rtp_sender_->GetParameters();
1180 ASSERT_EQ(2u, params.encodings.size());
1181 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1182 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
1183
1184 // Simulate the setLocalDescription call
1185 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +01001186 ssrcs.reserve(2);
Florent Castelli892acf02018-10-01 22:47:20 +02001187 for (int i = 0; i < 2; ++i)
1188 ssrcs.push_back(kVideoSsrcSimulcast + i);
1189 cricket::StreamParams stream_params =
1190 cricket::CreateSimStreamParams("cname", ssrcs);
Harald Alvestrand485457f2022-05-23 08:46:57 +00001191 video_media_channel()->AddSendStream(stream_params);
1192 video_rtp_sender_->SetMediaChannel(video_media_channel());
Florent Castelli892acf02018-10-01 22:47:20 +02001193 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
1194
1195 params = video_rtp_sender_->GetParameters();
1196 ASSERT_EQ(2u, params.encodings.size());
1197 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1198 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
1199
1200 DestroyVideoRtpSender();
1201}
1202
1203TEST_F(RtpSenderReceiverTest,
1204 VideoSenderInitParametersMovedAfterManualSimulcastAndNegotiation) {
1205 AddVideoTrack(false);
1206
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001207 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001208 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001209 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1210 set_streams_observer.get());
Niels Möllerafb246b2022-04-20 14:26:50 +02001211 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001212 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1213 video_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli892acf02018-10-01 22:47:20 +02001214
1215 std::vector<RtpEncodingParameters> init_encodings(1);
1216 init_encodings[0].max_bitrate_bps = 60000;
1217 video_rtp_sender_->set_init_send_encodings(init_encodings);
1218
1219 RtpParameters params = video_rtp_sender_->GetParameters();
1220 ASSERT_EQ(1u, params.encodings.size());
1221 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1222
1223 // Simulate the setLocalDescription call as if the user used SDP munging
1224 // to enable simulcast
1225 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +01001226 ssrcs.reserve(2);
Florent Castelli892acf02018-10-01 22:47:20 +02001227 for (int i = 0; i < 2; ++i)
1228 ssrcs.push_back(kVideoSsrcSimulcast + i);
1229 cricket::StreamParams stream_params =
1230 cricket::CreateSimStreamParams("cname", ssrcs);
Harald Alvestrand485457f2022-05-23 08:46:57 +00001231 video_media_channel()->AddSendStream(stream_params);
1232 video_rtp_sender_->SetMediaChannel(video_media_channel());
Florent Castelli892acf02018-10-01 22:47:20 +02001233 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
1234
1235 params = video_rtp_sender_->GetParameters();
1236 ASSERT_EQ(2u, params.encodings.size());
1237 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1238
1239 DestroyVideoRtpSender();
1240}
1241
Harald Alvestrand3fe8b0d2022-07-01 07:36:59 +00001242#if GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
1243using RtpSenderReceiverDeathTest = RtpSenderReceiverTest;
1244
1245TEST_F(RtpSenderReceiverDeathTest,
1246 VideoSenderManualRemoveSimulcastFailsDeathTest) {
1247 AddVideoTrack(false);
1248
1249 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
1250 std::make_unique<MockSetStreamsObserver>();
1251 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1252 set_streams_observer.get());
1253 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
1254 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1255 video_rtp_sender_->SetStreams({local_stream_->id()});
1256
1257 std::vector<RtpEncodingParameters> init_encodings(2);
1258 init_encodings[0].max_bitrate_bps = 60000;
1259 init_encodings[1].max_bitrate_bps = 120000;
1260 video_rtp_sender_->set_init_send_encodings(init_encodings);
1261
1262 RtpParameters params = video_rtp_sender_->GetParameters();
1263 ASSERT_EQ(2u, params.encodings.size());
1264 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1265
1266 // Simulate the setLocalDescription call as if the user used SDP munging
1267 // to disable simulcast.
1268 std::vector<uint32_t> ssrcs;
1269 ssrcs.reserve(2);
1270 for (int i = 0; i < 2; ++i)
1271 ssrcs.push_back(kVideoSsrcSimulcast + i);
1272 cricket::StreamParams stream_params =
1273 cricket::StreamParams::CreateLegacy(kVideoSsrc);
1274 video_media_channel()->AddSendStream(stream_params);
1275 video_rtp_sender_->SetMediaChannel(video_media_channel());
1276 EXPECT_DEATH(video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast), "");
1277}
1278#endif
1279
Florent Castelli892acf02018-10-01 22:47:20 +02001280TEST_F(RtpSenderReceiverTest,
1281 VideoSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001282 video_rtp_sender_ =
1283 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +02001284
1285 RtpParameters params;
1286 RTCError result = video_rtp_sender_->SetParameters(params);
1287 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1288 DestroyVideoRtpSender();
1289}
1290
Florent Castellicebf50f2018-05-03 15:31:53 +02001291TEST_F(RtpSenderReceiverTest,
1292 VideoSenderMustCallGetParametersBeforeSetParameters) {
1293 CreateVideoRtpSender();
1294
1295 RtpParameters params;
1296 RTCError result = video_rtp_sender_->SetParameters(params);
1297 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1298
1299 DestroyVideoRtpSender();
1300}
1301
1302TEST_F(RtpSenderReceiverTest,
1303 VideoSenderSetParametersInvalidatesTransactionId) {
1304 CreateVideoRtpSender();
1305
1306 RtpParameters params = video_rtp_sender_->GetParameters();
1307 EXPECT_EQ(1u, params.encodings.size());
1308 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1309 RTCError result = video_rtp_sender_->SetParameters(params);
1310 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1311
1312 DestroyVideoRtpSender();
1313}
1314
Florent Castelliacabb362022-10-18 17:05:16 +02001315TEST_F(RtpSenderReceiverTest,
1316 VideoSenderSetParametersAsyncInvalidatesTransactionId) {
1317 CreateVideoRtpSender();
1318
1319 RtpParameters params = video_rtp_sender_->GetParameters();
1320 EXPECT_EQ(1u, params.encodings.size());
1321 absl::optional<webrtc::RTCError> result;
1322 video_rtp_sender_->SetParametersAsync(
1323 params, [&result](webrtc::RTCError error) { result = error; });
1324 run_loop_.Flush();
1325 EXPECT_TRUE(result->ok());
1326 video_rtp_sender_->SetParametersAsync(
1327 params, [&result](webrtc::RTCError error) { result = error; });
1328 run_loop_.Flush();
1329 EXPECT_EQ(RTCErrorType::INVALID_STATE, result->type());
1330
1331 DestroyVideoRtpSender();
1332}
1333
Florent Castellicebf50f2018-05-03 15:31:53 +02001334TEST_F(RtpSenderReceiverTest, VideoSenderDetectTransactionIdModification) {
1335 CreateVideoRtpSender();
1336
1337 RtpParameters params = video_rtp_sender_->GetParameters();
1338 params.transaction_id = "";
1339 RTCError result = video_rtp_sender_->SetParameters(params);
1340 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1341
1342 DestroyVideoRtpSender();
1343}
1344
1345TEST_F(RtpSenderReceiverTest, VideoSenderCheckTransactionIdRefresh) {
1346 CreateVideoRtpSender();
1347
1348 RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001349 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 15:31:53 +02001350 auto saved_transaction_id = params.transaction_id;
1351 params = video_rtp_sender_->GetParameters();
1352 EXPECT_NE(saved_transaction_id, params.transaction_id);
1353
1354 DestroyVideoRtpSender();
1355}
1356
1357TEST_F(RtpSenderReceiverTest, VideoSenderSetParametersOldValueFail) {
1358 CreateVideoRtpSender();
1359
1360 RtpParameters params = video_rtp_sender_->GetParameters();
1361 RtpParameters second_params = video_rtp_sender_->GetParameters();
1362
1363 RTCError result = video_rtp_sender_->SetParameters(params);
1364 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1365
1366 DestroyVideoRtpSender();
1367}
1368
Seth Hampson2d2c8882018-05-16 16:02:32 -07001369TEST_F(RtpSenderReceiverTest, VideoSenderCantSetUnimplementedRtpParameters) {
1370 CreateVideoRtpSender();
1371 RtpParameters params = video_rtp_sender_->GetParameters();
1372 EXPECT_EQ(1u, params.encodings.size());
1373
Florent Castelli87b3c512018-07-18 16:00:28 +02001374 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 16:02:32 -07001375 params.mid = "dummy_mid";
1376 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1377 video_rtp_sender_->SetParameters(params).type());
1378 params = video_rtp_sender_->GetParameters();
1379
Seth Hampson2d2c8882018-05-16 16:02:32 -07001380 DestroyVideoRtpSender();
1381}
1382
Florent Castellic1a0bcb2019-01-29 14:26:48 +01001383TEST_F(RtpSenderReceiverTest, VideoSenderCanSetScaleResolutionDownBy) {
1384 CreateVideoRtpSender();
1385
1386 RtpParameters params = video_rtp_sender_->GetParameters();
1387 params.encodings[0].scale_resolution_down_by = 2;
1388
1389 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1390 params = video_rtp_sender_->GetParameters();
1391 EXPECT_EQ(2, params.encodings[0].scale_resolution_down_by);
1392
1393 DestroyVideoRtpSender();
1394}
1395
1396TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidScaleResolutionDownBy) {
1397 CreateVideoRtpSender();
1398
1399 RtpParameters params = video_rtp_sender_->GetParameters();
1400 params.encodings[0].scale_resolution_down_by = 0.5;
1401 RTCError result = video_rtp_sender_->SetParameters(params);
1402 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1403
1404 DestroyVideoRtpSender();
1405}
1406
Ă…sa Perssonfb195962021-08-16 16:41:56 +02001407TEST_F(RtpSenderReceiverTest, VideoSenderCanSetNumTemporalLayers) {
1408 CreateVideoRtpSender();
1409
1410 RtpParameters params = video_rtp_sender_->GetParameters();
1411 params.encodings[0].num_temporal_layers = 2;
1412
1413 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1414 params = video_rtp_sender_->GetParameters();
1415 EXPECT_EQ(2, params.encodings[0].num_temporal_layers);
1416
1417 DestroyVideoRtpSender();
1418}
1419
1420TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidNumTemporalLayers) {
1421 CreateVideoRtpSender();
1422
1423 RtpParameters params = video_rtp_sender_->GetParameters();
1424 params.encodings[0].num_temporal_layers = webrtc::kMaxTemporalStreams + 1;
1425 RTCError result = video_rtp_sender_->SetParameters(params);
1426 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1427
1428 DestroyVideoRtpSender();
1429}
1430
Florent Castelli907dc802019-12-06 15:03:19 +01001431TEST_F(RtpSenderReceiverTest, VideoSenderCanSetMaxFramerate) {
1432 CreateVideoRtpSender();
1433
1434 RtpParameters params = video_rtp_sender_->GetParameters();
1435 params.encodings[0].max_framerate = 20;
1436
1437 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1438 params = video_rtp_sender_->GetParameters();
1439 EXPECT_EQ(20., params.encodings[0].max_framerate);
1440
1441 DestroyVideoRtpSender();
1442}
1443
1444TEST_F(RtpSenderReceiverTest, VideoSenderCanSetMaxFramerateZero) {
1445 CreateVideoRtpSender();
1446
1447 RtpParameters params = video_rtp_sender_->GetParameters();
1448 params.encodings[0].max_framerate = 0.;
1449
1450 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1451 params = video_rtp_sender_->GetParameters();
1452 EXPECT_EQ(0., params.encodings[0].max_framerate);
1453
1454 DestroyVideoRtpSender();
1455}
1456
1457TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidMaxFramerate) {
1458 CreateVideoRtpSender();
1459
1460 RtpParameters params = video_rtp_sender_->GetParameters();
1461 params.encodings[0].max_framerate = -5.;
1462 RTCError result = video_rtp_sender_->SetParameters(params);
1463 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1464
1465 DestroyVideoRtpSender();
1466}
1467
Seth Hampson2d2c8882018-05-16 16:02:32 -07001468// A video sender can have multiple simulcast layers, in which case it will
1469// contain multiple RtpEncodingParameters. This tests that if this is the case
1470// (simulcast), then we can't set the bitrate_priority, or max_bitrate_bps
1471// for any encodings besides at index 0, because these are both implemented
1472// "per-sender."
1473TEST_F(RtpSenderReceiverTest, VideoSenderCantSetPerSenderEncodingParameters) {
1474 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001475 CreateVideoRtpSenderWithSimulcast();
Seth Hampson2d2c8882018-05-16 16:02:32 -07001476 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001477 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Seth Hampson2d2c8882018-05-16 16:02:32 -07001478
1479 params.encodings[1].bitrate_priority = 2.0;
1480 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1481 video_rtp_sender_->SetParameters(params).type());
1482 params = video_rtp_sender_->GetParameters();
1483
Seth Hampson2d2c8882018-05-16 16:02:32 -07001484 DestroyVideoRtpSender();
1485}
1486
Florent Castelli892acf02018-10-01 22:47:20 +02001487TEST_F(RtpSenderReceiverTest, VideoSenderCantSetReadOnlyEncodingParameters) {
1488 // Add a simulcast specific send stream that contains 2 encoding parameters.
1489 CreateVideoRtpSenderWithSimulcast();
1490 RtpParameters params = video_rtp_sender_->GetParameters();
1491 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
1492
1493 for (size_t i = 0; i < params.encodings.size(); i++) {
1494 params.encodings[i].ssrc = 1337;
1495 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION,
1496 video_rtp_sender_->SetParameters(params).type());
1497 params = video_rtp_sender_->GetParameters();
1498 }
1499
1500 DestroyVideoRtpSender();
1501}
1502
Ă…sa Persson55659812018-06-18 17:51:32 +02001503TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrate) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001504 CreateVideoRtpSender();
1505
Harald Alvestrand485457f2022-05-23 08:46:57 +00001506 EXPECT_EQ(-1, video_media_channel()->max_bps());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001507 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001508 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001509 EXPECT_FALSE(params.encodings[0].min_bitrate_bps);
deadbeefe702b302017-02-04 12:09:01 -08001510 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Ă…sa Persson55659812018-06-18 17:51:32 +02001511 params.encodings[0].min_bitrate_bps = 100;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001512 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -08001513 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001514
1515 // Read back the parameters and verify they have been changed.
1516 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001517 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001518 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001519 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001520
1521 // Verify that the video channel received the new parameters.
Harald Alvestrand485457f2022-05-23 08:46:57 +00001522 params = video_media_channel()->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001523 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001524 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001525 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001526
1527 // Verify that the global bitrate limit has not been changed.
Harald Alvestrand485457f2022-05-23 08:46:57 +00001528 EXPECT_EQ(-1, video_media_channel()->max_bps());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001529
1530 DestroyVideoRtpSender();
1531}
1532
Ă…sa Persson55659812018-06-18 17:51:32 +02001533TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrateSimulcast) {
1534 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001535 CreateVideoRtpSenderWithSimulcast();
Ă…sa Persson55659812018-06-18 17:51:32 +02001536
1537 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001538 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001539 params.encodings[0].min_bitrate_bps = 100;
1540 params.encodings[0].max_bitrate_bps = 1000;
1541 params.encodings[1].min_bitrate_bps = 200;
1542 params.encodings[1].max_bitrate_bps = 2000;
1543 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1544
1545 // Verify that the video channel received the new parameters.
Harald Alvestrand485457f2022-05-23 08:46:57 +00001546 params = video_media_channel()->GetRtpSendParameters(kVideoSsrcSimulcast);
Florent Castelli892acf02018-10-01 22:47:20 +02001547 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001548 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
1549 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
1550 EXPECT_EQ(200, params.encodings[1].min_bitrate_bps);
1551 EXPECT_EQ(2000, params.encodings[1].max_bitrate_bps);
1552
1553 DestroyVideoRtpSender();
1554}
1555
Seth Hampson24722b32017-12-22 09:36:42 -08001556TEST_F(RtpSenderReceiverTest, SetVideoBitratePriority) {
1557 CreateVideoRtpSender();
1558
1559 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001560 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001561 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1562 params.encodings[0].bitrate_priority);
1563 double new_bitrate_priority = 2.0;
1564 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -08001565 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -08001566
1567 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001568 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001569 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1570
Harald Alvestrand485457f2022-05-23 08:46:57 +00001571 params = video_media_channel()->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001572 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001573 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1574
1575 DestroyVideoRtpSender();
1576}
1577
Florent Castelli38332cd2018-11-20 14:08:06 +01001578TEST_F(RtpSenderReceiverTest, VideoReceiverCanGetParametersWithSimulcast) {
1579 CreateVideoRtpReceiverWithSimulcast({}, 2);
1580
1581 RtpParameters params = video_rtp_receiver_->GetParameters();
1582 EXPECT_EQ(2u, params.encodings.size());
1583
1584 DestroyVideoRtpReceiver();
1585}
1586
Philipp Hanckeb83cd922022-11-09 11:06:38 +01001587TEST_F(RtpSenderReceiverTest, GenerateKeyFrameWithAudio) {
1588 CreateAudioRtpSender();
1589
1590 auto error = audio_rtp_sender_->GenerateKeyFrame({});
1591 EXPECT_FALSE(error.ok());
1592 EXPECT_EQ(error.type(), RTCErrorType::UNSUPPORTED_OPERATION);
1593
1594 DestroyAudioRtpSender();
1595}
1596
1597TEST_F(RtpSenderReceiverTest, GenerateKeyFrameWithVideo) {
1598 CreateVideoRtpSenderWithSimulcast({"1", "2", "3"});
1599
1600 auto error = video_rtp_sender_->GenerateKeyFrame({});
1601 EXPECT_TRUE(error.ok());
1602
1603 error = video_rtp_sender_->GenerateKeyFrame({"1"});
1604 EXPECT_TRUE(error.ok());
1605
1606 error = video_rtp_sender_->GenerateKeyFrame({""});
1607 EXPECT_FALSE(error.ok());
1608 EXPECT_EQ(error.type(), RTCErrorType::INVALID_PARAMETER);
1609
1610 error = video_rtp_sender_->GenerateKeyFrame({"no-such-rid"});
1611 EXPECT_FALSE(error.ok());
1612 EXPECT_EQ(error.type(), RTCErrorType::INVALID_PARAMETER);
1613
1614 DestroyVideoRtpSender();
1615}
1616
pbos5214a0a2016-12-16 15:39:11 -08001617// Test that makes sure that a video track content hint translates to the proper
1618// value for sources that are not screencast.
1619TEST_F(RtpSenderReceiverTest, PropagatesVideoTrackContentHint) {
1620 CreateVideoRtpSender();
1621
1622 video_track_->set_enabled(true);
1623
Artem Titov880fa812021-07-30 22:30:23 +02001624 // `video_track_` is not screencast by default.
Harald Alvestrand485457f2022-05-23 08:46:57 +00001625 EXPECT_EQ(false, video_media_channel()->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001626 // No content hint should be set by default.
1627 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1628 video_track_->content_hint());
1629 // Setting detailed should turn a non-screencast source into screencast mode.
1630 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Harald Alvestrand485457f2022-05-23 08:46:57 +00001631 EXPECT_EQ(true, video_media_channel()->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001632 // Removing the content hint should turn the track back into non-screencast
1633 // mode.
1634 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Harald Alvestrand485457f2022-05-23 08:46:57 +00001635 EXPECT_EQ(false, video_media_channel()->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001636 // Setting fluid should remain in non-screencast mode (its default).
1637 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Harald Alvestrand485457f2022-05-23 08:46:57 +00001638 EXPECT_EQ(false, video_media_channel()->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 08:53:10 +02001639 // Setting text should have the same effect as Detailed
1640 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
Harald Alvestrand485457f2022-05-23 08:46:57 +00001641 EXPECT_EQ(true, video_media_channel()->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001642
1643 DestroyVideoRtpSender();
1644}
1645
1646// Test that makes sure that a video track content hint translates to the proper
1647// value for screencast sources.
1648TEST_F(RtpSenderReceiverTest,
1649 PropagatesVideoTrackContentHintForScreencastSource) {
1650 CreateVideoRtpSender(true);
1651
1652 video_track_->set_enabled(true);
1653
Artem Titov880fa812021-07-30 22:30:23 +02001654 // `video_track_` with a screencast source should be screencast by default.
Harald Alvestrand485457f2022-05-23 08:46:57 +00001655 EXPECT_EQ(true, video_media_channel()->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001656 // No content hint should be set by default.
1657 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1658 video_track_->content_hint());
1659 // Setting fluid should turn a screencast source into non-screencast mode.
1660 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Harald Alvestrand485457f2022-05-23 08:46:57 +00001661 EXPECT_EQ(false, video_media_channel()->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001662 // Removing the content hint should turn the track back into screencast mode.
1663 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Harald Alvestrand485457f2022-05-23 08:46:57 +00001664 EXPECT_EQ(true, video_media_channel()->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001665 // Setting detailed should still remain in screencast mode (its default).
1666 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Harald Alvestrand485457f2022-05-23 08:46:57 +00001667 EXPECT_EQ(true, video_media_channel()->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 08:53:10 +02001668 // Setting text should have the same effect as Detailed
1669 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
Harald Alvestrand485457f2022-05-23 08:46:57 +00001670 EXPECT_EQ(true, video_media_channel()->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001671
1672 DestroyVideoRtpSender();
1673}
1674
1675// Test that makes sure any content hints that are set on a track before
1676// VideoRtpSender is ready to send are still applied when it gets ready to send.
1677TEST_F(RtpSenderReceiverTest,
1678 PropagatesVideoTrackContentHintSetBeforeEnabling) {
1679 AddVideoTrack();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001680 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001681 std::make_unique<MockSetStreamsObserver>();
pbos5214a0a2016-12-16 15:39:11 -08001682 // Setting detailed overrides the default non-screencast mode. This should be
1683 // applied even if the track is set on construction.
1684 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001685 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1686 set_streams_observer.get());
Niels Möllerafb246b2022-04-20 14:26:50 +02001687 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001688 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1689 video_rtp_sender_->SetStreams({local_stream_->id()});
Harald Alvestrand485457f2022-05-23 08:46:57 +00001690 video_rtp_sender_->SetMediaChannel(video_media_channel());
pbos5214a0a2016-12-16 15:39:11 -08001691 video_track_->set_enabled(true);
1692
1693 // Sender is not ready to send (no SSRC) so no option should have been set.
Harald Alvestrand485457f2022-05-23 08:46:57 +00001694 EXPECT_EQ(absl::nullopt, video_media_channel()->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001695
1696 // Verify that the content hint is accounted for when video_rtp_sender_ does
1697 // get enabled.
1698 video_rtp_sender_->SetSsrc(kVideoSsrc);
Harald Alvestrand485457f2022-05-23 08:46:57 +00001699 EXPECT_EQ(true, video_media_channel()->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001700
1701 // And removing the hint should go back to false (to verify that false was
1702 // default correctly).
1703 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Harald Alvestrand485457f2022-05-23 08:46:57 +00001704 EXPECT_EQ(false, video_media_channel()->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001705
1706 DestroyVideoRtpSender();
1707}
1708
deadbeef20cb0c12017-02-01 20:27:00 -08001709TEST_F(RtpSenderReceiverTest, AudioSenderHasDtmfSender) {
1710 CreateAudioRtpSender();
1711 EXPECT_NE(nullptr, audio_rtp_sender_->GetDtmfSender());
1712}
1713
1714TEST_F(RtpSenderReceiverTest, VideoSenderDoesNotHaveDtmfSender) {
1715 CreateVideoRtpSender();
1716 EXPECT_EQ(nullptr, video_rtp_sender_->GetDtmfSender());
1717}
1718
Artem Titov880fa812021-07-30 22:30:23 +02001719// Test that the DTMF sender is really using `voice_channel_`, and thus returns
1720// true/false from CanSendDtmf based on what `voice_channel_` returns.
deadbeef20cb0c12017-02-01 20:27:00 -08001721TEST_F(RtpSenderReceiverTest, CanInsertDtmf) {
1722 AddDtmfCodec();
1723 CreateAudioRtpSender();
1724 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1725 ASSERT_NE(nullptr, dtmf_sender);
1726 EXPECT_TRUE(dtmf_sender->CanInsertDtmf());
1727}
1728
1729TEST_F(RtpSenderReceiverTest, CanNotInsertDtmf) {
1730 CreateAudioRtpSender();
1731 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1732 ASSERT_NE(nullptr, dtmf_sender);
1733 // DTMF codec has not been added, as it was in the above test.
1734 EXPECT_FALSE(dtmf_sender->CanInsertDtmf());
1735}
1736
1737TEST_F(RtpSenderReceiverTest, InsertDtmf) {
1738 AddDtmfCodec();
1739 CreateAudioRtpSender();
1740 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1741 ASSERT_NE(nullptr, dtmf_sender);
1742
Harald Alvestrand485457f2022-05-23 08:46:57 +00001743 EXPECT_EQ(0U, voice_media_channel()->dtmf_info_queue().size());
deadbeef20cb0c12017-02-01 20:27:00 -08001744
1745 // Insert DTMF
1746 const int expected_duration = 90;
1747 dtmf_sender->InsertDtmf("012", expected_duration, 100);
1748
1749 // Verify
Harald Alvestrand485457f2022-05-23 08:46:57 +00001750 ASSERT_EQ_WAIT(3U, voice_media_channel()->dtmf_info_queue().size(),
deadbeef20cb0c12017-02-01 20:27:00 -08001751 kDefaultTimeout);
1752 const uint32_t send_ssrc =
Harald Alvestrand485457f2022-05-23 08:46:57 +00001753 voice_media_channel()->send_streams()[0].first_ssrc();
1754 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel()->dtmf_info_queue()[0],
deadbeef20cb0c12017-02-01 20:27:00 -08001755 send_ssrc, 0, expected_duration));
Harald Alvestrand485457f2022-05-23 08:46:57 +00001756 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel()->dtmf_info_queue()[1],
deadbeef20cb0c12017-02-01 20:27:00 -08001757 send_ssrc, 1, expected_duration));
Harald Alvestrand485457f2022-05-23 08:46:57 +00001758 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel()->dtmf_info_queue()[2],
deadbeef20cb0c12017-02-01 20:27:00 -08001759 send_ssrc, 2, expected_duration));
1760}
1761
Benjamin Wright84583f62018-10-04 14:22:34 -07001762// Validate that the default FrameEncryptor setting is nullptr.
1763TEST_F(RtpSenderReceiverTest, AudioSenderCanSetFrameEncryptor) {
1764 CreateAudioRtpSender();
1765 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1766 new FakeFrameEncryptor());
1767 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1768 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1769 EXPECT_EQ(fake_frame_encryptor.get(),
1770 audio_rtp_sender_->GetFrameEncryptor().get());
1771}
1772
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001773// Validate that setting a FrameEncryptor after the send stream is stopped does
1774// nothing.
1775TEST_F(RtpSenderReceiverTest, AudioSenderCannotSetFrameEncryptorAfterStop) {
1776 CreateAudioRtpSender();
1777 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1778 new FakeFrameEncryptor());
1779 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1780 audio_rtp_sender_->Stop();
1781 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1782 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1783}
1784
Benjamin Wright84583f62018-10-04 14:22:34 -07001785// Validate that the default FrameEncryptor setting is nullptr.
1786TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetFrameDecryptor) {
1787 CreateAudioRtpReceiver();
1788 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
Tomas Gunnarssonb3517fe2022-03-18 19:32:38 +01001789 rtc::make_ref_counted<FakeFrameDecryptor>());
Benjamin Wright84583f62018-10-04 14:22:34 -07001790 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
1791 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1792 EXPECT_EQ(fake_frame_decryptor.get(),
1793 audio_rtp_receiver_->GetFrameDecryptor().get());
Tommi4ccdf932021-05-17 14:50:10 +02001794 DestroyAudioRtpReceiver();
Benjamin Wright84583f62018-10-04 14:22:34 -07001795}
1796
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001797// Validate that the default FrameEncryptor setting is nullptr.
1798TEST_F(RtpSenderReceiverTest, AudioReceiverCannotSetFrameDecryptorAfterStop) {
1799 CreateAudioRtpReceiver();
1800 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
Tomas Gunnarssonb3517fe2022-03-18 19:32:38 +01001801 rtc::make_ref_counted<FakeFrameDecryptor>());
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001802 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
Tommi6589def2022-02-17 23:36:47 +01001803 audio_rtp_receiver_->SetMediaChannel(nullptr);
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001804 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1805 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
Tommi4ccdf932021-05-17 14:50:10 +02001806 DestroyAudioRtpReceiver();
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001807}
1808
1809// Validate that the default FrameEncryptor setting is nullptr.
1810TEST_F(RtpSenderReceiverTest, VideoSenderCanSetFrameEncryptor) {
1811 CreateVideoRtpSender();
1812 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1813 new FakeFrameEncryptor());
1814 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1815 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1816 EXPECT_EQ(fake_frame_encryptor.get(),
1817 video_rtp_sender_->GetFrameEncryptor().get());
1818}
1819
1820// Validate that setting a FrameEncryptor after the send stream is stopped does
1821// nothing.
1822TEST_F(RtpSenderReceiverTest, VideoSenderCannotSetFrameEncryptorAfterStop) {
1823 CreateVideoRtpSender();
1824 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1825 new FakeFrameEncryptor());
1826 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1827 video_rtp_sender_->Stop();
1828 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1829 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1830}
1831
1832// Validate that the default FrameEncryptor setting is nullptr.
1833TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetFrameDecryptor) {
1834 CreateVideoRtpReceiver();
1835 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
Tomas Gunnarssonb3517fe2022-03-18 19:32:38 +01001836 rtc::make_ref_counted<FakeFrameDecryptor>());
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001837 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
1838 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1839 EXPECT_EQ(fake_frame_decryptor.get(),
1840 video_rtp_receiver_->GetFrameDecryptor().get());
Tommi4ccdf932021-05-17 14:50:10 +02001841 DestroyVideoRtpReceiver();
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001842}
1843
1844// Validate that the default FrameEncryptor setting is nullptr.
1845TEST_F(RtpSenderReceiverTest, VideoReceiverCannotSetFrameDecryptorAfterStop) {
1846 CreateVideoRtpReceiver();
1847 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
Tomas Gunnarssonb3517fe2022-03-18 19:32:38 +01001848 rtc::make_ref_counted<FakeFrameDecryptor>());
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001849 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
Tommi6589def2022-02-17 23:36:47 +01001850 video_rtp_receiver_->SetMediaChannel(nullptr);
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001851 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1852 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
Tommi4ccdf932021-05-17 14:50:10 +02001853 DestroyVideoRtpReceiver();
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001854}
1855
Amit Hilbuch619b2942019-02-26 15:55:19 -08001856// Checks that calling the internal methods for get/set parameters do not
1857// invalidate any parameters retreived by clients.
1858TEST_F(RtpSenderReceiverTest,
1859 InternalParameterMethodsDoNotInvalidateTransaction) {
1860 CreateVideoRtpSender();
1861 RtpParameters parameters = video_rtp_sender_->GetParameters();
1862 RtpParameters new_parameters = video_rtp_sender_->GetParametersInternal();
1863 new_parameters.encodings[0].active = false;
Florent Castelliacabb362022-10-18 17:05:16 +02001864 video_rtp_sender_->SetParametersInternal(new_parameters, nullptr, true);
Amit Hilbuch619b2942019-02-26 15:55:19 -08001865 new_parameters.encodings[0].active = true;
Florent Castelliacabb362022-10-18 17:05:16 +02001866 video_rtp_sender_->SetParametersInternal(new_parameters, nullptr, true);
Amit Hilbuch619b2942019-02-26 15:55:19 -08001867 parameters.encodings[0].active = false;
1868 EXPECT_TRUE(video_rtp_sender_->SetParameters(parameters).ok());
1869}
1870
Amit Hilbuch2297d332019-02-19 12:49:22 -08001871// Helper method for syntactic sugar for accepting a vector with '{}' notation.
1872std::pair<RidList, RidList> CreatePairOfRidVectors(
1873 const std::vector<std::string>& first,
1874 const std::vector<std::string>& second) {
1875 return std::make_pair(first, second);
1876}
1877
1878// These parameters are used to test disabling simulcast layers.
1879const std::pair<RidList, RidList> kDisableSimulcastLayersParameters[] = {
1880 // Tests removing the first layer. This is a special case because
1881 // the first layer's SSRC is also the 'primary' SSRC used to associate the
1882 // parameters to the media channel.
1883 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"1"}),
1884 // Tests removing some layers.
1885 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"2", "4"}),
1886 // Tests simulcast rejected scenario all layers except first are rejected.
1887 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"2", "3", "4"}),
1888 // Tests removing all layers.
1889 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"1", "2", "3", "4"}),
1890};
1891
1892// Runs test for disabling layers on a sender without a media engine set.
1893TEST_P(RtpSenderReceiverTest, DisableSimulcastLayersWithoutMediaEngine) {
1894 auto parameter = GetParam();
1895 RunDisableSimulcastLayersWithoutMediaEngineTest(parameter.first,
1896 parameter.second);
1897}
1898
1899// Runs test for disabling layers on a sender with a media engine set.
1900TEST_P(RtpSenderReceiverTest, DisableSimulcastLayersWithMediaEngine) {
1901 auto parameter = GetParam();
1902 RunDisableSimulcastLayersWithMediaEngineTest(parameter.first,
1903 parameter.second);
1904}
1905
1906INSTANTIATE_TEST_SUITE_P(
1907 DisableSimulcastLayersInSender,
1908 RtpSenderReceiverTest,
1909 ::testing::ValuesIn(kDisableSimulcastLayersParameters));
1910
deadbeef70ab1a12015-09-28 16:53:55 -07001911} // namespace webrtc