blob: d66ee65f4caf63d720e4fb96e324da746e1cc9a1 [file] [log] [blame]
deadbeef70ab1a12015-09-28 23:53:551/*
kjellanderb24317b2016-02-10 15:54:432 * Copyright 2012 The WebRTC project authors. All Rights Reserved.
deadbeef70ab1a12015-09-28 23:53:553 *
kjellanderb24317b2016-02-10 15:54:434 * 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 23:53:559 */
10
Yves Gerey3e707812018-11-28 15:47:4911#include <stddef.h>
Jonas Olssona4d87372019-07-05 17:08:3312
Yves Gerey3e707812018-11-28 15:47:4913#include <cstdint>
Harald Alvestrandc24a2182022-02-23 13:44:5914#include <iterator>
kwibergd1fe2812016-04-27 13:47:2915#include <memory>
deadbeef70ab1a12015-09-28 23:53:5516#include <string>
Tommif888bb52015-12-12 00:37:0117#include <utility>
Yves Gerey3e707812018-11-28 15:47:4918#include <vector>
deadbeef70ab1a12015-09-28 23:53:5519
Amit Hilbuch2297d332019-02-19 20:49:2220#include "absl/algorithm/container.h"
Yves Gerey3e707812018-11-28 15:47:4921#include "absl/memory/memory.h"
22#include "absl/types/optional.h"
23#include "api/audio_options.h"
Steve Anton10542f22019-01-11 17:11:0024#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 10:24:5330#include "api/rtc_event_log/rtc_event_log.h"
Steve Anton10542f22019-01-11 17:11:0031#include "api/rtp_parameters.h"
Harald Alvestrandc24a2182022-02-23 13:44:5932#include "api/rtp_receiver_interface.h"
Mirko Bonadeid9708072019-01-25 19:26:4833#include "api/scoped_refptr.h"
Benjamin Wright84583f62018-10-04 21:22:3434#include "api/test/fake_frame_decryptor.h"
35#include "api/test/fake_frame_encryptor.h"
Jonas Orelanda3aa9bd2019-04-17 05:38:4036#include "api/video/builtin_video_bitrate_allocator_factory.h"
Harald Alvestrandc24a2182022-02-23 13:44:5937#include "api/video/video_bitrate_allocator_factory.h"
38#include "api/video/video_codec_constants.h"
Yves Gerey3e707812018-11-28 15:47:4939#include "media/base/codec.h"
Harald Alvestrandc24a2182022-02-23 13:44:5940#include "media/base/delayable.h"
Steve Anton10542f22019-01-11 17:11:0041#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:5945#include "media/base/rid_description.h"
Steve Anton10542f22019-01-11 17:11:0046#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 09:29:1952#include "pc/audio_rtp_receiver.h"
Steve Anton10542f22019-01-11 17:11:0053#include "pc/audio_track.h"
Yves Gerey3e707812018-11-28 15:47:4954#include "pc/channel.h"
Steve Anton10542f22019-01-11 17:11:0055#include "pc/dtls_srtp_transport.h"
56#include "pc/local_audio_source.h"
57#include "pc/media_stream.h"
Steve Anton10542f22019-01-11 17:11:0058#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 09:29:1961#include "pc/video_rtp_receiver.h"
Steve Anton10542f22019-01-11 17:11:0062#include "pc/video_track.h"
Yves Gerey3e707812018-11-28 15:47:4963#include "rtc_base/checks.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3164#include "rtc_base/gunit.h"
Yves Gerey3e707812018-11-28 15:47:4965#include "rtc_base/thread.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3166#include "test/gmock.h"
67#include "test/gtest.h"
Tommi4ccdf9322021-05-17 12:50:1068#include "test/run_loop.h"
Jonas Orelanded99dae2022-03-09 08:28:1069#include "test/scoped_key_value_config.h"
deadbeef70ab1a12015-09-28 23:53:5570
71using ::testing::_;
Amit Hilbuch2297d332019-02-19 20:49:2272using ::testing::ContainerEq;
deadbeef70ab1a12015-09-28 23:53:5573using ::testing::Exactly;
deadbeef5dd42fd2016-05-02 23:20:0174using ::testing::InvokeWithoutArgs;
skvladdc1c62c2016-03-17 02:07:4375using ::testing::Return;
Amit Hilbuch2297d332019-02-19 20:49:2276using RidList = std::vector<std::string>;
deadbeef70ab1a12015-09-28 23:53:5577
deadbeef20cb0c12017-02-02 04:27:0078namespace {
79
Seth Hampson845e8782018-03-02 19:34:1080static const char kStreamId1[] = "local_stream_1";
deadbeef70ab1a12015-09-28 23:53:5581static const char kVideoTrackId[] = "video_1";
82static const char kAudioTrackId[] = "audio_1";
Peter Boström0c4e06b2015-10-07 10:23:2183static const uint32_t kVideoSsrc = 98;
deadbeeffac06552015-11-25 19:26:0184static const uint32_t kVideoSsrc2 = 100;
Peter Boström0c4e06b2015-10-07 10:23:2185static const uint32_t kAudioSsrc = 99;
deadbeeffac06552015-11-25 19:26:0186static const uint32_t kAudioSsrc2 = 101;
Florent Castelli892acf02018-10-01 20:47:2087static const uint32_t kVideoSsrcSimulcast = 102;
88static const uint32_t kVideoSimulcastLayerCount = 2;
deadbeef20cb0c12017-02-02 04:27:0089static const int kDefaultTimeout = 10000; // 10 seconds.
Guido Urdaneta1ff16c82019-05-20 17:31:5390
91class MockSetStreamsObserver
92 : public webrtc::RtpSenderBase::SetStreamsObserver {
93 public:
Danil Chapovalov3a353122020-05-15 09:16:5394 MOCK_METHOD(void, OnSetStreams, (), (override));
Guido Urdaneta1ff16c82019-05-20 17:31:5395};
96
deadbeef20cb0c12017-02-02 04:27:0097} // namespace
deadbeef70ab1a12015-09-28 23:53:5598
99namespace webrtc {
100
Amit Hilbuch2297d332019-02-19 20:49:22101class RtpSenderReceiverTest
Mirko Bonadei6a489f22019-04-09 13:11:12102 : public ::testing::Test,
Fredrik Solenbergda2afbd2022-08-03 10:07:51103 public ::testing::WithParamInterface<std::pair<RidList, RidList>> {
tkchin3784b4a2016-06-25 02:31:47104 public:
Taylor Brandstetterba29c6a2016-06-27 23:30:35105 RtpSenderReceiverTest()
Steve Anton47136dd2018-01-12 18:49:35106 : network_thread_(rtc::Thread::Current()),
107 worker_thread_(rtc::Thread::Current()),
Jonas Orelanda3aa9bd2019-04-17 05:38:40108 video_bitrate_allocator_factory_(
109 webrtc::CreateBuiltinVideoBitrateAllocatorFactory()),
Steve Anton47136dd2018-01-12 18:49:35110 // Create fake media engine/etc. so we can create channels to use to
111 // test RtpSenders/RtpReceivers.
Harald Alvestrand0ac50b92022-05-18 07:51:34112 media_engine_(std::make_unique<cricket::FakeMediaEngine>()),
Tomas Gunnarssone984aa22021-04-19 07:21:06113 fake_call_(worker_thread_, network_thread_),
Seth Hampson845e8782018-03-02 19:34:10114 local_stream_(MediaStream::Create(kStreamId1)) {
Mirko Bonadei317a1f02019-09-17 15:06:18115 rtp_dtls_transport_ = std::make_unique<cricket::FakeDtlsTransport>(
Zhi Huange830e682018-03-30 17:48:35116 "fake_dtls_transport", cricket::ICE_CANDIDATE_COMPONENT_RTP);
117 rtp_transport_ = CreateDtlsSrtpTransport();
118
Harald Alvestrand485457f2022-05-23 08:46:57119 // 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 10:36:23127
Harald Alvestrand485457f2022-05-23 08:46:57128 voice_media_channel_ = absl::WrapUnique(media_engine_->GetVoiceChannel(0));
129 video_media_channel_ = absl::WrapUnique(media_engine_->GetVideoChannel(0));
Tomas Gunnarsson4f8a58c2022-01-19 10:36:23130
Harald Alvestrand485457f2022-05-23 08:46:57131 RTC_CHECK(voice_media_channel());
132 RTC_CHECK(video_media_channel());
Taylor Brandstetterba29c6a2016-06-27 23:30:35133
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-25 02:31:47154 }
Taylor Brandstetter2d549172016-06-24 21:18:22155
Tomas Gunnarsson0b5ec182021-04-01 14:49:42156 ~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 14:49:42164 }
165
Zhi Huange830e682018-03-30 17:48:35166 std::unique_ptr<webrtc::RtpTransportInternal> CreateDtlsSrtpTransport() {
Mirko Bonadei317a1f02019-09-17 15:06:18167 auto dtls_srtp_transport = std::make_unique<webrtc::DtlsSrtpTransport>(
Jonas Orelanded99dae2022-03-09 08:28:10168 /*rtcp_mux_required=*/true, field_trials_);
Zhi Huange830e682018-03-30 17:48:35169 dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport_.get(),
170 /*rtcp_dtls_transport=*/nullptr);
171 return dtls_srtp_transport;
172 }
173
deadbeef20cb0c12017-02-02 04:27:00174 // 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:57180 voice_media_channel()->SetSendParameters(params);
deadbeef20cb0c12017-02-02 04:27:00181 }
Taylor Brandstetterba29c6a2016-06-27 23:30:35182
pbos5214a0a2016-12-16 23:39:11183 void AddVideoTrack() { AddVideoTrack(false); }
184
185 void AddVideoTrack(bool is_screencast) {
perkja3ede6c2016-03-08 00:27:48186 rtc::scoped_refptr<VideoTrackSourceInterface> source(
pbos5214a0a2016-12-16 23:39:11187 FakeVideoTrackSource::Create(is_screencast));
perkj773be362017-08-01 06:22:01188 video_track_ =
189 VideoTrack::Create(kVideoTrackId, source, rtc::Thread::Current());
Harald Alvestrand2f7ad282022-04-21 11:35:43190 EXPECT_TRUE(local_stream_->AddTrack(video_track_));
deadbeef70ab1a12015-09-28 23:53:55191 }
192
Taylor Brandstetterba29c6a2016-06-27 23:30:35193 void CreateAudioRtpSender() { CreateAudioRtpSender(nullptr); }
194
Mirko Bonadeic61ce0d2017-11-21 16:04:20195 void CreateAudioRtpSender(
196 const rtc::scoped_refptr<LocalAudioSource>& source) {
Taylor Brandstetterba29c6a2016-06-27 23:30:35197 audio_track_ = AudioTrack::Create(kAudioTrackId, source);
Harald Alvestrand2f7ad282022-04-21 11:35:43198 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
Guido Urdaneta1ff16c82019-05-20 17:31:53199 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 15:06:18200 std::make_unique<MockSetStreamsObserver>();
Steve Anton47136dd2018-01-12 18:49:35201 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 17:31:53202 AudioRtpSender::Create(worker_thread_, audio_track_->id(), nullptr,
203 set_streams_observer.get());
Niels Möllerafb246b2022-04-20 12:26:50204 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_.get()));
Guido Urdaneta1ff16c82019-05-20 17:31:53205 EXPECT_CALL(*set_streams_observer, OnSetStreams());
206 audio_rtp_sender_->SetStreams({local_stream_->id()});
Harald Alvestrand485457f2022-05-23 08:46:57207 audio_rtp_sender_->SetMediaChannel(voice_media_channel());
deadbeeffac06552015-11-25 19:26:01208 audio_rtp_sender_->SetSsrc(kAudioSsrc);
Taylor Brandstetterba29c6a2016-06-27 23:30:35209 VerifyVoiceChannelInput();
deadbeef70ab1a12015-09-28 23:53:55210 }
211
Steve Anton02ee47c2018-01-11 00:26:06212 void CreateAudioRtpSenderWithNoTrack() {
Amit Hilbuchea7ef2a2019-02-19 23:20:21213 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 17:31:53214 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
Harald Alvestrand485457f2022-05-23 08:46:57215 audio_rtp_sender_->SetMediaChannel(voice_media_channel());
Steve Anton02ee47c2018-01-11 00:26:06216 }
217
Seth Hampson2d2c8882018-05-16 23:02:32218 void CreateVideoRtpSender(uint32_t ssrc) {
219 CreateVideoRtpSender(false, ssrc);
220 }
221
pbos5214a0a2016-12-16 23:39:11222 void CreateVideoRtpSender() { CreateVideoRtpSender(false); }
223
Amit Hilbuch2297d332019-02-19 20:49:22224 cricket::StreamParams CreateSimulcastStreamParams(int num_layers) {
Florent Castelli892acf02018-10-01 20:47:20225 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 09:11:53226 ssrcs.reserve(num_layers);
Amit Hilbuch2297d332019-02-19 20:49:22227 for (int i = 0; i < num_layers; ++i) {
Florent Castelli892acf02018-10-01 20:47:20228 ssrcs.push_back(kVideoSsrcSimulcast + i);
Amit Hilbuch2297d332019-02-19 20:49:22229 }
230 return cricket::CreateSimStreamParams("cname", ssrcs);
231 }
232
233 uint32_t CreateVideoRtpSender(const cricket::StreamParams& stream_params) {
Florent Castelli892acf02018-10-01 20:47:20234 video_media_channel_->AddSendStream(stream_params);
235 uint32_t primary_ssrc = stream_params.first_ssrc();
236 CreateVideoRtpSender(primary_ssrc);
Amit Hilbuch2297d332019-02-19 20:49:22237 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 20:47:20256 }
257
Seth Hampson2d2c8882018-05-16 23:02:32258 void CreateVideoRtpSender(bool is_screencast, uint32_t ssrc = kVideoSsrc) {
pbos5214a0a2016-12-16 23:39:11259 AddVideoTrack(is_screencast);
Guido Urdaneta1ff16c82019-05-20 17:31:53260 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 15:06:18261 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 17:31:53262 video_rtp_sender_ = VideoRtpSender::Create(
263 worker_thread_, video_track_->id(), set_streams_observer.get());
Niels Möllerafb246b2022-04-20 12:26:50264 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
Guido Urdaneta1ff16c82019-05-20 17:31:53265 EXPECT_CALL(*set_streams_observer, OnSetStreams());
266 video_rtp_sender_->SetStreams({local_stream_->id()});
Harald Alvestrand485457f2022-05-23 08:46:57267 video_rtp_sender_->SetMediaChannel(video_media_channel());
Seth Hampson2d2c8882018-05-16 23:02:32268 video_rtp_sender_->SetSsrc(ssrc);
269 VerifyVideoChannelInput(ssrc);
deadbeef70ab1a12015-09-28 23:53:55270 }
Steve Anton02ee47c2018-01-11 00:26:06271 void CreateVideoRtpSenderWithNoTrack() {
Guido Urdaneta1ff16c82019-05-20 17:31:53272 video_rtp_sender_ =
273 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Harald Alvestrand485457f2022-05-23 08:46:57274 video_rtp_sender_->SetMediaChannel(video_media_channel());
Steve Anton02ee47c2018-01-11 00:26:06275 }
276
deadbeef70ab1a12015-09-28 23:53:55277 void DestroyAudioRtpSender() {
deadbeef70ab1a12015-09-28 23:53:55278 audio_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 23:30:35279 VerifyVoiceChannelNoInput();
deadbeef70ab1a12015-09-28 23:53:55280 }
281
282 void DestroyVideoRtpSender() {
deadbeef70ab1a12015-09-28 23:53:55283 video_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 23:30:35284 VerifyVideoChannelNoInput();
deadbeef70ab1a12015-09-28 23:53:55285 }
286
Henrik Boström9e6fd2b2017-11-21 12:41:51287 void CreateAudioRtpReceiver(
288 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
Tommi4ccdf9322021-05-17 12:50:10289 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:57292 audio_rtp_receiver_->SetMediaChannel(voice_media_channel());
Steve Antond3679212018-01-18 01:41:02293 audio_rtp_receiver_->SetupMediaChannel(kAudioSsrc);
perkjd61bf802016-03-24 10:16:19294 audio_track_ = audio_rtp_receiver_->audio_track();
Taylor Brandstetterba29c6a2016-06-27 23:30:35295 VerifyVoiceChannelOutput();
deadbeef70ab1a12015-09-28 23:53:55296 }
297
Henrik Boström9e6fd2b2017-11-21 12:41:51298 void CreateVideoRtpReceiver(
299 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
Tommi4ccdf9322021-05-17 12:50:10300 video_rtp_receiver_ = rtc::make_ref_counted<VideoRtpReceiver>(
301 rtc::Thread::Current(), kVideoTrackId, streams);
Harald Alvestrand485457f2022-05-23 08:46:57302 video_rtp_receiver_->SetMediaChannel(video_media_channel());
Steve Antond3679212018-01-18 01:41:02303 video_rtp_receiver_->SetupMediaChannel(kVideoSsrc);
perkjf0dcfe22016-03-10 17:32:00304 video_track_ = video_rtp_receiver_->video_track();
Taylor Brandstetterba29c6a2016-06-27 23:30:35305 VerifyVideoChannelOutput();
deadbeef70ab1a12015-09-28 23:53:55306 }
307
Florent Castelli38332cd2018-11-20 13:08:06308 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 09:11:53312 ssrcs.reserve(num_layers);
Florent Castelli38332cd2018-11-20 13:08:06313 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
Tommi4ccdf9322021-05-17 12:50:10320 video_rtp_receiver_ = rtc::make_ref_counted<VideoRtpReceiver>(
321 rtc::Thread::Current(), kVideoTrackId, streams);
Harald Alvestrand485457f2022-05-23 08:46:57322 video_rtp_receiver_->SetMediaChannel(video_media_channel());
Florent Castelli38332cd2018-11-20 13:08:06323 video_rtp_receiver_->SetupMediaChannel(primary_ssrc);
324 video_track_ = video_rtp_receiver_->video_track();
325 }
326
deadbeef70ab1a12015-09-28 23:53:55327 void DestroyAudioRtpReceiver() {
Tommi4ccdf9322021-05-17 12:50:10328 if (!audio_rtp_receiver_)
329 return;
Tommi6589def2022-02-17 22:36:47330 audio_rtp_receiver_->SetMediaChannel(nullptr);
deadbeef70ab1a12015-09-28 23:53:55331 audio_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 23:30:35332 VerifyVoiceChannelNoOutput();
deadbeef70ab1a12015-09-28 23:53:55333 }
334
335 void DestroyVideoRtpReceiver() {
Tommi4ccdf9322021-05-17 12:50:10336 if (!video_rtp_receiver_)
337 return;
338 video_rtp_receiver_->Stop();
Tommi6589def2022-02-17 22:36:47339 video_rtp_receiver_->SetMediaChannel(nullptr);
deadbeef70ab1a12015-09-28 23:53:55340 video_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 23:30:35341 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:57349 EXPECT_TRUE(voice_media_channel()->HasSource(ssrc));
350 EXPECT_FALSE(voice_media_channel()->IsStreamMuted(ssrc));
Taylor Brandstetterba29c6a2016-06-27 23:30:35351 }
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:57364 EXPECT_FALSE(voice_media_channel()->HasSource(ssrc));
Taylor Brandstetterba29c6a2016-06-27 23:30:35365 }
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:57377 EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 23:30:35378 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:57389 EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 23:30:35390 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 23:53:55396 }
397
Amit Hilbuch2297d332019-02-19 20:49:22398 // 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 17:31:53452 auto sender = VideoRtpSender::Create(rtc::Thread::Current(), "1", nullptr);
Amit Hilbuch2297d332019-02-19 20:49:22453 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 23:20:21458 sender->set_init_send_encodings(parameters.encodings);
459 RunDisableEncodingLayersTest(all_layers, disabled_layers, sender.get());
460 RunSetLastLayerAsInactiveTest(sender.get());
Amit Hilbuch2297d332019-02-19 20:49:22461 }
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 17:55:33483 // Check that minimum Jitter Buffer delay is propagated to the underlying
Artem Titov880fa812021-07-30 20:30:23484 // `media_channel`.
Ruslan Burakov4bac79e2019-04-03 17:55:33485 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 23:53:55494 protected:
Harald Alvestrand485457f2022-05-23 08:46:57495 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
Tommi4ccdf9322021-05-17 12:50:10502 test::RunLoop run_loop_;
Steve Anton47136dd2018-01-12 18:49:35503 rtc::Thread* const network_thread_;
504 rtc::Thread* const worker_thread_;
Danil Chapovalov83bbe912019-08-07 10:24:53505 webrtc::RtcEventLogNull event_log_;
Artem Titov880fa812021-07-30 20:30:23506 // The `rtp_dtls_transport_` and `rtp_transport_` should be destroyed after
507 // the `channel_manager`.
Zhi Huange830e682018-03-30 17:48:35508 std::unique_ptr<cricket::DtlsTransportInternal> rtp_dtls_transport_;
509 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport_;
Jonas Orelanda3aa9bd2019-04-17 05:38:40510 std::unique_ptr<webrtc::VideoBitrateAllocatorFactory>
511 video_bitrate_allocator_factory_;
Harald Alvestrand0ac50b92022-05-18 07:51:34512 std::unique_ptr<cricket::FakeMediaEngine> media_engine_;
513 rtc::UniqueRandomIdGenerator ssrc_generator_;
Taylor Brandstetterba29c6a2016-06-27 23:30:35514 cricket::FakeCall fake_call_;
Harald Alvestrand485457f2022-05-23 08:46:57515 std::unique_ptr<cricket::FakeVoiceMediaChannel> voice_media_channel_;
516 std::unique_ptr<cricket::FakeVideoMediaChannel> video_media_channel_;
deadbeef70ab1a12015-09-28 23:53:55517 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-26 02:15:09521 rtc::scoped_refptr<MediaStreamInterface> local_stream_;
deadbeef70ab1a12015-09-28 23:53:55522 rtc::scoped_refptr<VideoTrackInterface> video_track_;
523 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
Jonas Orelanded99dae2022-03-09 08:28:10524 webrtc::test::ScopedKeyValueConfig field_trials_;
deadbeef70ab1a12015-09-28 23:53:55525};
526
Artem Titov880fa812021-07-30 20:30:23527// Test that `voice_channel_` is updated when an audio track is associated
deadbeef70ab1a12015-09-28 23:53:55528// and disassociated with an AudioRtpSender.
529TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
530 CreateAudioRtpSender();
531 DestroyAudioRtpSender();
532}
533
Artem Titov880fa812021-07-30 20:30:23534// Test that `video_channel_` is updated when a video track is associated and
deadbeef70ab1a12015-09-28 23:53:55535// disassociated with a VideoRtpSender.
536TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
537 CreateVideoRtpSender();
538 DestroyVideoRtpSender();
539}
540
Artem Titov880fa812021-07-30 20:30:23541// Test that `voice_channel_` is updated when a remote audio track is
deadbeef70ab1a12015-09-28 23:53:55542// associated and disassociated with an AudioRtpReceiver.
543TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
544 CreateAudioRtpReceiver();
545 DestroyAudioRtpReceiver();
546}
547
Artem Titov880fa812021-07-30 20:30:23548// Test that `video_channel_` is updated when a remote video track is
Taylor Brandstetterba29c6a2016-06-27 23:30:35549// associated and disassociated with a VideoRtpReceiver.
deadbeef70ab1a12015-09-28 23:53:55550TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
551 CreateVideoRtpReceiver();
552 DestroyVideoRtpReceiver();
553}
554
Henrik Boström9e6fd2b2017-11-21 12:41:51555TEST_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 23:30:35565// Test that the AudioRtpSender applies options from the local audio source.
566TEST_F(RtpSenderReceiverTest, LocalAudioSourceOptionsApplied) {
567 cricket::AudioOptions options;
Oskar Sundbom36f8f3e2017-11-16 09:54:27568 options.echo_cancellation = true;
deadbeef757146b2017-02-11 05:26:48569 auto source = LocalAudioSource::Create(&options);
Niels Möllere7cc8832022-01-04 14:20:03570 CreateAudioRtpSender(source);
Taylor Brandstetter2d549172016-06-24 21:18:22571
Harald Alvestrand485457f2022-05-23 08:46:57572 EXPECT_EQ(true, voice_media_channel()->options().echo_cancellation);
Taylor Brandstetter2d549172016-06-24 21:18:22573
574 DestroyAudioRtpSender();
575}
576
Taylor Brandstetterba29c6a2016-06-27 23:30:35577// 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:57583 EXPECT_TRUE(voice_media_channel()->IsStreamMuted(kAudioSsrc));
Taylor Brandstetterba29c6a2016-06-27 23:30:35584
585 audio_track_->set_enabled(true);
Harald Alvestrand485457f2022-05-23 08:46:57586 EXPECT_FALSE(voice_media_channel()->IsStreamMuted(kAudioSsrc));
Taylor Brandstetterba29c6a2016-06-27 23:30:35587
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 23:53:55593TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
594 CreateAudioRtpReceiver();
595
Taylor Brandstetterba29c6a2016-06-27 23:30:35596 double volume;
Harald Alvestrand485457f2022-05-23 08:46:57597 EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 23:30:35598 EXPECT_EQ(1, volume);
Taylor Brandstetter2d549172016-06-24 21:18:22599
Tommi4ccdf9322021-05-17 12:50:10600 // Handling of enable/disable is applied asynchronously.
Taylor Brandstetterba29c6a2016-06-27 23:30:35601 audio_track_->set_enabled(false);
Tommi4ccdf9322021-05-17 12:50:10602 run_loop_.Flush();
603
Harald Alvestrand485457f2022-05-23 08:46:57604 EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 23:30:35605 EXPECT_EQ(0, volume);
606
deadbeef70ab1a12015-09-28 23:53:55607 audio_track_->set_enabled(true);
Tommi4ccdf9322021-05-17 12:50:10608 run_loop_.Flush();
Harald Alvestrand485457f2022-05-23 08:46:57609 EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 23:30:35610 EXPECT_EQ(1, volume);
deadbeef70ab1a12015-09-28 23:53:55611
612 DestroyAudioRtpReceiver();
613}
614
Taylor Brandstetterba29c6a2016-06-27 23:30:35615// 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 23:53:55618TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
619 CreateVideoRtpSender();
620
deadbeef70ab1a12015-09-28 23:53:55621 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 23:53:55622 video_track_->set_enabled(true);
623
624 DestroyVideoRtpSender();
625}
626
Taylor Brandstetterba29c6a2016-06-27 23:30:35627// Test that the state of the video track created by the VideoRtpReceiver is
628// updated when the receiver is destroyed.
perkjf0dcfe22016-03-10 17:32:00629TEST_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());
Tommi4ccdf9322021-05-17 12:50:10641 DestroyVideoRtpReceiver();
perkjf0dcfe22016-03-10 17:32:00642}
643
Taylor Brandstetterba29c6a2016-06-27 23:30:35644// 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 23:53:55647TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
648 CreateVideoRtpReceiver();
649
650 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 23:53:55651 video_track_->set_enabled(true);
652
653 DestroyVideoRtpReceiver();
654}
655
Taylor Brandstetterba29c6a2016-06-27 23:30:35656// Test that the AudioRtpReceiver applies volume changes from the track source
657// to the media channel.
deadbeef70ab1a12015-09-28 23:53:55658TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
659 CreateAudioRtpReceiver();
660
Taylor Brandstetterba29c6a2016-06-27 23:30:35661 double volume;
662 audio_track_->GetSource()->SetVolume(0.5);
Tommi4ccdf9322021-05-17 12:50:10663 run_loop_.Flush();
Harald Alvestrand485457f2022-05-23 08:46:57664 EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 23:30:35665 EXPECT_EQ(0.5, volume);
deadbeef70ab1a12015-09-28 23:53:55666
667 // Disable the audio track, this should prevent setting the volume.
deadbeef70ab1a12015-09-28 23:53:55668 audio_track_->set_enabled(false);
Tommi4ccdf9322021-05-17 12:50:10669 RTC_DCHECK_EQ(worker_thread_, run_loop_.task_queue());
670 run_loop_.Flush();
Taylor Brandstetterba29c6a2016-06-27 23:30:35671 audio_track_->GetSource()->SetVolume(0.8);
Harald Alvestrand485457f2022-05-23 08:46:57672 EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 23:30:35673 EXPECT_EQ(0, volume);
deadbeef70ab1a12015-09-28 23:53:55674
Taylor Brandstetterba29c6a2016-06-27 23:30:35675 // When the track is enabled, the previously set volume should take effect.
deadbeef70ab1a12015-09-28 23:53:55676 audio_track_->set_enabled(true);
Tommi4ccdf9322021-05-17 12:50:10677 run_loop_.Flush();
Harald Alvestrand485457f2022-05-23 08:46:57678 EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 23:30:35679 EXPECT_EQ(0.8, volume);
deadbeef70ab1a12015-09-28 23:53:55680
Taylor Brandstetterba29c6a2016-06-27 23:30:35681 // Try changing volume one more time.
682 audio_track_->GetSource()->SetVolume(0.9);
Tommi4ccdf9322021-05-17 12:50:10683 run_loop_.Flush();
Harald Alvestrand485457f2022-05-23 08:46:57684 EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 23:30:35685 EXPECT_EQ(0.9, volume);
deadbeef70ab1a12015-09-28 23:53:55686
687 DestroyAudioRtpReceiver();
688}
689
Ruslan Burakov4bac79e2019-04-03 17:55:33690TEST_F(RtpSenderReceiverTest, AudioRtpReceiverDelay) {
691 CreateAudioRtpReceiver();
Harald Alvestrand485457f2022-05-23 08:46:57692 VerifyRtpReceiverDelayBehaviour(voice_media_channel(),
Ruslan Burakov4bac79e2019-04-03 17:55:33693 audio_rtp_receiver_.get(), kAudioSsrc);
Tommi4ccdf9322021-05-17 12:50:10694 DestroyAudioRtpReceiver();
Ruslan Burakov4bac79e2019-04-03 17:55:33695}
696
697TEST_F(RtpSenderReceiverTest, VideoRtpReceiverDelay) {
698 CreateVideoRtpReceiver();
Harald Alvestrand485457f2022-05-23 08:46:57699 VerifyRtpReceiverDelayBehaviour(video_media_channel(),
Ruslan Burakov4bac79e2019-04-03 17:55:33700 video_rtp_receiver_.get(), kVideoSsrc);
Tommi4ccdf9322021-05-17 12:50:10701 DestroyVideoRtpReceiver();
Ruslan Burakov4bac79e2019-04-03 17:55:33702}
703
Taylor Brandstetterba29c6a2016-06-27 23:30:35704// 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 19:26:01706TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-11 00:26:06707 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 19:26:01708 rtc::scoped_refptr<AudioTrackInterface> track =
709 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 23:30:35710
711 // Track but no SSRC.
Niels Möllerafb246b2022-04-20 12:26:50712 EXPECT_TRUE(audio_rtp_sender_->SetTrack(track.get()));
Taylor Brandstetterba29c6a2016-06-27 23:30:35713 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 19:26:01719}
720
Taylor Brandstetterba29c6a2016-06-27 23:30:35721// 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 19:26:01723TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-11 00:26:06724 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 23:30:35725
726 // Track but no SSRC.
Niels Möllerafb246b2022-04-20 12:26:50727 EXPECT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
Taylor Brandstetterba29c6a2016-06-27 23:30:35728 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 19:26:01734}
735
Taylor Brandstetterba29c6a2016-06-27 23:30:35736// 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 19:26:01738TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
Steve Anton02ee47c2018-01-11 00:26:06739 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 19:26:01740 rtc::scoped_refptr<AudioTrackInterface> track =
741 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 23:30:35742 audio_rtp_sender_->SetSsrc(kAudioSsrc);
Niels Möllerafb246b2022-04-20 12:26:50743 audio_rtp_sender_->SetTrack(track.get());
Taylor Brandstetterba29c6a2016-06-27 23:30:35744 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 19:26:01745
Taylor Brandstetterba29c6a2016-06-27 23:30:35746 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 19:26:01747}
748
Taylor Brandstetterba29c6a2016-06-27 23:30:35749// 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 19:26:01751TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
Steve Anton02ee47c2018-01-11 00:26:06752 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 19:26:01753 rtc::scoped_refptr<AudioTrackInterface> track =
754 AudioTrack::Create(kAudioTrackId, nullptr);
Niels Möllerafb246b2022-04-20 12:26:50755 audio_rtp_sender_->SetTrack(track.get());
Taylor Brandstetterba29c6a2016-06-27 23:30:35756 audio_rtp_sender_->SetSsrc(kAudioSsrc);
757 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 19:26:01758
Taylor Brandstetterba29c6a2016-06-27 23:30:35759 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 19:26:01760}
761
Taylor Brandstetterba29c6a2016-06-27 23:30:35762// 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 19:26:01764TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
nisseaf510af2016-03-21 15:20:42765 AddVideoTrack();
Steve Anton02ee47c2018-01-11 00:26:06766 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 23:30:35767 video_rtp_sender_->SetSsrc(kVideoSsrc);
Niels Möllerafb246b2022-04-20 12:26:50768 video_rtp_sender_->SetTrack(video_track_.get());
Taylor Brandstetterba29c6a2016-06-27 23:30:35769 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 19:26:01770
Taylor Brandstetterba29c6a2016-06-27 23:30:35771 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 19:26:01772}
773
Taylor Brandstetterba29c6a2016-06-27 23:30:35774// 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 19:26:01776TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
nisseaf510af2016-03-21 15:20:42777 AddVideoTrack();
Steve Anton02ee47c2018-01-11 00:26:06778 CreateVideoRtpSenderWithNoTrack();
Niels Möllerafb246b2022-04-20 12:26:50779 video_rtp_sender_->SetTrack(video_track_.get());
Taylor Brandstetterba29c6a2016-06-27 23:30:35780 video_rtp_sender_->SetSsrc(kVideoSsrc);
781 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 19:26:01782
Taylor Brandstetterba29c6a2016-06-27 23:30:35783 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 19:26:01784}
785
Taylor Brandstetterba29c6a2016-06-27 23:30:35786// Test that the media channel stops sending when the audio sender's SSRC is set
787// to 0.
deadbeeffac06552015-11-25 19:26:01788TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 23:30:35789 CreateAudioRtpSender();
deadbeeffac06552015-11-25 19:26:01790
Taylor Brandstetterba29c6a2016-06-27 23:30:35791 audio_rtp_sender_->SetSsrc(0);
792 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 19:26:01793}
794
Taylor Brandstetterba29c6a2016-06-27 23:30:35795// Test that the media channel stops sending when the video sender's SSRC is set
796// to 0.
deadbeeffac06552015-11-25 19:26:01797TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 23:30:35798 CreateAudioRtpSender();
deadbeeffac06552015-11-25 19:26:01799
Taylor Brandstetterba29c6a2016-06-27 23:30:35800 audio_rtp_sender_->SetSsrc(0);
801 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 19:26:01802}
803
Taylor Brandstetterba29c6a2016-06-27 23:30:35804// Test that the media channel stops sending when the audio sender's track is
805// set to null.
deadbeeffac06552015-11-25 19:26:01806TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 23:30:35807 CreateAudioRtpSender();
deadbeeffac06552015-11-25 19:26:01808
Taylor Brandstetterba29c6a2016-06-27 23:30:35809 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
810 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 19:26:01811}
812
Taylor Brandstetterba29c6a2016-06-27 23:30:35813// Test that the media channel stops sending when the video sender's track is
814// set to null.
deadbeeffac06552015-11-25 19:26:01815TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 23:30:35816 CreateVideoRtpSender();
deadbeeffac06552015-11-25 19:26:01817
Taylor Brandstetterba29c6a2016-06-27 23:30:35818 video_rtp_sender_->SetSsrc(0);
819 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 19:26:01820}
821
Taylor Brandstetterba29c6a2016-06-27 23:30:35822// 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 19:26:01824TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 23:30:35825 CreateAudioRtpSender();
deadbeeffac06552015-11-25 19:26:01826
Taylor Brandstetterba29c6a2016-06-27 23:30:35827 audio_rtp_sender_->SetSsrc(kAudioSsrc2);
828 VerifyVoiceChannelNoInput(kAudioSsrc);
829 VerifyVoiceChannelInput(kAudioSsrc2);
deadbeeffac06552015-11-25 19:26:01830
Taylor Brandstetterba29c6a2016-06-27 23:30:35831 audio_rtp_sender_ = nullptr;
832 VerifyVoiceChannelNoInput(kAudioSsrc2);
deadbeeffac06552015-11-25 19:26:01833}
834
Taylor Brandstetterba29c6a2016-06-27 23:30:35835// 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 19:26:01837TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 23:30:35838 CreateVideoRtpSender();
deadbeeffac06552015-11-25 19:26:01839
Taylor Brandstetterba29c6a2016-06-27 23:30:35840 video_rtp_sender_->SetSsrc(kVideoSsrc2);
841 VerifyVideoChannelNoInput(kVideoSsrc);
842 VerifyVideoChannelInput(kVideoSsrc2);
deadbeeffac06552015-11-25 19:26:01843
Taylor Brandstetterba29c6a2016-06-27 23:30:35844 video_rtp_sender_ = nullptr;
845 VerifyVideoChannelNoInput(kVideoSsrc2);
deadbeeffac06552015-11-25 19:26:01846}
847
skvladdc1c62c2016-03-17 02:07:43848TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) {
849 CreateAudioRtpSender();
850
skvladdc1c62c2016-03-17 02:07:43851 RtpParameters params = audio_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 23:30:35852 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 23:02:36853 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-17 02:07:43854
855 DestroyAudioRtpSender();
856}
857
Florent Castelli892acf02018-10-01 20:47:20858TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParametersBeforeNegotiation) {
Amit Hilbuchea7ef2a2019-02-19 23:20:21859 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 17:31:53860 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
Florent Castelli892acf02018-10-01 20:47:20861
862 RtpParameters params = audio_rtp_sender_->GetParameters();
863 ASSERT_EQ(1u, params.encodings.size());
864 params.encodings[0].max_bitrate_bps = 90000;
865 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
866
867 params = audio_rtp_sender_->GetParameters();
868 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
869 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
870
871 DestroyAudioRtpSender();
872}
873
874TEST_F(RtpSenderReceiverTest, AudioSenderInitParametersMovedAfterNegotiation) {
875 audio_track_ = AudioTrack::Create(kAudioTrackId, nullptr);
Harald Alvestrand2f7ad282022-04-21 11:35:43876 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
Florent Castelli892acf02018-10-01 20:47:20877
Guido Urdaneta1ff16c82019-05-20 17:31:53878 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 15:06:18879 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 17:31:53880 audio_rtp_sender_ = AudioRtpSender::Create(
881 worker_thread_, audio_track_->id(), nullptr, set_streams_observer.get());
Niels Möllerafb246b2022-04-20 12:26:50882 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_.get()));
Guido Urdaneta1ff16c82019-05-20 17:31:53883 EXPECT_CALL(*set_streams_observer, OnSetStreams());
884 audio_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli892acf02018-10-01 20:47:20885
886 std::vector<RtpEncodingParameters> init_encodings(1);
887 init_encodings[0].max_bitrate_bps = 60000;
888 audio_rtp_sender_->set_init_send_encodings(init_encodings);
889
890 RtpParameters params = audio_rtp_sender_->GetParameters();
891 ASSERT_EQ(1u, params.encodings.size());
892 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
893
894 // Simulate the setLocalDescription call
895 std::vector<uint32_t> ssrcs(1, 1);
896 cricket::StreamParams stream_params =
897 cricket::CreateSimStreamParams("cname", ssrcs);
Harald Alvestrand485457f2022-05-23 08:46:57898 voice_media_channel()->AddSendStream(stream_params);
899 audio_rtp_sender_->SetMediaChannel(voice_media_channel());
Florent Castelli892acf02018-10-01 20:47:20900 audio_rtp_sender_->SetSsrc(1);
901
902 params = audio_rtp_sender_->GetParameters();
903 ASSERT_EQ(1u, params.encodings.size());
904 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
905
906 DestroyAudioRtpSender();
907}
908
909TEST_F(RtpSenderReceiverTest,
910 AudioSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
Amit Hilbuchea7ef2a2019-02-19 23:20:21911 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 17:31:53912 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
Florent Castelli892acf02018-10-01 20:47:20913
914 RtpParameters params;
915 RTCError result = audio_rtp_sender_->SetParameters(params);
916 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
917 DestroyAudioRtpSender();
918}
919
Florent Castellicebf50f2018-05-03 13:31:53920TEST_F(RtpSenderReceiverTest,
921 AudioSenderMustCallGetParametersBeforeSetParameters) {
922 CreateAudioRtpSender();
923
924 RtpParameters params;
925 RTCError result = audio_rtp_sender_->SetParameters(params);
926 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
927
928 DestroyAudioRtpSender();
929}
930
931TEST_F(RtpSenderReceiverTest,
932 AudioSenderSetParametersInvalidatesTransactionId) {
933 CreateAudioRtpSender();
934
935 RtpParameters params = audio_rtp_sender_->GetParameters();
936 EXPECT_EQ(1u, params.encodings.size());
937 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
938 RTCError result = audio_rtp_sender_->SetParameters(params);
939 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
940
941 DestroyAudioRtpSender();
942}
943
944TEST_F(RtpSenderReceiverTest, AudioSenderDetectTransactionIdModification) {
945 CreateAudioRtpSender();
946
947 RtpParameters params = audio_rtp_sender_->GetParameters();
948 params.transaction_id = "";
949 RTCError result = audio_rtp_sender_->SetParameters(params);
950 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
951
952 DestroyAudioRtpSender();
953}
954
955TEST_F(RtpSenderReceiverTest, AudioSenderCheckTransactionIdRefresh) {
956 CreateAudioRtpSender();
957
958 RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 10:53:23959 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 13:31:53960 auto saved_transaction_id = params.transaction_id;
961 params = audio_rtp_sender_->GetParameters();
962 EXPECT_NE(saved_transaction_id, params.transaction_id);
963
964 DestroyAudioRtpSender();
965}
966
967TEST_F(RtpSenderReceiverTest, AudioSenderSetParametersOldValueFail) {
968 CreateAudioRtpSender();
969
970 RtpParameters params = audio_rtp_sender_->GetParameters();
971 RtpParameters second_params = audio_rtp_sender_->GetParameters();
972
973 RTCError result = audio_rtp_sender_->SetParameters(params);
974 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
Seth Hampson2d2c8882018-05-16 23:02:32975 DestroyAudioRtpSender();
976}
977
978TEST_F(RtpSenderReceiverTest, AudioSenderCantSetUnimplementedRtpParameters) {
979 CreateAudioRtpSender();
980 RtpParameters params = audio_rtp_sender_->GetParameters();
981 EXPECT_EQ(1u, params.encodings.size());
982
Florent Castelli87b3c512018-07-18 14:00:28983 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 23:02:32984 params.mid = "dummy_mid";
985 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
986 audio_rtp_sender_->SetParameters(params).type());
987 params = audio_rtp_sender_->GetParameters();
988
Seth Hampson2d2c8882018-05-16 23:02:32989 DestroyAudioRtpSender();
990}
991
Taylor Brandstetterba29c6a2016-06-27 23:30:35992TEST_F(RtpSenderReceiverTest, SetAudioMaxSendBitrate) {
993 CreateAudioRtpSender();
994
Harald Alvestrand485457f2022-05-23 08:46:57995 EXPECT_EQ(-1, voice_media_channel()->max_bps());
Taylor Brandstetterba29c6a2016-06-27 23:30:35996 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 10:53:23997 EXPECT_EQ(1U, params.encodings.size());
deadbeefe702b302017-02-04 20:09:01998 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 09:54:27999 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 23:02:361000 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 23:30:351001
1002 // Read back the parameters and verify they have been changed.
1003 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 10:53:231004 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 09:54:271005 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 23:30:351006
1007 // Verify that the audio channel received the new parameters.
Harald Alvestrand485457f2022-05-23 08:46:571008 params = voice_media_channel()->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 10:53:231009 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 09:54:271010 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 23:30:351011
1012 // Verify that the global bitrate limit has not been changed.
Harald Alvestrand485457f2022-05-23 08:46:571013 EXPECT_EQ(-1, voice_media_channel()->max_bps());
Taylor Brandstetterba29c6a2016-06-27 23:30:351014
1015 DestroyAudioRtpSender();
1016}
1017
Seth Hampson24722b32017-12-22 17:36:421018TEST_F(RtpSenderReceiverTest, SetAudioBitratePriority) {
1019 CreateAudioRtpSender();
1020
1021 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 10:53:231022 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 17:36:421023 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1024 params.encodings[0].bitrate_priority);
1025 double new_bitrate_priority = 2.0;
1026 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 23:02:361027 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 17:36:421028
1029 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 10:53:231030 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 17:36:421031 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1032
Harald Alvestrand485457f2022-05-23 08:46:571033 params = voice_media_channel()->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 10:53:231034 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 17:36:421035 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1036
1037 DestroyAudioRtpSender();
1038}
1039
skvladdc1c62c2016-03-17 02:07:431040TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) {
1041 CreateVideoRtpSender();
1042
skvladdc1c62c2016-03-17 02:07:431043 RtpParameters params = video_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 23:30:351044 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 23:02:361045 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-17 02:07:431046
1047 DestroyVideoRtpSender();
1048}
1049
Florent Castelli892acf02018-10-01 20:47:201050TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParametersBeforeNegotiation) {
Guido Urdaneta1ff16c82019-05-20 17:31:531051 video_rtp_sender_ =
1052 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Florent Castelli892acf02018-10-01 20:47:201053
1054 RtpParameters params = video_rtp_sender_->GetParameters();
1055 ASSERT_EQ(1u, params.encodings.size());
1056 params.encodings[0].max_bitrate_bps = 90000;
1057 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1058
1059 params = video_rtp_sender_->GetParameters();
1060 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1061 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
1062
1063 DestroyVideoRtpSender();
1064}
1065
1066TEST_F(RtpSenderReceiverTest, VideoSenderInitParametersMovedAfterNegotiation) {
1067 AddVideoTrack(false);
1068
Guido Urdaneta1ff16c82019-05-20 17:31:531069 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 15:06:181070 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 17:31:531071 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1072 set_streams_observer.get());
Niels Möllerafb246b2022-04-20 12:26:501073 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
Guido Urdaneta1ff16c82019-05-20 17:31:531074 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1075 video_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli892acf02018-10-01 20:47:201076
1077 std::vector<RtpEncodingParameters> init_encodings(2);
1078 init_encodings[0].max_bitrate_bps = 60000;
1079 init_encodings[1].max_bitrate_bps = 900000;
1080 video_rtp_sender_->set_init_send_encodings(init_encodings);
1081
1082 RtpParameters params = video_rtp_sender_->GetParameters();
1083 ASSERT_EQ(2u, params.encodings.size());
1084 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1085 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
1086
1087 // Simulate the setLocalDescription call
1088 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 09:11:531089 ssrcs.reserve(2);
Florent Castelli892acf02018-10-01 20:47:201090 for (int i = 0; i < 2; ++i)
1091 ssrcs.push_back(kVideoSsrcSimulcast + i);
1092 cricket::StreamParams stream_params =
1093 cricket::CreateSimStreamParams("cname", ssrcs);
Harald Alvestrand485457f2022-05-23 08:46:571094 video_media_channel()->AddSendStream(stream_params);
1095 video_rtp_sender_->SetMediaChannel(video_media_channel());
Florent Castelli892acf02018-10-01 20:47:201096 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
1097
1098 params = video_rtp_sender_->GetParameters();
1099 ASSERT_EQ(2u, params.encodings.size());
1100 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1101 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
1102
1103 DestroyVideoRtpSender();
1104}
1105
1106TEST_F(RtpSenderReceiverTest,
1107 VideoSenderInitParametersMovedAfterManualSimulcastAndNegotiation) {
1108 AddVideoTrack(false);
1109
Guido Urdaneta1ff16c82019-05-20 17:31:531110 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 15:06:181111 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 17:31:531112 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1113 set_streams_observer.get());
Niels Möllerafb246b2022-04-20 12:26:501114 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
Guido Urdaneta1ff16c82019-05-20 17:31:531115 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1116 video_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli892acf02018-10-01 20:47:201117
1118 std::vector<RtpEncodingParameters> init_encodings(1);
1119 init_encodings[0].max_bitrate_bps = 60000;
1120 video_rtp_sender_->set_init_send_encodings(init_encodings);
1121
1122 RtpParameters params = video_rtp_sender_->GetParameters();
1123 ASSERT_EQ(1u, params.encodings.size());
1124 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1125
1126 // Simulate the setLocalDescription call as if the user used SDP munging
1127 // to enable simulcast
1128 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 09:11:531129 ssrcs.reserve(2);
Florent Castelli892acf02018-10-01 20:47:201130 for (int i = 0; i < 2; ++i)
1131 ssrcs.push_back(kVideoSsrcSimulcast + i);
1132 cricket::StreamParams stream_params =
1133 cricket::CreateSimStreamParams("cname", ssrcs);
Harald Alvestrand485457f2022-05-23 08:46:571134 video_media_channel()->AddSendStream(stream_params);
1135 video_rtp_sender_->SetMediaChannel(video_media_channel());
Florent Castelli892acf02018-10-01 20:47:201136 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
1137
1138 params = video_rtp_sender_->GetParameters();
1139 ASSERT_EQ(2u, params.encodings.size());
1140 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1141
1142 DestroyVideoRtpSender();
1143}
1144
Harald Alvestrand3fe8b0d2022-07-01 07:36:591145#if GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
1146using RtpSenderReceiverDeathTest = RtpSenderReceiverTest;
1147
1148TEST_F(RtpSenderReceiverDeathTest,
1149 VideoSenderManualRemoveSimulcastFailsDeathTest) {
1150 AddVideoTrack(false);
1151
1152 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
1153 std::make_unique<MockSetStreamsObserver>();
1154 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1155 set_streams_observer.get());
1156 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
1157 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1158 video_rtp_sender_->SetStreams({local_stream_->id()});
1159
1160 std::vector<RtpEncodingParameters> init_encodings(2);
1161 init_encodings[0].max_bitrate_bps = 60000;
1162 init_encodings[1].max_bitrate_bps = 120000;
1163 video_rtp_sender_->set_init_send_encodings(init_encodings);
1164
1165 RtpParameters params = video_rtp_sender_->GetParameters();
1166 ASSERT_EQ(2u, params.encodings.size());
1167 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1168
1169 // Simulate the setLocalDescription call as if the user used SDP munging
1170 // to disable simulcast.
1171 std::vector<uint32_t> ssrcs;
1172 ssrcs.reserve(2);
1173 for (int i = 0; i < 2; ++i)
1174 ssrcs.push_back(kVideoSsrcSimulcast + i);
1175 cricket::StreamParams stream_params =
1176 cricket::StreamParams::CreateLegacy(kVideoSsrc);
1177 video_media_channel()->AddSendStream(stream_params);
1178 video_rtp_sender_->SetMediaChannel(video_media_channel());
1179 EXPECT_DEATH(video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast), "");
1180}
1181#endif
1182
Florent Castelli892acf02018-10-01 20:47:201183TEST_F(RtpSenderReceiverTest,
1184 VideoSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
Guido Urdaneta1ff16c82019-05-20 17:31:531185 video_rtp_sender_ =
1186 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Florent Castelli892acf02018-10-01 20:47:201187
1188 RtpParameters params;
1189 RTCError result = video_rtp_sender_->SetParameters(params);
1190 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1191 DestroyVideoRtpSender();
1192}
1193
Florent Castellicebf50f2018-05-03 13:31:531194TEST_F(RtpSenderReceiverTest,
1195 VideoSenderMustCallGetParametersBeforeSetParameters) {
1196 CreateVideoRtpSender();
1197
1198 RtpParameters params;
1199 RTCError result = video_rtp_sender_->SetParameters(params);
1200 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1201
1202 DestroyVideoRtpSender();
1203}
1204
1205TEST_F(RtpSenderReceiverTest,
1206 VideoSenderSetParametersInvalidatesTransactionId) {
1207 CreateVideoRtpSender();
1208
1209 RtpParameters params = video_rtp_sender_->GetParameters();
1210 EXPECT_EQ(1u, params.encodings.size());
1211 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1212 RTCError result = video_rtp_sender_->SetParameters(params);
1213 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1214
1215 DestroyVideoRtpSender();
1216}
1217
1218TEST_F(RtpSenderReceiverTest, VideoSenderDetectTransactionIdModification) {
1219 CreateVideoRtpSender();
1220
1221 RtpParameters params = video_rtp_sender_->GetParameters();
1222 params.transaction_id = "";
1223 RTCError result = video_rtp_sender_->SetParameters(params);
1224 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1225
1226 DestroyVideoRtpSender();
1227}
1228
1229TEST_F(RtpSenderReceiverTest, VideoSenderCheckTransactionIdRefresh) {
1230 CreateVideoRtpSender();
1231
1232 RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 10:53:231233 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 13:31:531234 auto saved_transaction_id = params.transaction_id;
1235 params = video_rtp_sender_->GetParameters();
1236 EXPECT_NE(saved_transaction_id, params.transaction_id);
1237
1238 DestroyVideoRtpSender();
1239}
1240
1241TEST_F(RtpSenderReceiverTest, VideoSenderSetParametersOldValueFail) {
1242 CreateVideoRtpSender();
1243
1244 RtpParameters params = video_rtp_sender_->GetParameters();
1245 RtpParameters second_params = video_rtp_sender_->GetParameters();
1246
1247 RTCError result = video_rtp_sender_->SetParameters(params);
1248 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1249
1250 DestroyVideoRtpSender();
1251}
1252
Seth Hampson2d2c8882018-05-16 23:02:321253TEST_F(RtpSenderReceiverTest, VideoSenderCantSetUnimplementedRtpParameters) {
1254 CreateVideoRtpSender();
1255 RtpParameters params = video_rtp_sender_->GetParameters();
1256 EXPECT_EQ(1u, params.encodings.size());
1257
Florent Castelli87b3c512018-07-18 14:00:281258 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 23:02:321259 params.mid = "dummy_mid";
1260 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1261 video_rtp_sender_->SetParameters(params).type());
1262 params = video_rtp_sender_->GetParameters();
1263
Seth Hampson2d2c8882018-05-16 23:02:321264 DestroyVideoRtpSender();
1265}
1266
Florent Castellic1a0bcb2019-01-29 13:26:481267TEST_F(RtpSenderReceiverTest, VideoSenderCanSetScaleResolutionDownBy) {
1268 CreateVideoRtpSender();
1269
1270 RtpParameters params = video_rtp_sender_->GetParameters();
1271 params.encodings[0].scale_resolution_down_by = 2;
1272
1273 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1274 params = video_rtp_sender_->GetParameters();
1275 EXPECT_EQ(2, params.encodings[0].scale_resolution_down_by);
1276
1277 DestroyVideoRtpSender();
1278}
1279
1280TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidScaleResolutionDownBy) {
1281 CreateVideoRtpSender();
1282
1283 RtpParameters params = video_rtp_sender_->GetParameters();
1284 params.encodings[0].scale_resolution_down_by = 0.5;
1285 RTCError result = video_rtp_sender_->SetParameters(params);
1286 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1287
1288 DestroyVideoRtpSender();
1289}
1290
Ă…sa Perssonfb195962021-08-16 14:41:561291TEST_F(RtpSenderReceiverTest, VideoSenderCanSetNumTemporalLayers) {
1292 CreateVideoRtpSender();
1293
1294 RtpParameters params = video_rtp_sender_->GetParameters();
1295 params.encodings[0].num_temporal_layers = 2;
1296
1297 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1298 params = video_rtp_sender_->GetParameters();
1299 EXPECT_EQ(2, params.encodings[0].num_temporal_layers);
1300
1301 DestroyVideoRtpSender();
1302}
1303
1304TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidNumTemporalLayers) {
1305 CreateVideoRtpSender();
1306
1307 RtpParameters params = video_rtp_sender_->GetParameters();
1308 params.encodings[0].num_temporal_layers = webrtc::kMaxTemporalStreams + 1;
1309 RTCError result = video_rtp_sender_->SetParameters(params);
1310 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1311
1312 DestroyVideoRtpSender();
1313}
1314
Florent Castelli907dc802019-12-06 14:03:191315TEST_F(RtpSenderReceiverTest, VideoSenderCanSetMaxFramerate) {
1316 CreateVideoRtpSender();
1317
1318 RtpParameters params = video_rtp_sender_->GetParameters();
1319 params.encodings[0].max_framerate = 20;
1320
1321 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1322 params = video_rtp_sender_->GetParameters();
1323 EXPECT_EQ(20., params.encodings[0].max_framerate);
1324
1325 DestroyVideoRtpSender();
1326}
1327
1328TEST_F(RtpSenderReceiverTest, VideoSenderCanSetMaxFramerateZero) {
1329 CreateVideoRtpSender();
1330
1331 RtpParameters params = video_rtp_sender_->GetParameters();
1332 params.encodings[0].max_framerate = 0.;
1333
1334 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1335 params = video_rtp_sender_->GetParameters();
1336 EXPECT_EQ(0., params.encodings[0].max_framerate);
1337
1338 DestroyVideoRtpSender();
1339}
1340
1341TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidMaxFramerate) {
1342 CreateVideoRtpSender();
1343
1344 RtpParameters params = video_rtp_sender_->GetParameters();
1345 params.encodings[0].max_framerate = -5.;
1346 RTCError result = video_rtp_sender_->SetParameters(params);
1347 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1348
1349 DestroyVideoRtpSender();
1350}
1351
Seth Hampson2d2c8882018-05-16 23:02:321352// A video sender can have multiple simulcast layers, in which case it will
1353// contain multiple RtpEncodingParameters. This tests that if this is the case
1354// (simulcast), then we can't set the bitrate_priority, or max_bitrate_bps
1355// for any encodings besides at index 0, because these are both implemented
1356// "per-sender."
1357TEST_F(RtpSenderReceiverTest, VideoSenderCantSetPerSenderEncodingParameters) {
1358 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 20:47:201359 CreateVideoRtpSenderWithSimulcast();
Seth Hampson2d2c8882018-05-16 23:02:321360 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 20:47:201361 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Seth Hampson2d2c8882018-05-16 23:02:321362
1363 params.encodings[1].bitrate_priority = 2.0;
1364 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1365 video_rtp_sender_->SetParameters(params).type());
1366 params = video_rtp_sender_->GetParameters();
1367
Seth Hampson2d2c8882018-05-16 23:02:321368 DestroyVideoRtpSender();
1369}
1370
Florent Castelli892acf02018-10-01 20:47:201371TEST_F(RtpSenderReceiverTest, VideoSenderCantSetReadOnlyEncodingParameters) {
1372 // Add a simulcast specific send stream that contains 2 encoding parameters.
1373 CreateVideoRtpSenderWithSimulcast();
1374 RtpParameters params = video_rtp_sender_->GetParameters();
1375 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
1376
1377 for (size_t i = 0; i < params.encodings.size(); i++) {
1378 params.encodings[i].ssrc = 1337;
1379 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION,
1380 video_rtp_sender_->SetParameters(params).type());
1381 params = video_rtp_sender_->GetParameters();
1382 }
1383
1384 DestroyVideoRtpSender();
1385}
1386
Ă…sa Persson55659812018-06-18 15:51:321387TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrate) {
Taylor Brandstetterba29c6a2016-06-27 23:30:351388 CreateVideoRtpSender();
1389
Harald Alvestrand485457f2022-05-23 08:46:571390 EXPECT_EQ(-1, video_media_channel()->max_bps());
Taylor Brandstetterba29c6a2016-06-27 23:30:351391 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 10:53:231392 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 15:51:321393 EXPECT_FALSE(params.encodings[0].min_bitrate_bps);
deadbeefe702b302017-02-04 20:09:011394 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Ă…sa Persson55659812018-06-18 15:51:321395 params.encodings[0].min_bitrate_bps = 100;
Oskar Sundbom36f8f3e2017-11-16 09:54:271396 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 23:02:361397 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 23:30:351398
1399 // Read back the parameters and verify they have been changed.
1400 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 10:53:231401 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 15:51:321402 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 09:54:271403 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 23:30:351404
1405 // Verify that the video channel received the new parameters.
Harald Alvestrand485457f2022-05-23 08:46:571406 params = video_media_channel()->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 10:53:231407 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 15:51:321408 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 09:54:271409 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 23:30:351410
1411 // Verify that the global bitrate limit has not been changed.
Harald Alvestrand485457f2022-05-23 08:46:571412 EXPECT_EQ(-1, video_media_channel()->max_bps());
Taylor Brandstetterba29c6a2016-06-27 23:30:351413
1414 DestroyVideoRtpSender();
1415}
1416
Ă…sa Persson55659812018-06-18 15:51:321417TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrateSimulcast) {
1418 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 20:47:201419 CreateVideoRtpSenderWithSimulcast();
Ă…sa Persson55659812018-06-18 15:51:321420
1421 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 20:47:201422 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 15:51:321423 params.encodings[0].min_bitrate_bps = 100;
1424 params.encodings[0].max_bitrate_bps = 1000;
1425 params.encodings[1].min_bitrate_bps = 200;
1426 params.encodings[1].max_bitrate_bps = 2000;
1427 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1428
1429 // Verify that the video channel received the new parameters.
Harald Alvestrand485457f2022-05-23 08:46:571430 params = video_media_channel()->GetRtpSendParameters(kVideoSsrcSimulcast);
Florent Castelli892acf02018-10-01 20:47:201431 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 15:51:321432 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
1433 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
1434 EXPECT_EQ(200, params.encodings[1].min_bitrate_bps);
1435 EXPECT_EQ(2000, params.encodings[1].max_bitrate_bps);
1436
1437 DestroyVideoRtpSender();
1438}
1439
Seth Hampson24722b32017-12-22 17:36:421440TEST_F(RtpSenderReceiverTest, SetVideoBitratePriority) {
1441 CreateVideoRtpSender();
1442
1443 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 10:53:231444 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 17:36:421445 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1446 params.encodings[0].bitrate_priority);
1447 double new_bitrate_priority = 2.0;
1448 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 23:02:361449 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 17:36:421450
1451 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 10:53:231452 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 17:36:421453 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1454
Harald Alvestrand485457f2022-05-23 08:46:571455 params = video_media_channel()->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 10:53:231456 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 17:36:421457 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1458
1459 DestroyVideoRtpSender();
1460}
1461
Florent Castelli38332cd2018-11-20 13:08:061462TEST_F(RtpSenderReceiverTest, VideoReceiverCanGetParametersWithSimulcast) {
1463 CreateVideoRtpReceiverWithSimulcast({}, 2);
1464
1465 RtpParameters params = video_rtp_receiver_->GetParameters();
1466 EXPECT_EQ(2u, params.encodings.size());
1467
1468 DestroyVideoRtpReceiver();
1469}
1470
pbos5214a0a2016-12-16 23:39:111471// Test that makes sure that a video track content hint translates to the proper
1472// value for sources that are not screencast.
1473TEST_F(RtpSenderReceiverTest, PropagatesVideoTrackContentHint) {
1474 CreateVideoRtpSender();
1475
1476 video_track_->set_enabled(true);
1477
Artem Titov880fa812021-07-30 20:30:231478 // `video_track_` is not screencast by default.
Harald Alvestrand485457f2022-05-23 08:46:571479 EXPECT_EQ(false, video_media_channel()->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111480 // No content hint should be set by default.
1481 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1482 video_track_->content_hint());
1483 // Setting detailed should turn a non-screencast source into screencast mode.
1484 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Harald Alvestrand485457f2022-05-23 08:46:571485 EXPECT_EQ(true, video_media_channel()->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111486 // Removing the content hint should turn the track back into non-screencast
1487 // mode.
1488 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Harald Alvestrand485457f2022-05-23 08:46:571489 EXPECT_EQ(false, video_media_channel()->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111490 // Setting fluid should remain in non-screencast mode (its default).
1491 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Harald Alvestrand485457f2022-05-23 08:46:571492 EXPECT_EQ(false, video_media_channel()->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 06:53:101493 // Setting text should have the same effect as Detailed
1494 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
Harald Alvestrand485457f2022-05-23 08:46:571495 EXPECT_EQ(true, video_media_channel()->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111496
1497 DestroyVideoRtpSender();
1498}
1499
1500// Test that makes sure that a video track content hint translates to the proper
1501// value for screencast sources.
1502TEST_F(RtpSenderReceiverTest,
1503 PropagatesVideoTrackContentHintForScreencastSource) {
1504 CreateVideoRtpSender(true);
1505
1506 video_track_->set_enabled(true);
1507
Artem Titov880fa812021-07-30 20:30:231508 // `video_track_` with a screencast source should be screencast by default.
Harald Alvestrand485457f2022-05-23 08:46:571509 EXPECT_EQ(true, video_media_channel()->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111510 // No content hint should be set by default.
1511 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1512 video_track_->content_hint());
1513 // Setting fluid should turn a screencast source into non-screencast mode.
1514 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Harald Alvestrand485457f2022-05-23 08:46:571515 EXPECT_EQ(false, video_media_channel()->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111516 // Removing the content hint should turn the track back into screencast mode.
1517 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Harald Alvestrand485457f2022-05-23 08:46:571518 EXPECT_EQ(true, video_media_channel()->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111519 // Setting detailed should still remain in screencast mode (its default).
1520 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Harald Alvestrand485457f2022-05-23 08:46:571521 EXPECT_EQ(true, video_media_channel()->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 06:53:101522 // Setting text should have the same effect as Detailed
1523 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
Harald Alvestrand485457f2022-05-23 08:46:571524 EXPECT_EQ(true, video_media_channel()->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111525
1526 DestroyVideoRtpSender();
1527}
1528
1529// Test that makes sure any content hints that are set on a track before
1530// VideoRtpSender is ready to send are still applied when it gets ready to send.
1531TEST_F(RtpSenderReceiverTest,
1532 PropagatesVideoTrackContentHintSetBeforeEnabling) {
1533 AddVideoTrack();
Guido Urdaneta1ff16c82019-05-20 17:31:531534 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 15:06:181535 std::make_unique<MockSetStreamsObserver>();
pbos5214a0a2016-12-16 23:39:111536 // Setting detailed overrides the default non-screencast mode. This should be
1537 // applied even if the track is set on construction.
1538 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Guido Urdaneta1ff16c82019-05-20 17:31:531539 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1540 set_streams_observer.get());
Niels Möllerafb246b2022-04-20 12:26:501541 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
Guido Urdaneta1ff16c82019-05-20 17:31:531542 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1543 video_rtp_sender_->SetStreams({local_stream_->id()});
Harald Alvestrand485457f2022-05-23 08:46:571544 video_rtp_sender_->SetMediaChannel(video_media_channel());
pbos5214a0a2016-12-16 23:39:111545 video_track_->set_enabled(true);
1546
1547 // Sender is not ready to send (no SSRC) so no option should have been set.
Harald Alvestrand485457f2022-05-23 08:46:571548 EXPECT_EQ(absl::nullopt, video_media_channel()->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111549
1550 // Verify that the content hint is accounted for when video_rtp_sender_ does
1551 // get enabled.
1552 video_rtp_sender_->SetSsrc(kVideoSsrc);
Harald Alvestrand485457f2022-05-23 08:46:571553 EXPECT_EQ(true, video_media_channel()->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111554
1555 // And removing the hint should go back to false (to verify that false was
1556 // default correctly).
1557 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Harald Alvestrand485457f2022-05-23 08:46:571558 EXPECT_EQ(false, video_media_channel()->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111559
1560 DestroyVideoRtpSender();
1561}
1562
deadbeef20cb0c12017-02-02 04:27:001563TEST_F(RtpSenderReceiverTest, AudioSenderHasDtmfSender) {
1564 CreateAudioRtpSender();
1565 EXPECT_NE(nullptr, audio_rtp_sender_->GetDtmfSender());
1566}
1567
1568TEST_F(RtpSenderReceiverTest, VideoSenderDoesNotHaveDtmfSender) {
1569 CreateVideoRtpSender();
1570 EXPECT_EQ(nullptr, video_rtp_sender_->GetDtmfSender());
1571}
1572
Artem Titov880fa812021-07-30 20:30:231573// Test that the DTMF sender is really using `voice_channel_`, and thus returns
1574// true/false from CanSendDtmf based on what `voice_channel_` returns.
deadbeef20cb0c12017-02-02 04:27:001575TEST_F(RtpSenderReceiverTest, CanInsertDtmf) {
1576 AddDtmfCodec();
1577 CreateAudioRtpSender();
1578 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1579 ASSERT_NE(nullptr, dtmf_sender);
1580 EXPECT_TRUE(dtmf_sender->CanInsertDtmf());
1581}
1582
1583TEST_F(RtpSenderReceiverTest, CanNotInsertDtmf) {
1584 CreateAudioRtpSender();
1585 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1586 ASSERT_NE(nullptr, dtmf_sender);
1587 // DTMF codec has not been added, as it was in the above test.
1588 EXPECT_FALSE(dtmf_sender->CanInsertDtmf());
1589}
1590
1591TEST_F(RtpSenderReceiverTest, InsertDtmf) {
1592 AddDtmfCodec();
1593 CreateAudioRtpSender();
1594 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1595 ASSERT_NE(nullptr, dtmf_sender);
1596
Harald Alvestrand485457f2022-05-23 08:46:571597 EXPECT_EQ(0U, voice_media_channel()->dtmf_info_queue().size());
deadbeef20cb0c12017-02-02 04:27:001598
1599 // Insert DTMF
1600 const int expected_duration = 90;
1601 dtmf_sender->InsertDtmf("012", expected_duration, 100);
1602
1603 // Verify
Harald Alvestrand485457f2022-05-23 08:46:571604 ASSERT_EQ_WAIT(3U, voice_media_channel()->dtmf_info_queue().size(),
deadbeef20cb0c12017-02-02 04:27:001605 kDefaultTimeout);
1606 const uint32_t send_ssrc =
Harald Alvestrand485457f2022-05-23 08:46:571607 voice_media_channel()->send_streams()[0].first_ssrc();
1608 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel()->dtmf_info_queue()[0],
deadbeef20cb0c12017-02-02 04:27:001609 send_ssrc, 0, expected_duration));
Harald Alvestrand485457f2022-05-23 08:46:571610 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel()->dtmf_info_queue()[1],
deadbeef20cb0c12017-02-02 04:27:001611 send_ssrc, 1, expected_duration));
Harald Alvestrand485457f2022-05-23 08:46:571612 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel()->dtmf_info_queue()[2],
deadbeef20cb0c12017-02-02 04:27:001613 send_ssrc, 2, expected_duration));
1614}
1615
Benjamin Wright84583f62018-10-04 21:22:341616// Validate that the default FrameEncryptor setting is nullptr.
1617TEST_F(RtpSenderReceiverTest, AudioSenderCanSetFrameEncryptor) {
1618 CreateAudioRtpSender();
1619 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1620 new FakeFrameEncryptor());
1621 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1622 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1623 EXPECT_EQ(fake_frame_encryptor.get(),
1624 audio_rtp_sender_->GetFrameEncryptor().get());
1625}
1626
Benjamin Wrightc462a6e2018-10-26 20:16:161627// Validate that setting a FrameEncryptor after the send stream is stopped does
1628// nothing.
1629TEST_F(RtpSenderReceiverTest, AudioSenderCannotSetFrameEncryptorAfterStop) {
1630 CreateAudioRtpSender();
1631 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1632 new FakeFrameEncryptor());
1633 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1634 audio_rtp_sender_->Stop();
1635 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1636 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1637}
1638
Benjamin Wright84583f62018-10-04 21:22:341639// Validate that the default FrameEncryptor setting is nullptr.
1640TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetFrameDecryptor) {
1641 CreateAudioRtpReceiver();
1642 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
Tomas Gunnarssonb3517fe2022-03-18 18:32:381643 rtc::make_ref_counted<FakeFrameDecryptor>());
Benjamin Wright84583f62018-10-04 21:22:341644 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
1645 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1646 EXPECT_EQ(fake_frame_decryptor.get(),
1647 audio_rtp_receiver_->GetFrameDecryptor().get());
Tommi4ccdf9322021-05-17 12:50:101648 DestroyAudioRtpReceiver();
Benjamin Wright84583f62018-10-04 21:22:341649}
1650
Benjamin Wrightc462a6e2018-10-26 20:16:161651// Validate that the default FrameEncryptor setting is nullptr.
1652TEST_F(RtpSenderReceiverTest, AudioReceiverCannotSetFrameDecryptorAfterStop) {
1653 CreateAudioRtpReceiver();
1654 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
Tomas Gunnarssonb3517fe2022-03-18 18:32:381655 rtc::make_ref_counted<FakeFrameDecryptor>());
Benjamin Wrightc462a6e2018-10-26 20:16:161656 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
Tommi6589def2022-02-17 22:36:471657 audio_rtp_receiver_->SetMediaChannel(nullptr);
Benjamin Wrightc462a6e2018-10-26 20:16:161658 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1659 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
Tommi4ccdf9322021-05-17 12:50:101660 DestroyAudioRtpReceiver();
Benjamin Wrightc462a6e2018-10-26 20:16:161661}
1662
1663// Validate that the default FrameEncryptor setting is nullptr.
1664TEST_F(RtpSenderReceiverTest, VideoSenderCanSetFrameEncryptor) {
1665 CreateVideoRtpSender();
1666 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1667 new FakeFrameEncryptor());
1668 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1669 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1670 EXPECT_EQ(fake_frame_encryptor.get(),
1671 video_rtp_sender_->GetFrameEncryptor().get());
1672}
1673
1674// Validate that setting a FrameEncryptor after the send stream is stopped does
1675// nothing.
1676TEST_F(RtpSenderReceiverTest, VideoSenderCannotSetFrameEncryptorAfterStop) {
1677 CreateVideoRtpSender();
1678 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1679 new FakeFrameEncryptor());
1680 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1681 video_rtp_sender_->Stop();
1682 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1683 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1684}
1685
1686// Validate that the default FrameEncryptor setting is nullptr.
1687TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetFrameDecryptor) {
1688 CreateVideoRtpReceiver();
1689 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
Tomas Gunnarssonb3517fe2022-03-18 18:32:381690 rtc::make_ref_counted<FakeFrameDecryptor>());
Benjamin Wrightc462a6e2018-10-26 20:16:161691 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
1692 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1693 EXPECT_EQ(fake_frame_decryptor.get(),
1694 video_rtp_receiver_->GetFrameDecryptor().get());
Tommi4ccdf9322021-05-17 12:50:101695 DestroyVideoRtpReceiver();
Benjamin Wrightc462a6e2018-10-26 20:16:161696}
1697
1698// Validate that the default FrameEncryptor setting is nullptr.
1699TEST_F(RtpSenderReceiverTest, VideoReceiverCannotSetFrameDecryptorAfterStop) {
1700 CreateVideoRtpReceiver();
1701 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
Tomas Gunnarssonb3517fe2022-03-18 18:32:381702 rtc::make_ref_counted<FakeFrameDecryptor>());
Benjamin Wrightc462a6e2018-10-26 20:16:161703 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
Tommi6589def2022-02-17 22:36:471704 video_rtp_receiver_->SetMediaChannel(nullptr);
Benjamin Wrightc462a6e2018-10-26 20:16:161705 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1706 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
Tommi4ccdf9322021-05-17 12:50:101707 DestroyVideoRtpReceiver();
Benjamin Wrightc462a6e2018-10-26 20:16:161708}
1709
Amit Hilbuch619b2942019-02-26 23:55:191710// Checks that calling the internal methods for get/set parameters do not
1711// invalidate any parameters retreived by clients.
1712TEST_F(RtpSenderReceiverTest,
1713 InternalParameterMethodsDoNotInvalidateTransaction) {
1714 CreateVideoRtpSender();
1715 RtpParameters parameters = video_rtp_sender_->GetParameters();
1716 RtpParameters new_parameters = video_rtp_sender_->GetParametersInternal();
1717 new_parameters.encodings[0].active = false;
1718 video_rtp_sender_->SetParametersInternal(new_parameters);
1719 new_parameters.encodings[0].active = true;
1720 video_rtp_sender_->SetParametersInternal(new_parameters);
1721 parameters.encodings[0].active = false;
1722 EXPECT_TRUE(video_rtp_sender_->SetParameters(parameters).ok());
1723}
1724
Amit Hilbuch2297d332019-02-19 20:49:221725// Helper method for syntactic sugar for accepting a vector with '{}' notation.
1726std::pair<RidList, RidList> CreatePairOfRidVectors(
1727 const std::vector<std::string>& first,
1728 const std::vector<std::string>& second) {
1729 return std::make_pair(first, second);
1730}
1731
1732// These parameters are used to test disabling simulcast layers.
1733const std::pair<RidList, RidList> kDisableSimulcastLayersParameters[] = {
1734 // Tests removing the first layer. This is a special case because
1735 // the first layer's SSRC is also the 'primary' SSRC used to associate the
1736 // parameters to the media channel.
1737 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"1"}),
1738 // Tests removing some layers.
1739 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"2", "4"}),
1740 // Tests simulcast rejected scenario all layers except first are rejected.
1741 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"2", "3", "4"}),
1742 // Tests removing all layers.
1743 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"1", "2", "3", "4"}),
1744};
1745
1746// Runs test for disabling layers on a sender without a media engine set.
1747TEST_P(RtpSenderReceiverTest, DisableSimulcastLayersWithoutMediaEngine) {
1748 auto parameter = GetParam();
1749 RunDisableSimulcastLayersWithoutMediaEngineTest(parameter.first,
1750 parameter.second);
1751}
1752
1753// Runs test for disabling layers on a sender with a media engine set.
1754TEST_P(RtpSenderReceiverTest, DisableSimulcastLayersWithMediaEngine) {
1755 auto parameter = GetParam();
1756 RunDisableSimulcastLayersWithMediaEngineTest(parameter.first,
1757 parameter.second);
1758}
1759
1760INSTANTIATE_TEST_SUITE_P(
1761 DisableSimulcastLayersInSender,
1762 RtpSenderReceiverTest,
1763 ::testing::ValuesIn(kDisableSimulcastLayersParameters));
1764
deadbeef70ab1a12015-09-28 23:53:551765} // namespace webrtc