blob: 4387aedf533cb7ed061143d5c3bad571039b6bc8 [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"
Steve Anton10542f22019-01-11 17:11:0040#include "media/base/fake_media_engine.h"
41#include "media/base/media_channel.h"
42#include "media/base/media_config.h"
43#include "media/base/media_engine.h"
Harald Alvestrandc24a2182022-02-23 13:44:5944#include "media/base/rid_description.h"
Steve Anton10542f22019-01-11 17:11:0045#include "media/base/stream_params.h"
46#include "media/base/test_utils.h"
47#include "media/engine/fake_webrtc_call.h"
48#include "p2p/base/dtls_transport_internal.h"
49#include "p2p/base/fake_dtls_transport.h"
50#include "p2p/base/p2p_constants.h"
Ruslan Burakov501bfba2019-02-11 09:29:1951#include "pc/audio_rtp_receiver.h"
Steve Anton10542f22019-01-11 17:11:0052#include "pc/audio_track.h"
Yves Gerey3e707812018-11-28 15:47:4953#include "pc/channel.h"
Steve Anton10542f22019-01-11 17:11:0054#include "pc/dtls_srtp_transport.h"
55#include "pc/local_audio_source.h"
56#include "pc/media_stream.h"
Steve Anton10542f22019-01-11 17:11:0057#include "pc/rtp_sender.h"
58#include "pc/rtp_transport_internal.h"
59#include "pc/test/fake_video_track_source.h"
Ruslan Burakov501bfba2019-02-11 09:29:1960#include "pc/video_rtp_receiver.h"
Steve Anton10542f22019-01-11 17:11:0061#include "pc/video_track.h"
Yves Gerey3e707812018-11-28 15:47:4962#include "rtc_base/checks.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3163#include "rtc_base/gunit.h"
Yves Gerey3e707812018-11-28 15:47:4964#include "rtc_base/thread.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3165#include "test/gmock.h"
66#include "test/gtest.h"
Tommi4ccdf9322021-05-17 12:50:1067#include "test/run_loop.h"
Jonas Orelanded99dae2022-03-09 08:28:1068#include "test/scoped_key_value_config.h"
deadbeef70ab1a12015-09-28 23:53:5569
70using ::testing::_;
Amit Hilbuch2297d332019-02-19 20:49:2271using ::testing::ContainerEq;
deadbeef70ab1a12015-09-28 23:53:5572using ::testing::Exactly;
deadbeef5dd42fd2016-05-02 23:20:0173using ::testing::InvokeWithoutArgs;
skvladdc1c62c2016-03-17 02:07:4374using ::testing::Return;
Amit Hilbuch2297d332019-02-19 20:49:2275using RidList = std::vector<std::string>;
deadbeef70ab1a12015-09-28 23:53:5576
deadbeef20cb0c12017-02-02 04:27:0077namespace {
78
Seth Hampson845e8782018-03-02 19:34:1079static const char kStreamId1[] = "local_stream_1";
deadbeef70ab1a12015-09-28 23:53:5580static const char kVideoTrackId[] = "video_1";
81static const char kAudioTrackId[] = "audio_1";
Peter Boström0c4e06b2015-10-07 10:23:2182static const uint32_t kVideoSsrc = 98;
deadbeeffac06552015-11-25 19:26:0183static const uint32_t kVideoSsrc2 = 100;
Peter Boström0c4e06b2015-10-07 10:23:2184static const uint32_t kAudioSsrc = 99;
deadbeeffac06552015-11-25 19:26:0185static const uint32_t kAudioSsrc2 = 101;
Florent Castelli892acf02018-10-01 20:47:2086static const uint32_t kVideoSsrcSimulcast = 102;
87static const uint32_t kVideoSimulcastLayerCount = 2;
deadbeef20cb0c12017-02-02 04:27:0088static const int kDefaultTimeout = 10000; // 10 seconds.
Guido Urdaneta1ff16c82019-05-20 17:31:5389
90class MockSetStreamsObserver
91 : public webrtc::RtpSenderBase::SetStreamsObserver {
92 public:
Danil Chapovalov3a353122020-05-15 09:16:5393 MOCK_METHOD(void, OnSetStreams, (), (override));
Guido Urdaneta1ff16c82019-05-20 17:31:5394};
95
deadbeef20cb0c12017-02-02 04:27:0096} // namespace
deadbeef70ab1a12015-09-28 23:53:5597
98namespace webrtc {
99
Amit Hilbuch2297d332019-02-19 20:49:22100class RtpSenderReceiverTest
Mirko Bonadei6a489f22019-04-09 13:11:12101 : public ::testing::Test,
Fredrik Solenbergda2afbd2022-08-03 10:07:51102 public ::testing::WithParamInterface<std::pair<RidList, RidList>> {
tkchin3784b4a2016-06-25 02:31:47103 public:
Taylor Brandstetterba29c6a2016-06-27 23:30:35104 RtpSenderReceiverTest()
Steve Anton47136dd2018-01-12 18:49:35105 : network_thread_(rtc::Thread::Current()),
106 worker_thread_(rtc::Thread::Current()),
Jonas Orelanda3aa9bd2019-04-17 05:38:40107 video_bitrate_allocator_factory_(
Harald Alvestranda6544372023-11-13 09:33:56108 CreateBuiltinVideoBitrateAllocatorFactory()),
Steve Anton47136dd2018-01-12 18:49:35109 // Create fake media engine/etc. so we can create channels to use to
110 // test RtpSenders/RtpReceivers.
Harald Alvestrand0ac50b92022-05-18 07:51:34111 media_engine_(std::make_unique<cricket::FakeMediaEngine>()),
Tomas Gunnarssone984aa22021-04-19 07:21:06112 fake_call_(worker_thread_, network_thread_),
Seth Hampson845e8782018-03-02 19:34:10113 local_stream_(MediaStream::Create(kStreamId1)) {
Mirko Bonadei317a1f02019-09-17 15:06:18114 rtp_dtls_transport_ = std::make_unique<cricket::FakeDtlsTransport>(
Zhi Huange830e682018-03-30 17:48:35115 "fake_dtls_transport", cricket::ICE_CANDIDATE_COMPONENT_RTP);
116 rtp_transport_ = CreateDtlsSrtpTransport();
117
Harald Alvestrand485457f2022-05-23 08:46:57118 // Create the channels, discard the result; we get them later.
119 // Fake media channels are owned by the media engine.
Florent Castelli1f31c202023-06-26 00:26:07120 voice_media_send_channel_ = media_engine_->voice().CreateSendChannel(
121 &fake_call_, cricket::MediaConfig(), cricket::AudioOptions(),
Harald Alvestranda6544372023-11-13 09:33:56122 CryptoOptions(), AudioCodecPairId::Create());
Florent Castelli1f31c202023-06-26 00:26:07123 video_media_send_channel_ = media_engine_->video().CreateSendChannel(
124 &fake_call_, cricket::MediaConfig(), cricket::VideoOptions(),
Harald Alvestranda6544372023-11-13 09:33:56125 CryptoOptions(), video_bitrate_allocator_factory_.get());
Florent Castelli1f31c202023-06-26 00:26:07126 voice_media_receive_channel_ = media_engine_->voice().CreateReceiveChannel(
127 &fake_call_, cricket::MediaConfig(), cricket::AudioOptions(),
Harald Alvestranda6544372023-11-13 09:33:56128 CryptoOptions(), AudioCodecPairId::Create());
Florent Castelli1f31c202023-06-26 00:26:07129 video_media_receive_channel_ = media_engine_->video().CreateReceiveChannel(
130 &fake_call_, cricket::MediaConfig(), cricket::VideoOptions(),
Harald Alvestranda6544372023-11-13 09:33:56131 CryptoOptions());
Taylor Brandstetterba29c6a2016-06-27 23:30:35132
133 // Create streams for predefined SSRCs. Streams need to exist in order
134 // for the senders and receievers to apply parameters to them.
135 // Normally these would be created by SetLocalDescription and
136 // SetRemoteDescription.
Harald Alvestrand2f553702023-03-07 10:10:03137 voice_media_send_channel_->AddSendStream(
Taylor Brandstetterba29c6a2016-06-27 23:30:35138 cricket::StreamParams::CreateLegacy(kAudioSsrc));
Harald Alvestrand2f553702023-03-07 10:10:03139 voice_media_receive_channel_->AddRecvStream(
Taylor Brandstetterba29c6a2016-06-27 23:30:35140 cricket::StreamParams::CreateLegacy(kAudioSsrc));
Harald Alvestrand2f553702023-03-07 10:10:03141 voice_media_send_channel_->AddSendStream(
Taylor Brandstetterba29c6a2016-06-27 23:30:35142 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
Harald Alvestrand2f553702023-03-07 10:10:03143 voice_media_receive_channel_->AddRecvStream(
Taylor Brandstetterba29c6a2016-06-27 23:30:35144 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
Harald Alvestrand2f553702023-03-07 10:10:03145 video_media_send_channel_->AddSendStream(
Taylor Brandstetterba29c6a2016-06-27 23:30:35146 cricket::StreamParams::CreateLegacy(kVideoSsrc));
Harald Alvestrand2f553702023-03-07 10:10:03147 video_media_receive_channel_->AddRecvStream(
Taylor Brandstetterba29c6a2016-06-27 23:30:35148 cricket::StreamParams::CreateLegacy(kVideoSsrc));
Harald Alvestrand2f553702023-03-07 10:10:03149 video_media_send_channel_->AddSendStream(
Taylor Brandstetterba29c6a2016-06-27 23:30:35150 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
Harald Alvestrand2f553702023-03-07 10:10:03151 video_media_receive_channel_->AddRecvStream(
Taylor Brandstetterba29c6a2016-06-27 23:30:35152 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
tkchin3784b4a2016-06-25 02:31:47153 }
Taylor Brandstetter2d549172016-06-24 21:18:22154
Tomas Gunnarsson0b5ec182021-04-01 14:49:42155 ~RtpSenderReceiverTest() {
156 audio_rtp_sender_ = nullptr;
157 video_rtp_sender_ = nullptr;
158 audio_rtp_receiver_ = nullptr;
159 video_rtp_receiver_ = nullptr;
160 local_stream_ = nullptr;
161 video_track_ = nullptr;
162 audio_track_ = nullptr;
Tomas Gunnarsson0b5ec182021-04-01 14:49:42163 }
164
Harald Alvestranda6544372023-11-13 09:33:56165 std::unique_ptr<RtpTransportInternal> CreateDtlsSrtpTransport() {
166 auto dtls_srtp_transport = std::make_unique<DtlsSrtpTransport>(
Jonas Orelanded99dae2022-03-09 08:28:10167 /*rtcp_mux_required=*/true, field_trials_);
Zhi Huange830e682018-03-30 17:48:35168 dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport_.get(),
169 /*rtcp_dtls_transport=*/nullptr);
170 return dtls_srtp_transport;
171 }
172
deadbeef20cb0c12017-02-02 04:27:00173 // Needed to use DTMF sender.
174 void AddDtmfCodec() {
Philipp Hanckea9d51412023-07-31 11:27:37175 cricket::AudioSenderParameter params;
Florent Castelli8c4b9ea2023-06-02 16:06:57176 const cricket::AudioCodec kTelephoneEventCodec =
177 cricket::CreateAudioCodec(106, "telephone-event", 8000, 1);
deadbeef20cb0c12017-02-02 04:27:00178 params.codecs.push_back(kTelephoneEventCodec);
Philipp Hancke5866e1a2023-08-25 13:28:47179 voice_media_send_channel()->SetSenderParameters(params);
deadbeef20cb0c12017-02-02 04:27:00180 }
Taylor Brandstetterba29c6a2016-06-27 23:30:35181
pbos5214a0a2016-12-16 23:39:11182 void AddVideoTrack() { AddVideoTrack(false); }
183
184 void AddVideoTrack(bool is_screencast) {
perkja3ede6c2016-03-08 00:27:48185 rtc::scoped_refptr<VideoTrackSourceInterface> source(
pbos5214a0a2016-12-16 23:39:11186 FakeVideoTrackSource::Create(is_screencast));
perkj773be362017-08-01 06:22:01187 video_track_ =
188 VideoTrack::Create(kVideoTrackId, source, rtc::Thread::Current());
Harald Alvestrand2f7ad282022-04-21 11:35:43189 EXPECT_TRUE(local_stream_->AddTrack(video_track_));
deadbeef70ab1a12015-09-28 23:53:55190 }
191
Taylor Brandstetterba29c6a2016-06-27 23:30:35192 void CreateAudioRtpSender() { CreateAudioRtpSender(nullptr); }
193
Mirko Bonadeic61ce0d2017-11-21 16:04:20194 void CreateAudioRtpSender(
195 const rtc::scoped_refptr<LocalAudioSource>& source) {
Taylor Brandstetterba29c6a2016-06-27 23:30:35196 audio_track_ = AudioTrack::Create(kAudioTrackId, source);
Harald Alvestrand2f7ad282022-04-21 11:35:43197 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
Guido Urdaneta1ff16c82019-05-20 17:31:53198 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 15:06:18199 std::make_unique<MockSetStreamsObserver>();
Steve Anton47136dd2018-01-12 18:49:35200 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 17:31:53201 AudioRtpSender::Create(worker_thread_, audio_track_->id(), nullptr,
202 set_streams_observer.get());
Niels Möllerafb246b2022-04-20 12:26:50203 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_.get()));
Guido Urdaneta1ff16c82019-05-20 17:31:53204 EXPECT_CALL(*set_streams_observer, OnSetStreams());
205 audio_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli1f31c202023-06-26 00:26:07206 audio_rtp_sender_->SetMediaChannel(voice_media_send_channel_.get());
deadbeeffac06552015-11-25 19:26:01207 audio_rtp_sender_->SetSsrc(kAudioSsrc);
Taylor Brandstetterba29c6a2016-06-27 23:30:35208 VerifyVoiceChannelInput();
deadbeef70ab1a12015-09-28 23:53:55209 }
210
Steve Anton02ee47c2018-01-11 00:26:06211 void CreateAudioRtpSenderWithNoTrack() {
Amit Hilbuchea7ef2a2019-02-19 23:20:21212 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 17:31:53213 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
Florent Castelli1f31c202023-06-26 00:26:07214 audio_rtp_sender_->SetMediaChannel(voice_media_send_channel_.get());
Steve Anton02ee47c2018-01-11 00:26:06215 }
216
Seth Hampson2d2c8882018-05-16 23:02:32217 void CreateVideoRtpSender(uint32_t ssrc) {
218 CreateVideoRtpSender(false, ssrc);
219 }
220
pbos5214a0a2016-12-16 23:39:11221 void CreateVideoRtpSender() { CreateVideoRtpSender(false); }
222
Amit Hilbuch2297d332019-02-19 20:49:22223 cricket::StreamParams CreateSimulcastStreamParams(int num_layers) {
Florent Castelli892acf02018-10-01 20:47:20224 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 09:11:53225 ssrcs.reserve(num_layers);
Amit Hilbuch2297d332019-02-19 20:49:22226 for (int i = 0; i < num_layers; ++i) {
Florent Castelli892acf02018-10-01 20:47:20227 ssrcs.push_back(kVideoSsrcSimulcast + i);
Amit Hilbuch2297d332019-02-19 20:49:22228 }
229 return cricket::CreateSimStreamParams("cname", ssrcs);
230 }
231
232 uint32_t CreateVideoRtpSender(const cricket::StreamParams& stream_params) {
Harald Alvestrand2f553702023-03-07 10:10:03233 video_media_send_channel_->AddSendStream(stream_params);
Florent Castelli892acf02018-10-01 20:47:20234 uint32_t primary_ssrc = stream_params.first_ssrc();
235 CreateVideoRtpSender(primary_ssrc);
Amit Hilbuch2297d332019-02-19 20:49:22236 return primary_ssrc;
237 }
238
239 uint32_t CreateVideoRtpSenderWithSimulcast(
240 int num_layers = kVideoSimulcastLayerCount) {
241 return CreateVideoRtpSender(CreateSimulcastStreamParams(num_layers));
242 }
243
244 uint32_t CreateVideoRtpSenderWithSimulcast(
245 const std::vector<std::string>& rids) {
246 cricket::StreamParams stream_params =
247 CreateSimulcastStreamParams(rids.size());
248 std::vector<cricket::RidDescription> rid_descriptions;
249 absl::c_transform(
250 rids, std::back_inserter(rid_descriptions), [](const std::string& rid) {
251 return cricket::RidDescription(rid, cricket::RidDirection::kSend);
252 });
253 stream_params.set_rids(rid_descriptions);
254 return CreateVideoRtpSender(stream_params);
Florent Castelli892acf02018-10-01 20:47:20255 }
256
Seth Hampson2d2c8882018-05-16 23:02:32257 void CreateVideoRtpSender(bool is_screencast, uint32_t ssrc = kVideoSsrc) {
pbos5214a0a2016-12-16 23:39:11258 AddVideoTrack(is_screencast);
Guido Urdaneta1ff16c82019-05-20 17:31:53259 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 15:06:18260 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 17:31:53261 video_rtp_sender_ = VideoRtpSender::Create(
262 worker_thread_, video_track_->id(), set_streams_observer.get());
Niels Möllerafb246b2022-04-20 12:26:50263 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
Guido Urdaneta1ff16c82019-05-20 17:31:53264 EXPECT_CALL(*set_streams_observer, OnSetStreams());
265 video_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli1f31c202023-06-26 00:26:07266 video_rtp_sender_->SetMediaChannel(video_media_send_channel());
Seth Hampson2d2c8882018-05-16 23:02:32267 video_rtp_sender_->SetSsrc(ssrc);
268 VerifyVideoChannelInput(ssrc);
deadbeef70ab1a12015-09-28 23:53:55269 }
Steve Anton02ee47c2018-01-11 00:26:06270 void CreateVideoRtpSenderWithNoTrack() {
Guido Urdaneta1ff16c82019-05-20 17:31:53271 video_rtp_sender_ =
272 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Florent Castelli1f31c202023-06-26 00:26:07273 video_rtp_sender_->SetMediaChannel(video_media_send_channel());
Steve Anton02ee47c2018-01-11 00:26:06274 }
275
deadbeef70ab1a12015-09-28 23:53:55276 void DestroyAudioRtpSender() {
deadbeef70ab1a12015-09-28 23:53:55277 audio_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 23:30:35278 VerifyVoiceChannelNoInput();
deadbeef70ab1a12015-09-28 23:53:55279 }
280
281 void DestroyVideoRtpSender() {
deadbeef70ab1a12015-09-28 23:53:55282 video_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 23:30:35283 VerifyVideoChannelNoInput();
deadbeef70ab1a12015-09-28 23:53:55284 }
285
Henrik Boström9e6fd2b2017-11-21 12:41:51286 void CreateAudioRtpReceiver(
287 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
Tommi4ccdf9322021-05-17 12:50:10288 audio_rtp_receiver_ = rtc::make_ref_counted<AudioRtpReceiver>(
289 rtc::Thread::Current(), kAudioTrackId, streams,
290 /*is_unified_plan=*/true);
Florent Castelli1f31c202023-06-26 00:26:07291 audio_rtp_receiver_->SetMediaChannel(voice_media_receive_channel());
Steve Antond3679212018-01-18 01:41:02292 audio_rtp_receiver_->SetupMediaChannel(kAudioSsrc);
perkjd61bf802016-03-24 10:16:19293 audio_track_ = audio_rtp_receiver_->audio_track();
Taylor Brandstetterba29c6a2016-06-27 23:30:35294 VerifyVoiceChannelOutput();
deadbeef70ab1a12015-09-28 23:53:55295 }
296
Henrik Boström9e6fd2b2017-11-21 12:41:51297 void CreateVideoRtpReceiver(
298 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
Tommi4ccdf9322021-05-17 12:50:10299 video_rtp_receiver_ = rtc::make_ref_counted<VideoRtpReceiver>(
300 rtc::Thread::Current(), kVideoTrackId, streams);
Florent Castelli1f31c202023-06-26 00:26:07301 video_rtp_receiver_->SetMediaChannel(video_media_receive_channel());
Steve Antond3679212018-01-18 01:41:02302 video_rtp_receiver_->SetupMediaChannel(kVideoSsrc);
perkjf0dcfe22016-03-10 17:32:00303 video_track_ = video_rtp_receiver_->video_track();
Taylor Brandstetterba29c6a2016-06-27 23:30:35304 VerifyVideoChannelOutput();
deadbeef70ab1a12015-09-28 23:53:55305 }
306
Florent Castelli38332cd2018-11-20 13:08:06307 void CreateVideoRtpReceiverWithSimulcast(
308 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {},
309 int num_layers = kVideoSimulcastLayerCount) {
310 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 09:11:53311 ssrcs.reserve(num_layers);
Florent Castelli38332cd2018-11-20 13:08:06312 for (int i = 0; i < num_layers; ++i)
313 ssrcs.push_back(kVideoSsrcSimulcast + i);
314 cricket::StreamParams stream_params =
315 cricket::CreateSimStreamParams("cname", ssrcs);
Harald Alvestrand2f553702023-03-07 10:10:03316 video_media_receive_channel_->AddRecvStream(stream_params);
Florent Castelli38332cd2018-11-20 13:08:06317 uint32_t primary_ssrc = stream_params.first_ssrc();
318
Tommi4ccdf9322021-05-17 12:50:10319 video_rtp_receiver_ = rtc::make_ref_counted<VideoRtpReceiver>(
320 rtc::Thread::Current(), kVideoTrackId, streams);
Florent Castelli1f31c202023-06-26 00:26:07321 video_rtp_receiver_->SetMediaChannel(video_media_receive_channel());
Florent Castelli38332cd2018-11-20 13:08:06322 video_rtp_receiver_->SetupMediaChannel(primary_ssrc);
323 video_track_ = video_rtp_receiver_->video_track();
324 }
325
deadbeef70ab1a12015-09-28 23:53:55326 void DestroyAudioRtpReceiver() {
Tommi4ccdf9322021-05-17 12:50:10327 if (!audio_rtp_receiver_)
328 return;
Tommi6589def2022-02-17 22:36:47329 audio_rtp_receiver_->SetMediaChannel(nullptr);
deadbeef70ab1a12015-09-28 23:53:55330 audio_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 23:30:35331 VerifyVoiceChannelNoOutput();
deadbeef70ab1a12015-09-28 23:53:55332 }
333
334 void DestroyVideoRtpReceiver() {
Tommi4ccdf9322021-05-17 12:50:10335 if (!video_rtp_receiver_)
336 return;
337 video_rtp_receiver_->Stop();
Tommi6589def2022-02-17 22:36:47338 video_rtp_receiver_->SetMediaChannel(nullptr);
deadbeef70ab1a12015-09-28 23:53:55339 video_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 23:30:35340 VerifyVideoChannelNoOutput();
341 }
342
343 void VerifyVoiceChannelInput() { VerifyVoiceChannelInput(kAudioSsrc); }
344
345 void VerifyVoiceChannelInput(uint32_t ssrc) {
346 // Verify that the media channel has an audio source, and the stream isn't
347 // muted.
Harald Alvestrand2f553702023-03-07 10:10:03348 EXPECT_TRUE(voice_media_send_channel()->HasSource(ssrc));
349 EXPECT_FALSE(voice_media_send_channel()->IsStreamMuted(ssrc));
Taylor Brandstetterba29c6a2016-06-27 23:30:35350 }
351
352 void VerifyVideoChannelInput() { VerifyVideoChannelInput(kVideoSsrc); }
353
354 void VerifyVideoChannelInput(uint32_t ssrc) {
355 // Verify that the media channel has a video source,
Florent Castelli1f31c202023-06-26 00:26:07356 EXPECT_TRUE(video_media_send_channel()->HasSource(ssrc));
Taylor Brandstetterba29c6a2016-06-27 23:30:35357 }
358
359 void VerifyVoiceChannelNoInput() { VerifyVoiceChannelNoInput(kAudioSsrc); }
360
361 void VerifyVoiceChannelNoInput(uint32_t ssrc) {
362 // Verify that the media channel's source is reset.
Harald Alvestrand2f553702023-03-07 10:10:03363 EXPECT_FALSE(voice_media_receive_channel()->HasSource(ssrc));
Taylor Brandstetterba29c6a2016-06-27 23:30:35364 }
365
366 void VerifyVideoChannelNoInput() { VerifyVideoChannelNoInput(kVideoSsrc); }
367
368 void VerifyVideoChannelNoInput(uint32_t ssrc) {
369 // Verify that the media channel's source is reset.
Florent Castelli1f31c202023-06-26 00:26:07370 EXPECT_FALSE(video_media_receive_channel()->HasSource(ssrc));
Taylor Brandstetterba29c6a2016-06-27 23:30:35371 }
372
373 void VerifyVoiceChannelOutput() {
374 // Verify that the volume is initialized to 1.
375 double volume;
Harald Alvestrand2f553702023-03-07 10:10:03376 EXPECT_TRUE(
377 voice_media_receive_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.
Florent Castelli1f31c202023-06-26 00:26:07383 EXPECT_TRUE(video_media_receive_channel()->HasSink(kVideoSsrc));
Taylor Brandstetterba29c6a2016-06-27 23:30:35384 }
385
386 void VerifyVoiceChannelNoOutput() {
387 // Verify that the volume is reset to 0.
388 double volume;
Harald Alvestrand2f553702023-03-07 10:10:03389 EXPECT_TRUE(
390 voice_media_receive_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 23:30:35391 EXPECT_EQ(0, volume);
392 }
393
394 void VerifyVideoChannelNoOutput() {
395 // Verify that the media channel's sink is reset.
Florent Castelli1f31c202023-06-26 00:26:07396 EXPECT_FALSE(video_media_receive_channel()->HasSink(kVideoSsrc));
deadbeef70ab1a12015-09-28 23:53:55397 }
398
Amit Hilbuch2297d332019-02-19 20:49:22399 // Verifies that the encoding layers contain the specified RIDs.
400 bool VerifyEncodingLayers(const VideoRtpSender& sender,
401 const std::vector<std::string>& rids) {
402 bool has_failure = HasFailure();
403 RtpParameters parameters = sender.GetParameters();
404 std::vector<std::string> encoding_rids;
405 absl::c_transform(
406 parameters.encodings, std::back_inserter(encoding_rids),
407 [](const RtpEncodingParameters& encoding) { return encoding.rid; });
408 EXPECT_THAT(rids, ContainerEq(encoding_rids));
409 return has_failure || !HasFailure();
410 }
411
412 // Runs a test for disabling the encoding layers on the specified sender.
413 void RunDisableEncodingLayersTest(
414 const std::vector<std::string>& all_layers,
415 const std::vector<std::string>& disabled_layers,
416 VideoRtpSender* sender) {
417 std::vector<std::string> expected;
418 absl::c_copy_if(all_layers, std::back_inserter(expected),
419 [&disabled_layers](const std::string& rid) {
420 return !absl::c_linear_search(disabled_layers, rid);
421 });
422
423 EXPECT_TRUE(VerifyEncodingLayers(*sender, all_layers));
424 sender->DisableEncodingLayers(disabled_layers);
425 EXPECT_TRUE(VerifyEncodingLayers(*sender, expected));
426 }
427
428 // Runs a test for setting an encoding layer as inactive.
429 // This test assumes that some layers have already been disabled.
430 void RunSetLastLayerAsInactiveTest(VideoRtpSender* sender) {
431 auto parameters = sender->GetParameters();
432 if (parameters.encodings.size() == 0) {
433 return;
434 }
435
436 RtpEncodingParameters& encoding = parameters.encodings.back();
437 auto rid = encoding.rid;
438 EXPECT_TRUE(encoding.active);
439 encoding.active = false;
440 auto error = sender->SetParameters(parameters);
441 ASSERT_TRUE(error.ok());
442 parameters = sender->GetParameters();
443 RtpEncodingParameters& result_encoding = parameters.encodings.back();
444 EXPECT_EQ(rid, result_encoding.rid);
445 EXPECT_FALSE(result_encoding.active);
446 }
447
448 // Runs a test for disabling the encoding layers on a sender without a media
449 // channel.
450 void RunDisableSimulcastLayersWithoutMediaEngineTest(
451 const std::vector<std::string>& all_layers,
452 const std::vector<std::string>& disabled_layers) {
Guido Urdaneta1ff16c82019-05-20 17:31:53453 auto sender = VideoRtpSender::Create(rtc::Thread::Current(), "1", nullptr);
Amit Hilbuch2297d332019-02-19 20:49:22454 RtpParameters parameters;
455 parameters.encodings.resize(all_layers.size());
456 for (size_t i = 0; i < all_layers.size(); ++i) {
457 parameters.encodings[i].rid = all_layers[i];
458 }
Amit Hilbuchea7ef2a2019-02-19 23:20:21459 sender->set_init_send_encodings(parameters.encodings);
460 RunDisableEncodingLayersTest(all_layers, disabled_layers, sender.get());
461 RunSetLastLayerAsInactiveTest(sender.get());
Amit Hilbuch2297d332019-02-19 20:49:22462 }
463
464 // Runs a test for disabling the encoding layers on a sender with a media
465 // channel.
466 void RunDisableSimulcastLayersWithMediaEngineTest(
467 const std::vector<std::string>& all_layers,
468 const std::vector<std::string>& disabled_layers) {
469 uint32_t ssrc = CreateVideoRtpSenderWithSimulcast(all_layers);
470 RunDisableEncodingLayersTest(all_layers, disabled_layers,
471 video_rtp_sender_.get());
472
Harald Alvestrand2f553702023-03-07 10:10:03473 auto channel_parameters =
474 video_media_send_channel_->GetRtpSendParameters(ssrc);
Amit Hilbuch2297d332019-02-19 20:49:22475 ASSERT_EQ(channel_parameters.encodings.size(), all_layers.size());
476 for (size_t i = 0; i < all_layers.size(); ++i) {
477 EXPECT_EQ(all_layers[i], channel_parameters.encodings[i].rid);
478 bool is_active = !absl::c_linear_search(disabled_layers, all_layers[i]);
479 EXPECT_EQ(is_active, channel_parameters.encodings[i].active);
480 }
481
482 RunSetLastLayerAsInactiveTest(video_rtp_sender_.get());
483 }
484
Ruslan Burakov4bac79e2019-04-03 17:55:33485 // Check that minimum Jitter Buffer delay is propagated to the underlying
Artem Titov880fa812021-07-30 20:30:23486 // `media_channel`.
Florent Castellid797cb62023-06-27 20:07:09487 void VerifyRtpReceiverDelayBehaviour(
488 cricket::MediaReceiveChannelInterface* media_channel,
489 RtpReceiverInterface* receiver,
490 uint32_t ssrc) {
Ruslan Burakov4bac79e2019-04-03 17:55:33491 receiver->SetJitterBufferMinimumDelay(/*delay_seconds=*/0.5);
492 absl::optional<int> delay_ms =
493 media_channel->GetBaseMinimumPlayoutDelayMs(ssrc); // In milliseconds.
494 EXPECT_DOUBLE_EQ(0.5, delay_ms.value_or(0) / 1000.0);
495 }
496
deadbeef70ab1a12015-09-28 23:53:55497 protected:
Florent Castelli1f31c202023-06-26 00:26:07498 cricket::FakeVideoMediaSendChannel* video_media_send_channel() {
499 return static_cast<cricket::FakeVideoMediaSendChannel*>(
500 video_media_send_channel_.get());
Harald Alvestrand485457f2022-05-23 08:46:57501 }
Florent Castelli1f31c202023-06-26 00:26:07502 cricket::FakeVoiceMediaSendChannel* voice_media_send_channel() {
503 return static_cast<cricket::FakeVoiceMediaSendChannel*>(
504 voice_media_send_channel_.get());
Harald Alvestrand2f553702023-03-07 10:10:03505 }
Florent Castelli1f31c202023-06-26 00:26:07506 cricket::FakeVideoMediaReceiveChannel* video_media_receive_channel() {
507 return static_cast<cricket::FakeVideoMediaReceiveChannel*>(
508 video_media_receive_channel_.get());
Harald Alvestrand2f553702023-03-07 10:10:03509 }
Florent Castelli1f31c202023-06-26 00:26:07510 cricket::FakeVoiceMediaReceiveChannel* voice_media_receive_channel() {
511 return static_cast<cricket::FakeVoiceMediaReceiveChannel*>(
512 voice_media_receive_channel_.get());
Harald Alvestrand485457f2022-05-23 08:46:57513 }
514
Tommi4ccdf9322021-05-17 12:50:10515 test::RunLoop run_loop_;
Steve Anton47136dd2018-01-12 18:49:35516 rtc::Thread* const network_thread_;
517 rtc::Thread* const worker_thread_;
Harald Alvestranda6544372023-11-13 09:33:56518 RtcEventLogNull event_log_;
Artem Titov880fa812021-07-30 20:30:23519 // The `rtp_dtls_transport_` and `rtp_transport_` should be destroyed after
520 // the `channel_manager`.
Zhi Huange830e682018-03-30 17:48:35521 std::unique_ptr<cricket::DtlsTransportInternal> rtp_dtls_transport_;
Harald Alvestranda6544372023-11-13 09:33:56522 std::unique_ptr<RtpTransportInternal> rtp_transport_;
523 std::unique_ptr<VideoBitrateAllocatorFactory>
Jonas Orelanda3aa9bd2019-04-17 05:38:40524 video_bitrate_allocator_factory_;
Harald Alvestrand0ac50b92022-05-18 07:51:34525 std::unique_ptr<cricket::FakeMediaEngine> media_engine_;
526 rtc::UniqueRandomIdGenerator ssrc_generator_;
Taylor Brandstetterba29c6a2016-06-27 23:30:35527 cricket::FakeCall fake_call_;
Florent Castelli1f31c202023-06-26 00:26:07528 std::unique_ptr<cricket::VoiceMediaSendChannelInterface>
529 voice_media_send_channel_;
530 std::unique_ptr<cricket::VideoMediaSendChannelInterface>
531 video_media_send_channel_;
532 std::unique_ptr<cricket::VoiceMediaReceiveChannelInterface>
533 voice_media_receive_channel_;
534 std::unique_ptr<cricket::VideoMediaReceiveChannelInterface>
535 video_media_receive_channel_;
deadbeef70ab1a12015-09-28 23:53:55536 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
537 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
538 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
539 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
deadbeefe814a0d2017-02-26 02:15:09540 rtc::scoped_refptr<MediaStreamInterface> local_stream_;
deadbeef70ab1a12015-09-28 23:53:55541 rtc::scoped_refptr<VideoTrackInterface> video_track_;
542 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
Harald Alvestranda6544372023-11-13 09:33:56543 test::ScopedKeyValueConfig field_trials_;
deadbeef70ab1a12015-09-28 23:53:55544};
545
Artem Titov880fa812021-07-30 20:30:23546// Test that `voice_channel_` is updated when an audio track is associated
deadbeef70ab1a12015-09-28 23:53:55547// and disassociated with an AudioRtpSender.
548TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
549 CreateAudioRtpSender();
550 DestroyAudioRtpSender();
551}
552
Artem Titov880fa812021-07-30 20:30:23553// Test that `video_channel_` is updated when a video track is associated and
deadbeef70ab1a12015-09-28 23:53:55554// disassociated with a VideoRtpSender.
555TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
556 CreateVideoRtpSender();
557 DestroyVideoRtpSender();
558}
559
Artem Titov880fa812021-07-30 20:30:23560// Test that `voice_channel_` is updated when a remote audio track is
deadbeef70ab1a12015-09-28 23:53:55561// associated and disassociated with an AudioRtpReceiver.
562TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
563 CreateAudioRtpReceiver();
564 DestroyAudioRtpReceiver();
565}
566
Artem Titov880fa812021-07-30 20:30:23567// Test that `video_channel_` is updated when a remote video track is
Taylor Brandstetterba29c6a2016-06-27 23:30:35568// associated and disassociated with a VideoRtpReceiver.
deadbeef70ab1a12015-09-28 23:53:55569TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
570 CreateVideoRtpReceiver();
571 DestroyVideoRtpReceiver();
572}
573
Henrik Boström9e6fd2b2017-11-21 12:41:51574TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiverWithStreams) {
575 CreateAudioRtpReceiver({local_stream_});
576 DestroyAudioRtpReceiver();
577}
578
579TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiverWithStreams) {
580 CreateVideoRtpReceiver({local_stream_});
581 DestroyVideoRtpReceiver();
582}
583
Taylor Brandstetterba29c6a2016-06-27 23:30:35584// Test that the AudioRtpSender applies options from the local audio source.
585TEST_F(RtpSenderReceiverTest, LocalAudioSourceOptionsApplied) {
586 cricket::AudioOptions options;
Oskar Sundbom36f8f3e2017-11-16 09:54:27587 options.echo_cancellation = true;
deadbeef757146b2017-02-11 05:26:48588 auto source = LocalAudioSource::Create(&options);
Niels Möllere7cc8832022-01-04 14:20:03589 CreateAudioRtpSender(source);
Taylor Brandstetter2d549172016-06-24 21:18:22590
Harald Alvestrand2f553702023-03-07 10:10:03591 EXPECT_EQ(true, voice_media_send_channel()->options().echo_cancellation);
Taylor Brandstetter2d549172016-06-24 21:18:22592
593 DestroyAudioRtpSender();
594}
595
Taylor Brandstetterba29c6a2016-06-27 23:30:35596// Test that the stream is muted when the track is disabled, and unmuted when
597// the track is enabled.
598TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) {
599 CreateAudioRtpSender();
600
601 audio_track_->set_enabled(false);
Harald Alvestrand2f553702023-03-07 10:10:03602 EXPECT_TRUE(voice_media_send_channel()->IsStreamMuted(kAudioSsrc));
Taylor Brandstetterba29c6a2016-06-27 23:30:35603
604 audio_track_->set_enabled(true);
Harald Alvestrand2f553702023-03-07 10:10:03605 EXPECT_FALSE(voice_media_send_channel()->IsStreamMuted(kAudioSsrc));
Taylor Brandstetterba29c6a2016-06-27 23:30:35606
607 DestroyAudioRtpSender();
608}
609
610// Test that the volume is set to 0 when the track is disabled, and back to
611// 1 when the track is enabled.
deadbeef70ab1a12015-09-28 23:53:55612TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
613 CreateAudioRtpReceiver();
614
Taylor Brandstetterba29c6a2016-06-27 23:30:35615 double volume;
Harald Alvestrand2f553702023-03-07 10:10:03616 EXPECT_TRUE(
617 voice_media_receive_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 23:30:35618 EXPECT_EQ(1, volume);
Taylor Brandstetter2d549172016-06-24 21:18:22619
Tommi4ccdf9322021-05-17 12:50:10620 // Handling of enable/disable is applied asynchronously.
Taylor Brandstetterba29c6a2016-06-27 23:30:35621 audio_track_->set_enabled(false);
Tommi4ccdf9322021-05-17 12:50:10622 run_loop_.Flush();
623
Harald Alvestrand2f553702023-03-07 10:10:03624 EXPECT_TRUE(
625 voice_media_receive_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 23:30:35626 EXPECT_EQ(0, volume);
627
deadbeef70ab1a12015-09-28 23:53:55628 audio_track_->set_enabled(true);
Tommi4ccdf9322021-05-17 12:50:10629 run_loop_.Flush();
Harald Alvestrand2f553702023-03-07 10:10:03630 EXPECT_TRUE(
631 voice_media_receive_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 23:30:35632 EXPECT_EQ(1, volume);
deadbeef70ab1a12015-09-28 23:53:55633
634 DestroyAudioRtpReceiver();
635}
636
Taylor Brandstetterba29c6a2016-06-27 23:30:35637// Currently no action is taken when a remote video track is disabled or
638// enabled, so there's nothing to test here, other than what is normally
639// verified in DestroyVideoRtpSender.
deadbeef70ab1a12015-09-28 23:53:55640TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
641 CreateVideoRtpSender();
642
deadbeef70ab1a12015-09-28 23:53:55643 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 23:53:55644 video_track_->set_enabled(true);
645
646 DestroyVideoRtpSender();
647}
648
Taylor Brandstetterba29c6a2016-06-27 23:30:35649// Test that the state of the video track created by the VideoRtpReceiver is
650// updated when the receiver is destroyed.
perkjf0dcfe22016-03-10 17:32:00651TEST_F(RtpSenderReceiverTest, RemoteVideoTrackState) {
652 CreateVideoRtpReceiver();
653
Harald Alvestranda6544372023-11-13 09:33:56654 EXPECT_EQ(MediaStreamTrackInterface::kLive, video_track_->state());
655 EXPECT_EQ(MediaSourceInterface::kLive, video_track_->GetSource()->state());
perkjf0dcfe22016-03-10 17:32:00656
657 DestroyVideoRtpReceiver();
658
Harald Alvestranda6544372023-11-13 09:33:56659 EXPECT_EQ(MediaStreamTrackInterface::kEnded, video_track_->state());
660 EXPECT_EQ(MediaSourceInterface::kEnded, video_track_->GetSource()->state());
Tommi4ccdf9322021-05-17 12:50:10661 DestroyVideoRtpReceiver();
perkjf0dcfe22016-03-10 17:32:00662}
663
Taylor Brandstetterba29c6a2016-06-27 23:30:35664// Currently no action is taken when a remote video track is disabled or
665// enabled, so there's nothing to test here, other than what is normally
666// verified in DestroyVideoRtpReceiver.
deadbeef70ab1a12015-09-28 23:53:55667TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
668 CreateVideoRtpReceiver();
669
670 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 23:53:55671 video_track_->set_enabled(true);
672
673 DestroyVideoRtpReceiver();
674}
675
Taylor Brandstetterba29c6a2016-06-27 23:30:35676// Test that the AudioRtpReceiver applies volume changes from the track source
677// to the media channel.
deadbeef70ab1a12015-09-28 23:53:55678TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
679 CreateAudioRtpReceiver();
680
Taylor Brandstetterba29c6a2016-06-27 23:30:35681 double volume;
682 audio_track_->GetSource()->SetVolume(0.5);
Tommi4ccdf9322021-05-17 12:50:10683 run_loop_.Flush();
Harald Alvestrand2f553702023-03-07 10:10:03684 EXPECT_TRUE(
685 voice_media_receive_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 23:30:35686 EXPECT_EQ(0.5, volume);
deadbeef70ab1a12015-09-28 23:53:55687
688 // Disable the audio track, this should prevent setting the volume.
deadbeef70ab1a12015-09-28 23:53:55689 audio_track_->set_enabled(false);
Tommi4ccdf9322021-05-17 12:50:10690 RTC_DCHECK_EQ(worker_thread_, run_loop_.task_queue());
691 run_loop_.Flush();
Taylor Brandstetterba29c6a2016-06-27 23:30:35692 audio_track_->GetSource()->SetVolume(0.8);
Harald Alvestrand2f553702023-03-07 10:10:03693 EXPECT_TRUE(
694 voice_media_receive_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 23:30:35695 EXPECT_EQ(0, volume);
deadbeef70ab1a12015-09-28 23:53:55696
Taylor Brandstetterba29c6a2016-06-27 23:30:35697 // When the track is enabled, the previously set volume should take effect.
deadbeef70ab1a12015-09-28 23:53:55698 audio_track_->set_enabled(true);
Tommi4ccdf9322021-05-17 12:50:10699 run_loop_.Flush();
Harald Alvestrand2f553702023-03-07 10:10:03700 EXPECT_TRUE(
701 voice_media_receive_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 23:30:35702 EXPECT_EQ(0.8, volume);
deadbeef70ab1a12015-09-28 23:53:55703
Taylor Brandstetterba29c6a2016-06-27 23:30:35704 // Try changing volume one more time.
705 audio_track_->GetSource()->SetVolume(0.9);
Tommi4ccdf9322021-05-17 12:50:10706 run_loop_.Flush();
Harald Alvestrand2f553702023-03-07 10:10:03707 EXPECT_TRUE(
708 voice_media_receive_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 23:30:35709 EXPECT_EQ(0.9, volume);
deadbeef70ab1a12015-09-28 23:53:55710
711 DestroyAudioRtpReceiver();
712}
713
Ruslan Burakov4bac79e2019-04-03 17:55:33714TEST_F(RtpSenderReceiverTest, AudioRtpReceiverDelay) {
715 CreateAudioRtpReceiver();
Harald Alvestrandc0d44d92022-12-13 12:57:24716 VerifyRtpReceiverDelayBehaviour(
Harald Alvestrand2f553702023-03-07 10:10:03717 voice_media_receive_channel()->AsVoiceReceiveChannel(),
718 audio_rtp_receiver_.get(), kAudioSsrc);
Tommi4ccdf9322021-05-17 12:50:10719 DestroyAudioRtpReceiver();
Ruslan Burakov4bac79e2019-04-03 17:55:33720}
721
722TEST_F(RtpSenderReceiverTest, VideoRtpReceiverDelay) {
723 CreateVideoRtpReceiver();
Harald Alvestrandc0d44d92022-12-13 12:57:24724 VerifyRtpReceiverDelayBehaviour(
Harald Alvestrand2f553702023-03-07 10:10:03725 video_media_receive_channel()->AsVideoReceiveChannel(),
726 video_rtp_receiver_.get(), kVideoSsrc);
Tommi4ccdf9322021-05-17 12:50:10727 DestroyVideoRtpReceiver();
Ruslan Burakov4bac79e2019-04-03 17:55:33728}
729
Taylor Brandstetterba29c6a2016-06-27 23:30:35730// Test that the media channel isn't enabled for sending if the audio sender
731// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 19:26:01732TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-11 00:26:06733 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 19:26:01734 rtc::scoped_refptr<AudioTrackInterface> track =
735 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 23:30:35736
737 // Track but no SSRC.
Niels Möllerafb246b2022-04-20 12:26:50738 EXPECT_TRUE(audio_rtp_sender_->SetTrack(track.get()));
Taylor Brandstetterba29c6a2016-06-27 23:30:35739 VerifyVoiceChannelNoInput();
740
741 // SSRC but no track.
742 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
743 audio_rtp_sender_->SetSsrc(kAudioSsrc);
744 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 19:26:01745}
746
Taylor Brandstetterba29c6a2016-06-27 23:30:35747// Test that the media channel isn't enabled for sending if the video sender
748// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 19:26:01749TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-11 00:26:06750 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 23:30:35751
752 // Track but no SSRC.
Niels Möllerafb246b2022-04-20 12:26:50753 EXPECT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
Taylor Brandstetterba29c6a2016-06-27 23:30:35754 VerifyVideoChannelNoInput();
755
756 // SSRC but no track.
757 EXPECT_TRUE(video_rtp_sender_->SetTrack(nullptr));
758 video_rtp_sender_->SetSsrc(kVideoSsrc);
759 VerifyVideoChannelNoInput();
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 audio sender
763// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 19:26:01764TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
Steve Anton02ee47c2018-01-11 00:26:06765 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 19:26:01766 rtc::scoped_refptr<AudioTrackInterface> track =
767 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 23:30:35768 audio_rtp_sender_->SetSsrc(kAudioSsrc);
Niels Möllerafb246b2022-04-20 12:26:50769 audio_rtp_sender_->SetTrack(track.get());
Taylor Brandstetterba29c6a2016-06-27 23:30:35770 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 19:26:01771
Taylor Brandstetterba29c6a2016-06-27 23:30:35772 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 19:26:01773}
774
Taylor Brandstetterba29c6a2016-06-27 23:30:35775// Test that the media channel is enabled for sending when the audio sender
776// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 19:26:01777TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
Steve Anton02ee47c2018-01-11 00:26:06778 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 19:26:01779 rtc::scoped_refptr<AudioTrackInterface> track =
780 AudioTrack::Create(kAudioTrackId, nullptr);
Niels Möllerafb246b2022-04-20 12:26:50781 audio_rtp_sender_->SetTrack(track.get());
Taylor Brandstetterba29c6a2016-06-27 23:30:35782 audio_rtp_sender_->SetSsrc(kAudioSsrc);
783 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 19:26:01784
Taylor Brandstetterba29c6a2016-06-27 23:30:35785 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 19:26:01786}
787
Taylor Brandstetterba29c6a2016-06-27 23:30:35788// Test that the media channel is enabled for sending when the video sender
789// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 19:26:01790TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
nisseaf510af2016-03-21 15:20:42791 AddVideoTrack();
Steve Anton02ee47c2018-01-11 00:26:06792 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 23:30:35793 video_rtp_sender_->SetSsrc(kVideoSsrc);
Niels Möllerafb246b2022-04-20 12:26:50794 video_rtp_sender_->SetTrack(video_track_.get());
Taylor Brandstetterba29c6a2016-06-27 23:30:35795 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 19:26:01796
Taylor Brandstetterba29c6a2016-06-27 23:30:35797 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 19:26:01798}
799
Taylor Brandstetterba29c6a2016-06-27 23:30:35800// Test that the media channel is enabled for sending when the video sender
801// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 19:26:01802TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
nisseaf510af2016-03-21 15:20:42803 AddVideoTrack();
Steve Anton02ee47c2018-01-11 00:26:06804 CreateVideoRtpSenderWithNoTrack();
Niels Möllerafb246b2022-04-20 12:26:50805 video_rtp_sender_->SetTrack(video_track_.get());
Taylor Brandstetterba29c6a2016-06-27 23:30:35806 video_rtp_sender_->SetSsrc(kVideoSsrc);
807 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 19:26:01808
Taylor Brandstetterba29c6a2016-06-27 23:30:35809 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 19:26:01810}
811
Taylor Brandstetterba29c6a2016-06-27 23:30:35812// Test that the media channel stops sending when the audio sender's SSRC is set
813// to 0.
deadbeeffac06552015-11-25 19:26:01814TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 23:30:35815 CreateAudioRtpSender();
deadbeeffac06552015-11-25 19:26:01816
Taylor Brandstetterba29c6a2016-06-27 23:30:35817 audio_rtp_sender_->SetSsrc(0);
818 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 19:26:01819}
820
Taylor Brandstetterba29c6a2016-06-27 23:30:35821// Test that the media channel stops sending when the video sender's SSRC is set
822// to 0.
deadbeeffac06552015-11-25 19:26:01823TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 23:30:35824 CreateAudioRtpSender();
deadbeeffac06552015-11-25 19:26:01825
Taylor Brandstetterba29c6a2016-06-27 23:30:35826 audio_rtp_sender_->SetSsrc(0);
827 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 19:26:01828}
829
Taylor Brandstetterba29c6a2016-06-27 23:30:35830// Test that the media channel stops sending when the audio sender's track is
831// set to null.
deadbeeffac06552015-11-25 19:26:01832TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 23:30:35833 CreateAudioRtpSender();
deadbeeffac06552015-11-25 19:26:01834
Taylor Brandstetterba29c6a2016-06-27 23:30:35835 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
836 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 19:26:01837}
838
Taylor Brandstetterba29c6a2016-06-27 23:30:35839// Test that the media channel stops sending when the video sender's track is
840// set to null.
deadbeeffac06552015-11-25 19:26:01841TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 23:30:35842 CreateVideoRtpSender();
deadbeeffac06552015-11-25 19:26:01843
Taylor Brandstetterba29c6a2016-06-27 23:30:35844 video_rtp_sender_->SetSsrc(0);
845 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 19:26:01846}
847
Taylor Brandstetterba29c6a2016-06-27 23:30:35848// Test that when the audio sender's SSRC is changed, the media channel stops
849// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 19:26:01850TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 23:30:35851 CreateAudioRtpSender();
deadbeeffac06552015-11-25 19:26:01852
Taylor Brandstetterba29c6a2016-06-27 23:30:35853 audio_rtp_sender_->SetSsrc(kAudioSsrc2);
854 VerifyVoiceChannelNoInput(kAudioSsrc);
855 VerifyVoiceChannelInput(kAudioSsrc2);
deadbeeffac06552015-11-25 19:26:01856
Taylor Brandstetterba29c6a2016-06-27 23:30:35857 audio_rtp_sender_ = nullptr;
858 VerifyVoiceChannelNoInput(kAudioSsrc2);
deadbeeffac06552015-11-25 19:26:01859}
860
Taylor Brandstetterba29c6a2016-06-27 23:30:35861// Test that when the audio sender's SSRC is changed, the media channel stops
862// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 19:26:01863TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 23:30:35864 CreateVideoRtpSender();
deadbeeffac06552015-11-25 19:26:01865
Taylor Brandstetterba29c6a2016-06-27 23:30:35866 video_rtp_sender_->SetSsrc(kVideoSsrc2);
867 VerifyVideoChannelNoInput(kVideoSsrc);
868 VerifyVideoChannelInput(kVideoSsrc2);
deadbeeffac06552015-11-25 19:26:01869
Taylor Brandstetterba29c6a2016-06-27 23:30:35870 video_rtp_sender_ = nullptr;
871 VerifyVideoChannelNoInput(kVideoSsrc2);
deadbeeffac06552015-11-25 19:26:01872}
873
skvladdc1c62c2016-03-17 02:07:43874TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) {
875 CreateAudioRtpSender();
876
skvladdc1c62c2016-03-17 02:07:43877 RtpParameters params = audio_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 23:30:35878 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 23:02:36879 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-17 02:07:43880
881 DestroyAudioRtpSender();
882}
883
Florent Castelliacabb362022-10-18 15:05:16884TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParametersAsync) {
885 CreateAudioRtpSender();
886
887 RtpParameters params = audio_rtp_sender_->GetParameters();
888 EXPECT_EQ(1u, params.encodings.size());
Harald Alvestranda6544372023-11-13 09:33:56889 absl::optional<RTCError> result;
Florent Castelliacabb362022-10-18 15:05:16890 audio_rtp_sender_->SetParametersAsync(
Harald Alvestranda6544372023-11-13 09:33:56891 params, [&result](RTCError error) { result = error; });
Florent Castelliacabb362022-10-18 15:05:16892 run_loop_.Flush();
893 EXPECT_TRUE(result->ok());
894
895 DestroyAudioRtpSender();
896}
897
Florent Castelli892acf02018-10-01 20:47:20898TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParametersBeforeNegotiation) {
Amit Hilbuchea7ef2a2019-02-19 23:20:21899 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 17:31:53900 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
Florent Castelli892acf02018-10-01 20:47:20901
902 RtpParameters params = audio_rtp_sender_->GetParameters();
903 ASSERT_EQ(1u, params.encodings.size());
904 params.encodings[0].max_bitrate_bps = 90000;
905 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
906
907 params = audio_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 20:47:20908 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
Florent Castelliacabb362022-10-18 15:05:16909 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
910
911 DestroyAudioRtpSender();
912}
913
914TEST_F(RtpSenderReceiverTest,
915 AudioSenderCanSetParametersAsyncBeforeNegotiation) {
916 audio_rtp_sender_ =
917 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
918
Harald Alvestranda6544372023-11-13 09:33:56919 absl::optional<RTCError> result;
Florent Castelliacabb362022-10-18 15:05:16920 RtpParameters params = audio_rtp_sender_->GetParameters();
921 ASSERT_EQ(1u, params.encodings.size());
922 params.encodings[0].max_bitrate_bps = 90000;
923
924 audio_rtp_sender_->SetParametersAsync(
Harald Alvestranda6544372023-11-13 09:33:56925 params, [&result](RTCError error) { result = error; });
Florent Castelliacabb362022-10-18 15:05:16926 run_loop_.Flush();
927 EXPECT_TRUE(result->ok());
928
929 params = audio_rtp_sender_->GetParameters();
930 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
931
932 audio_rtp_sender_->SetParametersAsync(
Harald Alvestranda6544372023-11-13 09:33:56933 params, [&result](RTCError error) { result = error; });
Florent Castelliacabb362022-10-18 15:05:16934 run_loop_.Flush();
935 EXPECT_TRUE(result->ok());
Florent Castelli892acf02018-10-01 20:47:20936
937 DestroyAudioRtpSender();
938}
939
940TEST_F(RtpSenderReceiverTest, AudioSenderInitParametersMovedAfterNegotiation) {
941 audio_track_ = AudioTrack::Create(kAudioTrackId, nullptr);
Harald Alvestrand2f7ad282022-04-21 11:35:43942 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
Florent Castelli892acf02018-10-01 20:47:20943
Guido Urdaneta1ff16c82019-05-20 17:31:53944 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 15:06:18945 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 17:31:53946 audio_rtp_sender_ = AudioRtpSender::Create(
947 worker_thread_, audio_track_->id(), nullptr, set_streams_observer.get());
Niels Möllerafb246b2022-04-20 12:26:50948 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_.get()));
Guido Urdaneta1ff16c82019-05-20 17:31:53949 EXPECT_CALL(*set_streams_observer, OnSetStreams());
950 audio_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli892acf02018-10-01 20:47:20951
952 std::vector<RtpEncodingParameters> init_encodings(1);
953 init_encodings[0].max_bitrate_bps = 60000;
954 audio_rtp_sender_->set_init_send_encodings(init_encodings);
955
956 RtpParameters params = audio_rtp_sender_->GetParameters();
957 ASSERT_EQ(1u, params.encodings.size());
958 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
959
960 // Simulate the setLocalDescription call
961 std::vector<uint32_t> ssrcs(1, 1);
962 cricket::StreamParams stream_params =
963 cricket::CreateSimStreamParams("cname", ssrcs);
Harald Alvestrand2f553702023-03-07 10:10:03964 voice_media_send_channel()->AddSendStream(stream_params);
Harald Alvestrandc0d44d92022-12-13 12:57:24965 audio_rtp_sender_->SetMediaChannel(
Harald Alvestrand2f553702023-03-07 10:10:03966 voice_media_send_channel()->AsVoiceSendChannel());
Florent Castelli892acf02018-10-01 20:47:20967 audio_rtp_sender_->SetSsrc(1);
968
969 params = audio_rtp_sender_->GetParameters();
970 ASSERT_EQ(1u, params.encodings.size());
971 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
972
973 DestroyAudioRtpSender();
974}
975
976TEST_F(RtpSenderReceiverTest,
977 AudioSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
Amit Hilbuchea7ef2a2019-02-19 23:20:21978 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 17:31:53979 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
Florent Castelli892acf02018-10-01 20:47:20980
981 RtpParameters params;
982 RTCError result = audio_rtp_sender_->SetParameters(params);
983 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
984 DestroyAudioRtpSender();
985}
986
Florent Castellicebf50f2018-05-03 13:31:53987TEST_F(RtpSenderReceiverTest,
988 AudioSenderMustCallGetParametersBeforeSetParameters) {
989 CreateAudioRtpSender();
990
991 RtpParameters params;
992 RTCError result = audio_rtp_sender_->SetParameters(params);
993 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
994
995 DestroyAudioRtpSender();
996}
997
998TEST_F(RtpSenderReceiverTest,
999 AudioSenderSetParametersInvalidatesTransactionId) {
1000 CreateAudioRtpSender();
1001
1002 RtpParameters params = audio_rtp_sender_->GetParameters();
1003 EXPECT_EQ(1u, params.encodings.size());
1004 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
1005 RTCError result = audio_rtp_sender_->SetParameters(params);
1006 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1007
1008 DestroyAudioRtpSender();
1009}
1010
Florent Castelliacabb362022-10-18 15:05:161011TEST_F(RtpSenderReceiverTest,
1012 AudioSenderSetParametersAsyncInvalidatesTransactionId) {
1013 CreateAudioRtpSender();
1014
1015 RtpParameters params = audio_rtp_sender_->GetParameters();
1016 EXPECT_EQ(1u, params.encodings.size());
Harald Alvestranda6544372023-11-13 09:33:561017 absl::optional<RTCError> result;
Florent Castelliacabb362022-10-18 15:05:161018 audio_rtp_sender_->SetParametersAsync(
Harald Alvestranda6544372023-11-13 09:33:561019 params, [&result](RTCError error) { result = error; });
Florent Castelliacabb362022-10-18 15:05:161020 run_loop_.Flush();
1021 EXPECT_TRUE(result->ok());
1022 audio_rtp_sender_->SetParametersAsync(
Harald Alvestranda6544372023-11-13 09:33:561023 params, [&result](RTCError error) { result = error; });
Florent Castelliacabb362022-10-18 15:05:161024 run_loop_.Flush();
1025 EXPECT_EQ(RTCErrorType::INVALID_STATE, result->type());
1026
1027 DestroyAudioRtpSender();
1028}
1029
Florent Castellicebf50f2018-05-03 13:31:531030TEST_F(RtpSenderReceiverTest, AudioSenderDetectTransactionIdModification) {
1031 CreateAudioRtpSender();
1032
1033 RtpParameters params = audio_rtp_sender_->GetParameters();
1034 params.transaction_id = "";
1035 RTCError result = audio_rtp_sender_->SetParameters(params);
1036 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1037
1038 DestroyAudioRtpSender();
1039}
1040
1041TEST_F(RtpSenderReceiverTest, AudioSenderCheckTransactionIdRefresh) {
1042 CreateAudioRtpSender();
1043
1044 RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 10:53:231045 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 13:31:531046 auto saved_transaction_id = params.transaction_id;
1047 params = audio_rtp_sender_->GetParameters();
1048 EXPECT_NE(saved_transaction_id, params.transaction_id);
1049
1050 DestroyAudioRtpSender();
1051}
1052
1053TEST_F(RtpSenderReceiverTest, AudioSenderSetParametersOldValueFail) {
1054 CreateAudioRtpSender();
1055
1056 RtpParameters params = audio_rtp_sender_->GetParameters();
1057 RtpParameters second_params = audio_rtp_sender_->GetParameters();
1058
1059 RTCError result = audio_rtp_sender_->SetParameters(params);
1060 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
Seth Hampson2d2c8882018-05-16 23:02:321061 DestroyAudioRtpSender();
1062}
1063
1064TEST_F(RtpSenderReceiverTest, AudioSenderCantSetUnimplementedRtpParameters) {
1065 CreateAudioRtpSender();
1066 RtpParameters params = audio_rtp_sender_->GetParameters();
1067 EXPECT_EQ(1u, params.encodings.size());
1068
Florent Castelli87b3c512018-07-18 14:00:281069 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 23:02:321070 params.mid = "dummy_mid";
1071 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1072 audio_rtp_sender_->SetParameters(params).type());
1073 params = audio_rtp_sender_->GetParameters();
1074
Seth Hampson2d2c8882018-05-16 23:02:321075 DestroyAudioRtpSender();
1076}
1077
Taylor Brandstetterba29c6a2016-06-27 23:30:351078TEST_F(RtpSenderReceiverTest, SetAudioMaxSendBitrate) {
1079 CreateAudioRtpSender();
1080
Harald Alvestrand2f553702023-03-07 10:10:031081 EXPECT_EQ(-1, voice_media_send_channel()->max_bps());
Harald Alvestranda6544372023-11-13 09:33:561082 RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 10:53:231083 EXPECT_EQ(1U, params.encodings.size());
deadbeefe702b302017-02-04 20:09:011084 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 09:54:271085 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 23:02:361086 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 23:30:351087
1088 // Read back the parameters and verify they have been changed.
1089 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 10:53:231090 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 09:54:271091 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 23:30:351092
1093 // Verify that the audio channel received the new parameters.
Harald Alvestrand2f553702023-03-07 10:10:031094 params = voice_media_send_channel()->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 10:53:231095 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 09:54:271096 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 23:30:351097
1098 // Verify that the global bitrate limit has not been changed.
Harald Alvestrand2f553702023-03-07 10:10:031099 EXPECT_EQ(-1, voice_media_send_channel()->max_bps());
Taylor Brandstetterba29c6a2016-06-27 23:30:351100
1101 DestroyAudioRtpSender();
1102}
1103
Seth Hampson24722b32017-12-22 17:36:421104TEST_F(RtpSenderReceiverTest, SetAudioBitratePriority) {
1105 CreateAudioRtpSender();
1106
Harald Alvestranda6544372023-11-13 09:33:561107 RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 10:53:231108 EXPECT_EQ(1U, params.encodings.size());
Harald Alvestranda6544372023-11-13 09:33:561109 EXPECT_EQ(kDefaultBitratePriority, params.encodings[0].bitrate_priority);
Seth Hampson24722b32017-12-22 17:36:421110 double new_bitrate_priority = 2.0;
1111 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 23:02:361112 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 17:36:421113
1114 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 10:53:231115 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 17:36:421116 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1117
Harald Alvestrand2f553702023-03-07 10:10:031118 params = voice_media_send_channel()->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 10:53:231119 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 17:36:421120 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1121
1122 DestroyAudioRtpSender();
1123}
1124
skvladdc1c62c2016-03-17 02:07:431125TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) {
1126 CreateVideoRtpSender();
1127
skvladdc1c62c2016-03-17 02:07:431128 RtpParameters params = video_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 23:30:351129 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 23:02:361130 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-17 02:07:431131
1132 DestroyVideoRtpSender();
1133}
1134
Florent Castelliacabb362022-10-18 15:05:161135TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParametersAsync) {
1136 CreateVideoRtpSender();
1137
1138 RtpParameters params = video_rtp_sender_->GetParameters();
1139 EXPECT_EQ(1u, params.encodings.size());
Harald Alvestranda6544372023-11-13 09:33:561140 absl::optional<RTCError> result;
Florent Castelliacabb362022-10-18 15:05:161141 video_rtp_sender_->SetParametersAsync(
Harald Alvestranda6544372023-11-13 09:33:561142 params, [&result](RTCError error) { result = error; });
Florent Castelliacabb362022-10-18 15:05:161143 run_loop_.Flush();
1144 EXPECT_TRUE(result->ok());
1145
1146 DestroyVideoRtpSender();
1147}
1148
Florent Castelli892acf02018-10-01 20:47:201149TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParametersBeforeNegotiation) {
Guido Urdaneta1ff16c82019-05-20 17:31:531150 video_rtp_sender_ =
1151 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Florent Castelli892acf02018-10-01 20:47:201152
1153 RtpParameters params = video_rtp_sender_->GetParameters();
1154 ASSERT_EQ(1u, params.encodings.size());
1155 params.encodings[0].max_bitrate_bps = 90000;
1156 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1157
1158 params = video_rtp_sender_->GetParameters();
1159 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1160 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
1161
1162 DestroyVideoRtpSender();
1163}
1164
Florent Castelliacabb362022-10-18 15:05:161165TEST_F(RtpSenderReceiverTest,
1166 VideoSenderCanSetParametersAsyncBeforeNegotiation) {
1167 video_rtp_sender_ =
1168 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
1169
Harald Alvestranda6544372023-11-13 09:33:561170 absl::optional<RTCError> result;
Florent Castelliacabb362022-10-18 15:05:161171 RtpParameters params = video_rtp_sender_->GetParameters();
1172 ASSERT_EQ(1u, params.encodings.size());
1173 params.encodings[0].max_bitrate_bps = 90000;
1174 video_rtp_sender_->SetParametersAsync(
Harald Alvestranda6544372023-11-13 09:33:561175 params, [&result](RTCError error) { result = error; });
Florent Castelliacabb362022-10-18 15:05:161176 run_loop_.Flush();
1177 EXPECT_TRUE(result->ok());
1178
1179 params = video_rtp_sender_->GetParameters();
1180 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
1181 video_rtp_sender_->SetParametersAsync(
Harald Alvestranda6544372023-11-13 09:33:561182 params, [&result](RTCError error) { result = error; });
Florent Castelliacabb362022-10-18 15:05:161183 run_loop_.Flush();
1184 EXPECT_TRUE(result->ok());
1185
1186 DestroyVideoRtpSender();
1187}
1188
Florent Castelli892acf02018-10-01 20:47:201189TEST_F(RtpSenderReceiverTest, VideoSenderInitParametersMovedAfterNegotiation) {
1190 AddVideoTrack(false);
1191
Guido Urdaneta1ff16c82019-05-20 17:31:531192 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 15:06:181193 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 17:31:531194 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1195 set_streams_observer.get());
Niels Möllerafb246b2022-04-20 12:26:501196 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
Guido Urdaneta1ff16c82019-05-20 17:31:531197 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1198 video_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli892acf02018-10-01 20:47:201199
1200 std::vector<RtpEncodingParameters> init_encodings(2);
1201 init_encodings[0].max_bitrate_bps = 60000;
1202 init_encodings[1].max_bitrate_bps = 900000;
1203 video_rtp_sender_->set_init_send_encodings(init_encodings);
1204
1205 RtpParameters params = video_rtp_sender_->GetParameters();
1206 ASSERT_EQ(2u, params.encodings.size());
1207 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1208 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
1209
1210 // Simulate the setLocalDescription call
1211 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 09:11:531212 ssrcs.reserve(2);
Florent Castelli892acf02018-10-01 20:47:201213 for (int i = 0; i < 2; ++i)
1214 ssrcs.push_back(kVideoSsrcSimulcast + i);
1215 cricket::StreamParams stream_params =
1216 cricket::CreateSimStreamParams("cname", ssrcs);
Harald Alvestrand2f553702023-03-07 10:10:031217 video_media_send_channel()->AddSendStream(stream_params);
Harald Alvestrandc0d44d92022-12-13 12:57:241218 video_rtp_sender_->SetMediaChannel(
Harald Alvestrand2f553702023-03-07 10:10:031219 video_media_send_channel()->AsVideoSendChannel());
Florent Castelli892acf02018-10-01 20:47:201220 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
1221
1222 params = video_rtp_sender_->GetParameters();
1223 ASSERT_EQ(2u, params.encodings.size());
1224 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1225 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
1226
1227 DestroyVideoRtpSender();
1228}
1229
1230TEST_F(RtpSenderReceiverTest,
1231 VideoSenderInitParametersMovedAfterManualSimulcastAndNegotiation) {
1232 AddVideoTrack(false);
1233
Guido Urdaneta1ff16c82019-05-20 17:31:531234 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 15:06:181235 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 17:31:531236 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1237 set_streams_observer.get());
Niels Möllerafb246b2022-04-20 12:26:501238 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
Guido Urdaneta1ff16c82019-05-20 17:31:531239 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1240 video_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli892acf02018-10-01 20:47:201241
1242 std::vector<RtpEncodingParameters> init_encodings(1);
1243 init_encodings[0].max_bitrate_bps = 60000;
1244 video_rtp_sender_->set_init_send_encodings(init_encodings);
1245
1246 RtpParameters params = video_rtp_sender_->GetParameters();
1247 ASSERT_EQ(1u, params.encodings.size());
1248 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1249
1250 // Simulate the setLocalDescription call as if the user used SDP munging
1251 // to enable simulcast
1252 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 09:11:531253 ssrcs.reserve(2);
Florent Castelli892acf02018-10-01 20:47:201254 for (int i = 0; i < 2; ++i)
1255 ssrcs.push_back(kVideoSsrcSimulcast + i);
1256 cricket::StreamParams stream_params =
1257 cricket::CreateSimStreamParams("cname", ssrcs);
Harald Alvestrand2f553702023-03-07 10:10:031258 video_media_send_channel()->AddSendStream(stream_params);
Harald Alvestrandc0d44d92022-12-13 12:57:241259 video_rtp_sender_->SetMediaChannel(
Harald Alvestrand2f553702023-03-07 10:10:031260 video_media_send_channel()->AsVideoSendChannel());
Florent Castelli892acf02018-10-01 20:47:201261 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
1262
1263 params = video_rtp_sender_->GetParameters();
1264 ASSERT_EQ(2u, params.encodings.size());
1265 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1266
1267 DestroyVideoRtpSender();
1268}
1269
Harald Alvestrand3fe8b0d2022-07-01 07:36:591270#if GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
1271using RtpSenderReceiverDeathTest = RtpSenderReceiverTest;
1272
1273TEST_F(RtpSenderReceiverDeathTest,
1274 VideoSenderManualRemoveSimulcastFailsDeathTest) {
1275 AddVideoTrack(false);
1276
1277 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
1278 std::make_unique<MockSetStreamsObserver>();
1279 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1280 set_streams_observer.get());
1281 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
1282 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1283 video_rtp_sender_->SetStreams({local_stream_->id()});
1284
1285 std::vector<RtpEncodingParameters> init_encodings(2);
1286 init_encodings[0].max_bitrate_bps = 60000;
1287 init_encodings[1].max_bitrate_bps = 120000;
1288 video_rtp_sender_->set_init_send_encodings(init_encodings);
1289
1290 RtpParameters params = video_rtp_sender_->GetParameters();
1291 ASSERT_EQ(2u, params.encodings.size());
1292 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1293
1294 // Simulate the setLocalDescription call as if the user used SDP munging
1295 // to disable simulcast.
1296 std::vector<uint32_t> ssrcs;
1297 ssrcs.reserve(2);
1298 for (int i = 0; i < 2; ++i)
1299 ssrcs.push_back(kVideoSsrcSimulcast + i);
1300 cricket::StreamParams stream_params =
1301 cricket::StreamParams::CreateLegacy(kVideoSsrc);
Harald Alvestrand2f553702023-03-07 10:10:031302 video_media_send_channel()->AddSendStream(stream_params);
Harald Alvestrandc0d44d92022-12-13 12:57:241303 video_rtp_sender_->SetMediaChannel(
Harald Alvestrand2f553702023-03-07 10:10:031304 video_media_send_channel()->AsVideoSendChannel());
Harald Alvestrand3fe8b0d2022-07-01 07:36:591305 EXPECT_DEATH(video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast), "");
1306}
1307#endif
1308
Florent Castelli892acf02018-10-01 20:47:201309TEST_F(RtpSenderReceiverTest,
1310 VideoSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
Guido Urdaneta1ff16c82019-05-20 17:31:531311 video_rtp_sender_ =
1312 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Florent Castelli892acf02018-10-01 20:47:201313
1314 RtpParameters params;
1315 RTCError result = video_rtp_sender_->SetParameters(params);
1316 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1317 DestroyVideoRtpSender();
1318}
1319
Florent Castellicebf50f2018-05-03 13:31:531320TEST_F(RtpSenderReceiverTest,
1321 VideoSenderMustCallGetParametersBeforeSetParameters) {
1322 CreateVideoRtpSender();
1323
1324 RtpParameters params;
1325 RTCError result = video_rtp_sender_->SetParameters(params);
1326 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1327
1328 DestroyVideoRtpSender();
1329}
1330
1331TEST_F(RtpSenderReceiverTest,
1332 VideoSenderSetParametersInvalidatesTransactionId) {
1333 CreateVideoRtpSender();
1334
1335 RtpParameters params = video_rtp_sender_->GetParameters();
1336 EXPECT_EQ(1u, params.encodings.size());
1337 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1338 RTCError result = video_rtp_sender_->SetParameters(params);
1339 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1340
1341 DestroyVideoRtpSender();
1342}
1343
Florent Castelliacabb362022-10-18 15:05:161344TEST_F(RtpSenderReceiverTest,
1345 VideoSenderSetParametersAsyncInvalidatesTransactionId) {
1346 CreateVideoRtpSender();
1347
1348 RtpParameters params = video_rtp_sender_->GetParameters();
1349 EXPECT_EQ(1u, params.encodings.size());
Harald Alvestranda6544372023-11-13 09:33:561350 absl::optional<RTCError> result;
Florent Castelliacabb362022-10-18 15:05:161351 video_rtp_sender_->SetParametersAsync(
Harald Alvestranda6544372023-11-13 09:33:561352 params, [&result](RTCError error) { result = error; });
Florent Castelliacabb362022-10-18 15:05:161353 run_loop_.Flush();
1354 EXPECT_TRUE(result->ok());
1355 video_rtp_sender_->SetParametersAsync(
Harald Alvestranda6544372023-11-13 09:33:561356 params, [&result](RTCError error) { result = error; });
Florent Castelliacabb362022-10-18 15:05:161357 run_loop_.Flush();
1358 EXPECT_EQ(RTCErrorType::INVALID_STATE, result->type());
1359
1360 DestroyVideoRtpSender();
1361}
1362
Florent Castellicebf50f2018-05-03 13:31:531363TEST_F(RtpSenderReceiverTest, VideoSenderDetectTransactionIdModification) {
1364 CreateVideoRtpSender();
1365
1366 RtpParameters params = video_rtp_sender_->GetParameters();
1367 params.transaction_id = "";
1368 RTCError result = video_rtp_sender_->SetParameters(params);
1369 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1370
1371 DestroyVideoRtpSender();
1372}
1373
1374TEST_F(RtpSenderReceiverTest, VideoSenderCheckTransactionIdRefresh) {
1375 CreateVideoRtpSender();
1376
1377 RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 10:53:231378 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 13:31:531379 auto saved_transaction_id = params.transaction_id;
1380 params = video_rtp_sender_->GetParameters();
1381 EXPECT_NE(saved_transaction_id, params.transaction_id);
1382
1383 DestroyVideoRtpSender();
1384}
1385
1386TEST_F(RtpSenderReceiverTest, VideoSenderSetParametersOldValueFail) {
1387 CreateVideoRtpSender();
1388
1389 RtpParameters params = video_rtp_sender_->GetParameters();
1390 RtpParameters second_params = video_rtp_sender_->GetParameters();
1391
1392 RTCError result = video_rtp_sender_->SetParameters(params);
1393 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1394
1395 DestroyVideoRtpSender();
1396}
1397
Seth Hampson2d2c8882018-05-16 23:02:321398TEST_F(RtpSenderReceiverTest, VideoSenderCantSetUnimplementedRtpParameters) {
1399 CreateVideoRtpSender();
1400 RtpParameters params = video_rtp_sender_->GetParameters();
1401 EXPECT_EQ(1u, params.encodings.size());
1402
Florent Castelli87b3c512018-07-18 14:00:281403 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 23:02:321404 params.mid = "dummy_mid";
1405 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1406 video_rtp_sender_->SetParameters(params).type());
1407 params = video_rtp_sender_->GetParameters();
1408
Seth Hampson2d2c8882018-05-16 23:02:321409 DestroyVideoRtpSender();
1410}
1411
Florent Castellic1a0bcb2019-01-29 13:26:481412TEST_F(RtpSenderReceiverTest, VideoSenderCanSetScaleResolutionDownBy) {
1413 CreateVideoRtpSender();
1414
1415 RtpParameters params = video_rtp_sender_->GetParameters();
1416 params.encodings[0].scale_resolution_down_by = 2;
1417
1418 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1419 params = video_rtp_sender_->GetParameters();
1420 EXPECT_EQ(2, params.encodings[0].scale_resolution_down_by);
1421
1422 DestroyVideoRtpSender();
1423}
1424
1425TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidScaleResolutionDownBy) {
1426 CreateVideoRtpSender();
1427
1428 RtpParameters params = video_rtp_sender_->GetParameters();
1429 params.encodings[0].scale_resolution_down_by = 0.5;
1430 RTCError result = video_rtp_sender_->SetParameters(params);
1431 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1432
1433 DestroyVideoRtpSender();
1434}
1435
Ă…sa Perssonfb195962021-08-16 14:41:561436TEST_F(RtpSenderReceiverTest, VideoSenderCanSetNumTemporalLayers) {
1437 CreateVideoRtpSender();
1438
1439 RtpParameters params = video_rtp_sender_->GetParameters();
1440 params.encodings[0].num_temporal_layers = 2;
1441
1442 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1443 params = video_rtp_sender_->GetParameters();
1444 EXPECT_EQ(2, params.encodings[0].num_temporal_layers);
1445
1446 DestroyVideoRtpSender();
1447}
1448
1449TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidNumTemporalLayers) {
1450 CreateVideoRtpSender();
1451
1452 RtpParameters params = video_rtp_sender_->GetParameters();
Harald Alvestranda6544372023-11-13 09:33:561453 params.encodings[0].num_temporal_layers = kMaxTemporalStreams + 1;
Ă…sa Perssonfb195962021-08-16 14:41:561454 RTCError result = video_rtp_sender_->SetParameters(params);
1455 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1456
1457 DestroyVideoRtpSender();
1458}
1459
Florent Castelli907dc802019-12-06 14:03:191460TEST_F(RtpSenderReceiverTest, VideoSenderCanSetMaxFramerate) {
1461 CreateVideoRtpSender();
1462
1463 RtpParameters params = video_rtp_sender_->GetParameters();
1464 params.encodings[0].max_framerate = 20;
1465
1466 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1467 params = video_rtp_sender_->GetParameters();
1468 EXPECT_EQ(20., params.encodings[0].max_framerate);
1469
1470 DestroyVideoRtpSender();
1471}
1472
1473TEST_F(RtpSenderReceiverTest, VideoSenderCanSetMaxFramerateZero) {
1474 CreateVideoRtpSender();
1475
1476 RtpParameters params = video_rtp_sender_->GetParameters();
1477 params.encodings[0].max_framerate = 0.;
1478
1479 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1480 params = video_rtp_sender_->GetParameters();
1481 EXPECT_EQ(0., params.encodings[0].max_framerate);
1482
1483 DestroyVideoRtpSender();
1484}
1485
1486TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidMaxFramerate) {
1487 CreateVideoRtpSender();
1488
1489 RtpParameters params = video_rtp_sender_->GetParameters();
1490 params.encodings[0].max_framerate = -5.;
1491 RTCError result = video_rtp_sender_->SetParameters(params);
1492 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1493
1494 DestroyVideoRtpSender();
1495}
1496
Seth Hampson2d2c8882018-05-16 23:02:321497// A video sender can have multiple simulcast layers, in which case it will
1498// contain multiple RtpEncodingParameters. This tests that if this is the case
1499// (simulcast), then we can't set the bitrate_priority, or max_bitrate_bps
1500// for any encodings besides at index 0, because these are both implemented
1501// "per-sender."
1502TEST_F(RtpSenderReceiverTest, VideoSenderCantSetPerSenderEncodingParameters) {
1503 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 20:47:201504 CreateVideoRtpSenderWithSimulcast();
Seth Hampson2d2c8882018-05-16 23:02:321505 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 20:47:201506 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Seth Hampson2d2c8882018-05-16 23:02:321507
1508 params.encodings[1].bitrate_priority = 2.0;
1509 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1510 video_rtp_sender_->SetParameters(params).type());
1511 params = video_rtp_sender_->GetParameters();
1512
Seth Hampson2d2c8882018-05-16 23:02:321513 DestroyVideoRtpSender();
1514}
1515
Florent Castelli892acf02018-10-01 20:47:201516TEST_F(RtpSenderReceiverTest, VideoSenderCantSetReadOnlyEncodingParameters) {
1517 // Add a simulcast specific send stream that contains 2 encoding parameters.
1518 CreateVideoRtpSenderWithSimulcast();
1519 RtpParameters params = video_rtp_sender_->GetParameters();
1520 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
1521
1522 for (size_t i = 0; i < params.encodings.size(); i++) {
1523 params.encodings[i].ssrc = 1337;
1524 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION,
1525 video_rtp_sender_->SetParameters(params).type());
1526 params = video_rtp_sender_->GetParameters();
1527 }
1528
1529 DestroyVideoRtpSender();
1530}
1531
Ă…sa Persson55659812018-06-18 15:51:321532TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrate) {
Taylor Brandstetterba29c6a2016-06-27 23:30:351533 CreateVideoRtpSender();
1534
Harald Alvestrand2f553702023-03-07 10:10:031535 EXPECT_EQ(-1, video_media_send_channel()->max_bps());
Harald Alvestranda6544372023-11-13 09:33:561536 RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 10:53:231537 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 15:51:321538 EXPECT_FALSE(params.encodings[0].min_bitrate_bps);
deadbeefe702b302017-02-04 20:09:011539 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Ă…sa Persson55659812018-06-18 15:51:321540 params.encodings[0].min_bitrate_bps = 100;
Oskar Sundbom36f8f3e2017-11-16 09:54:271541 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 23:02:361542 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 23:30:351543
1544 // Read back the parameters and verify they have been changed.
1545 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 10:53:231546 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 15:51:321547 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 09:54:271548 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 23:30:351549
1550 // Verify that the video channel received the new parameters.
Harald Alvestrand2f553702023-03-07 10:10:031551 params = video_media_send_channel()->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 10:53:231552 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 15:51:321553 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 09:54:271554 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 23:30:351555
1556 // Verify that the global bitrate limit has not been changed.
Harald Alvestrand2f553702023-03-07 10:10:031557 EXPECT_EQ(-1, video_media_send_channel()->max_bps());
Taylor Brandstetterba29c6a2016-06-27 23:30:351558
1559 DestroyVideoRtpSender();
1560}
1561
Ă…sa Persson55659812018-06-18 15:51:321562TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrateSimulcast) {
1563 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 20:47:201564 CreateVideoRtpSenderWithSimulcast();
Ă…sa Persson55659812018-06-18 15:51:321565
1566 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 20:47:201567 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 15:51:321568 params.encodings[0].min_bitrate_bps = 100;
1569 params.encodings[0].max_bitrate_bps = 1000;
1570 params.encodings[1].min_bitrate_bps = 200;
1571 params.encodings[1].max_bitrate_bps = 2000;
1572 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1573
1574 // Verify that the video channel received the new parameters.
Harald Alvestrand2f553702023-03-07 10:10:031575 params =
1576 video_media_send_channel()->GetRtpSendParameters(kVideoSsrcSimulcast);
Florent Castelli892acf02018-10-01 20:47:201577 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 15:51:321578 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
1579 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
1580 EXPECT_EQ(200, params.encodings[1].min_bitrate_bps);
1581 EXPECT_EQ(2000, params.encodings[1].max_bitrate_bps);
1582
1583 DestroyVideoRtpSender();
1584}
1585
Seth Hampson24722b32017-12-22 17:36:421586TEST_F(RtpSenderReceiverTest, SetVideoBitratePriority) {
1587 CreateVideoRtpSender();
1588
Harald Alvestranda6544372023-11-13 09:33:561589 RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 10:53:231590 EXPECT_EQ(1U, params.encodings.size());
Harald Alvestranda6544372023-11-13 09:33:561591 EXPECT_EQ(kDefaultBitratePriority, params.encodings[0].bitrate_priority);
Seth Hampson24722b32017-12-22 17:36:421592 double new_bitrate_priority = 2.0;
1593 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 23:02:361594 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 17:36:421595
1596 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 10:53:231597 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 17:36:421598 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1599
Harald Alvestrand2f553702023-03-07 10:10:031600 params = video_media_send_channel()->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 10:53:231601 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 17:36:421602 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1603
1604 DestroyVideoRtpSender();
1605}
1606
Florent Castelli38332cd2018-11-20 13:08:061607TEST_F(RtpSenderReceiverTest, VideoReceiverCanGetParametersWithSimulcast) {
1608 CreateVideoRtpReceiverWithSimulcast({}, 2);
1609
1610 RtpParameters params = video_rtp_receiver_->GetParameters();
1611 EXPECT_EQ(2u, params.encodings.size());
1612
1613 DestroyVideoRtpReceiver();
1614}
1615
Philipp Hanckeb83cd922022-11-09 10:06:381616TEST_F(RtpSenderReceiverTest, GenerateKeyFrameWithAudio) {
1617 CreateAudioRtpSender();
1618
1619 auto error = audio_rtp_sender_->GenerateKeyFrame({});
1620 EXPECT_FALSE(error.ok());
1621 EXPECT_EQ(error.type(), RTCErrorType::UNSUPPORTED_OPERATION);
1622
1623 DestroyAudioRtpSender();
1624}
1625
1626TEST_F(RtpSenderReceiverTest, GenerateKeyFrameWithVideo) {
1627 CreateVideoRtpSenderWithSimulcast({"1", "2", "3"});
1628
1629 auto error = video_rtp_sender_->GenerateKeyFrame({});
1630 EXPECT_TRUE(error.ok());
1631
1632 error = video_rtp_sender_->GenerateKeyFrame({"1"});
1633 EXPECT_TRUE(error.ok());
1634
1635 error = video_rtp_sender_->GenerateKeyFrame({""});
1636 EXPECT_FALSE(error.ok());
1637 EXPECT_EQ(error.type(), RTCErrorType::INVALID_PARAMETER);
1638
1639 error = video_rtp_sender_->GenerateKeyFrame({"no-such-rid"});
1640 EXPECT_FALSE(error.ok());
1641 EXPECT_EQ(error.type(), RTCErrorType::INVALID_PARAMETER);
1642
1643 DestroyVideoRtpSender();
1644}
1645
pbos5214a0a2016-12-16 23:39:111646// Test that makes sure that a video track content hint translates to the proper
1647// value for sources that are not screencast.
1648TEST_F(RtpSenderReceiverTest, PropagatesVideoTrackContentHint) {
1649 CreateVideoRtpSender();
1650
1651 video_track_->set_enabled(true);
1652
Artem Titov880fa812021-07-30 20:30:231653 // `video_track_` is not screencast by default.
Harald Alvestrand2f553702023-03-07 10:10:031654 EXPECT_EQ(false, video_media_send_channel()->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111655 // No content hint should be set by default.
1656 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1657 video_track_->content_hint());
1658 // Setting detailed should turn a non-screencast source into screencast mode.
1659 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Harald Alvestrand2f553702023-03-07 10:10:031660 EXPECT_EQ(true, video_media_send_channel()->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111661 // Removing the content hint should turn the track back into non-screencast
1662 // mode.
1663 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Harald Alvestrand2f553702023-03-07 10:10:031664 EXPECT_EQ(false, video_media_send_channel()->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111665 // Setting fluid should remain in non-screencast mode (its default).
1666 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Harald Alvestrand2f553702023-03-07 10:10:031667 EXPECT_EQ(false, video_media_send_channel()->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 06:53:101668 // Setting text should have the same effect as Detailed
1669 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
Harald Alvestrand2f553702023-03-07 10:10:031670 EXPECT_EQ(true, video_media_send_channel()->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111671
1672 DestroyVideoRtpSender();
1673}
1674
1675// Test that makes sure that a video track content hint translates to the proper
1676// value for screencast sources.
1677TEST_F(RtpSenderReceiverTest,
1678 PropagatesVideoTrackContentHintForScreencastSource) {
1679 CreateVideoRtpSender(true);
1680
1681 video_track_->set_enabled(true);
1682
Artem Titov880fa812021-07-30 20:30:231683 // `video_track_` with a screencast source should be screencast by default.
Harald Alvestrand2f553702023-03-07 10:10:031684 EXPECT_EQ(true, video_media_send_channel()->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111685 // No content hint should be set by default.
1686 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1687 video_track_->content_hint());
1688 // Setting fluid should turn a screencast source into non-screencast mode.
1689 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Harald Alvestrand2f553702023-03-07 10:10:031690 EXPECT_EQ(false, video_media_send_channel()->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111691 // Removing the content hint should turn the track back into screencast mode.
1692 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Harald Alvestrand2f553702023-03-07 10:10:031693 EXPECT_EQ(true, video_media_send_channel()->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111694 // Setting detailed should still remain in screencast mode (its default).
1695 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Harald Alvestrand2f553702023-03-07 10:10:031696 EXPECT_EQ(true, video_media_send_channel()->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 06:53:101697 // Setting text should have the same effect as Detailed
1698 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
Harald Alvestrand2f553702023-03-07 10:10:031699 EXPECT_EQ(true, video_media_send_channel()->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111700
1701 DestroyVideoRtpSender();
1702}
1703
1704// Test that makes sure any content hints that are set on a track before
1705// VideoRtpSender is ready to send are still applied when it gets ready to send.
1706TEST_F(RtpSenderReceiverTest,
1707 PropagatesVideoTrackContentHintSetBeforeEnabling) {
1708 AddVideoTrack();
Guido Urdaneta1ff16c82019-05-20 17:31:531709 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 15:06:181710 std::make_unique<MockSetStreamsObserver>();
pbos5214a0a2016-12-16 23:39:111711 // Setting detailed overrides the default non-screencast mode. This should be
1712 // applied even if the track is set on construction.
1713 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Guido Urdaneta1ff16c82019-05-20 17:31:531714 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1715 set_streams_observer.get());
Niels Möllerafb246b2022-04-20 12:26:501716 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
Guido Urdaneta1ff16c82019-05-20 17:31:531717 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1718 video_rtp_sender_->SetStreams({local_stream_->id()});
Harald Alvestrandc0d44d92022-12-13 12:57:241719 video_rtp_sender_->SetMediaChannel(
Harald Alvestrand2f553702023-03-07 10:10:031720 video_media_send_channel()->AsVideoSendChannel());
pbos5214a0a2016-12-16 23:39:111721 video_track_->set_enabled(true);
1722
1723 // Sender is not ready to send (no SSRC) so no option should have been set.
Harald Alvestrand2f553702023-03-07 10:10:031724 EXPECT_EQ(absl::nullopt, video_media_send_channel()->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111725
1726 // Verify that the content hint is accounted for when video_rtp_sender_ does
1727 // get enabled.
1728 video_rtp_sender_->SetSsrc(kVideoSsrc);
Harald Alvestrand2f553702023-03-07 10:10:031729 EXPECT_EQ(true, video_media_send_channel()->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111730
1731 // And removing the hint should go back to false (to verify that false was
1732 // default correctly).
1733 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Harald Alvestrand2f553702023-03-07 10:10:031734 EXPECT_EQ(false, video_media_send_channel()->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111735
1736 DestroyVideoRtpSender();
1737}
1738
deadbeef20cb0c12017-02-02 04:27:001739TEST_F(RtpSenderReceiverTest, AudioSenderHasDtmfSender) {
1740 CreateAudioRtpSender();
1741 EXPECT_NE(nullptr, audio_rtp_sender_->GetDtmfSender());
1742}
1743
1744TEST_F(RtpSenderReceiverTest, VideoSenderDoesNotHaveDtmfSender) {
1745 CreateVideoRtpSender();
1746 EXPECT_EQ(nullptr, video_rtp_sender_->GetDtmfSender());
1747}
1748
Artem Titov880fa812021-07-30 20:30:231749// Test that the DTMF sender is really using `voice_channel_`, and thus returns
1750// true/false from CanSendDtmf based on what `voice_channel_` returns.
deadbeef20cb0c12017-02-02 04:27:001751TEST_F(RtpSenderReceiverTest, CanInsertDtmf) {
1752 AddDtmfCodec();
1753 CreateAudioRtpSender();
1754 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1755 ASSERT_NE(nullptr, dtmf_sender);
1756 EXPECT_TRUE(dtmf_sender->CanInsertDtmf());
1757}
1758
1759TEST_F(RtpSenderReceiverTest, CanNotInsertDtmf) {
1760 CreateAudioRtpSender();
1761 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1762 ASSERT_NE(nullptr, dtmf_sender);
1763 // DTMF codec has not been added, as it was in the above test.
1764 EXPECT_FALSE(dtmf_sender->CanInsertDtmf());
1765}
1766
1767TEST_F(RtpSenderReceiverTest, InsertDtmf) {
1768 AddDtmfCodec();
1769 CreateAudioRtpSender();
1770 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1771 ASSERT_NE(nullptr, dtmf_sender);
1772
Harald Alvestrand2f553702023-03-07 10:10:031773 EXPECT_EQ(0U, voice_media_send_channel()->dtmf_info_queue().size());
deadbeef20cb0c12017-02-02 04:27:001774
1775 // Insert DTMF
1776 const int expected_duration = 90;
1777 dtmf_sender->InsertDtmf("012", expected_duration, 100);
1778
1779 // Verify
Harald Alvestrand2f553702023-03-07 10:10:031780 ASSERT_EQ_WAIT(3U, voice_media_send_channel()->dtmf_info_queue().size(),
deadbeef20cb0c12017-02-02 04:27:001781 kDefaultTimeout);
1782 const uint32_t send_ssrc =
Harald Alvestrand2f553702023-03-07 10:10:031783 voice_media_send_channel()->send_streams()[0].first_ssrc();
1784 EXPECT_TRUE(CompareDtmfInfo(voice_media_send_channel()->dtmf_info_queue()[0],
deadbeef20cb0c12017-02-02 04:27:001785 send_ssrc, 0, expected_duration));
Harald Alvestrand2f553702023-03-07 10:10:031786 EXPECT_TRUE(CompareDtmfInfo(voice_media_send_channel()->dtmf_info_queue()[1],
deadbeef20cb0c12017-02-02 04:27:001787 send_ssrc, 1, expected_duration));
Harald Alvestrand2f553702023-03-07 10:10:031788 EXPECT_TRUE(CompareDtmfInfo(voice_media_send_channel()->dtmf_info_queue()[2],
deadbeef20cb0c12017-02-02 04:27:001789 send_ssrc, 2, expected_duration));
1790}
1791
Benjamin Wright84583f62018-10-04 21:22:341792// Validate that the default FrameEncryptor setting is nullptr.
1793TEST_F(RtpSenderReceiverTest, AudioSenderCanSetFrameEncryptor) {
1794 CreateAudioRtpSender();
1795 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1796 new FakeFrameEncryptor());
1797 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1798 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1799 EXPECT_EQ(fake_frame_encryptor.get(),
1800 audio_rtp_sender_->GetFrameEncryptor().get());
1801}
1802
Benjamin Wrightc462a6e2018-10-26 20:16:161803// Validate that setting a FrameEncryptor after the send stream is stopped does
1804// nothing.
1805TEST_F(RtpSenderReceiverTest, AudioSenderCannotSetFrameEncryptorAfterStop) {
1806 CreateAudioRtpSender();
1807 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1808 new FakeFrameEncryptor());
1809 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1810 audio_rtp_sender_->Stop();
1811 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1812 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1813}
1814
Benjamin Wright84583f62018-10-04 21:22:341815// Validate that the default FrameEncryptor setting is nullptr.
1816TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetFrameDecryptor) {
1817 CreateAudioRtpReceiver();
1818 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
Tomas Gunnarssonb3517fe2022-03-18 18:32:381819 rtc::make_ref_counted<FakeFrameDecryptor>());
Benjamin Wright84583f62018-10-04 21:22:341820 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
1821 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1822 EXPECT_EQ(fake_frame_decryptor.get(),
1823 audio_rtp_receiver_->GetFrameDecryptor().get());
Tommi4ccdf9322021-05-17 12:50:101824 DestroyAudioRtpReceiver();
Benjamin Wright84583f62018-10-04 21:22:341825}
1826
Benjamin Wrightc462a6e2018-10-26 20:16:161827// Validate that the default FrameEncryptor setting is nullptr.
1828TEST_F(RtpSenderReceiverTest, AudioReceiverCannotSetFrameDecryptorAfterStop) {
1829 CreateAudioRtpReceiver();
1830 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
Tomas Gunnarssonb3517fe2022-03-18 18:32:381831 rtc::make_ref_counted<FakeFrameDecryptor>());
Benjamin Wrightc462a6e2018-10-26 20:16:161832 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
Tommi6589def2022-02-17 22:36:471833 audio_rtp_receiver_->SetMediaChannel(nullptr);
Benjamin Wrightc462a6e2018-10-26 20:16:161834 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1835 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
Tommi4ccdf9322021-05-17 12:50:101836 DestroyAudioRtpReceiver();
Benjamin Wrightc462a6e2018-10-26 20:16:161837}
1838
1839// Validate that the default FrameEncryptor setting is nullptr.
1840TEST_F(RtpSenderReceiverTest, VideoSenderCanSetFrameEncryptor) {
1841 CreateVideoRtpSender();
1842 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1843 new FakeFrameEncryptor());
1844 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1845 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1846 EXPECT_EQ(fake_frame_encryptor.get(),
1847 video_rtp_sender_->GetFrameEncryptor().get());
1848}
1849
1850// Validate that setting a FrameEncryptor after the send stream is stopped does
1851// nothing.
1852TEST_F(RtpSenderReceiverTest, VideoSenderCannotSetFrameEncryptorAfterStop) {
1853 CreateVideoRtpSender();
1854 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1855 new FakeFrameEncryptor());
1856 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1857 video_rtp_sender_->Stop();
1858 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1859 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1860}
1861
1862// Validate that the default FrameEncryptor setting is nullptr.
1863TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetFrameDecryptor) {
1864 CreateVideoRtpReceiver();
1865 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
Tomas Gunnarssonb3517fe2022-03-18 18:32:381866 rtc::make_ref_counted<FakeFrameDecryptor>());
Benjamin Wrightc462a6e2018-10-26 20:16:161867 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
1868 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1869 EXPECT_EQ(fake_frame_decryptor.get(),
1870 video_rtp_receiver_->GetFrameDecryptor().get());
Tommi4ccdf9322021-05-17 12:50:101871 DestroyVideoRtpReceiver();
Benjamin Wrightc462a6e2018-10-26 20:16:161872}
1873
1874// Validate that the default FrameEncryptor setting is nullptr.
1875TEST_F(RtpSenderReceiverTest, VideoReceiverCannotSetFrameDecryptorAfterStop) {
1876 CreateVideoRtpReceiver();
1877 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
Tomas Gunnarssonb3517fe2022-03-18 18:32:381878 rtc::make_ref_counted<FakeFrameDecryptor>());
Benjamin Wrightc462a6e2018-10-26 20:16:161879 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
Tommi6589def2022-02-17 22:36:471880 video_rtp_receiver_->SetMediaChannel(nullptr);
Benjamin Wrightc462a6e2018-10-26 20:16:161881 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1882 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
Tommi4ccdf9322021-05-17 12:50:101883 DestroyVideoRtpReceiver();
Benjamin Wrightc462a6e2018-10-26 20:16:161884}
1885
Amit Hilbuch619b2942019-02-26 23:55:191886// Checks that calling the internal methods for get/set parameters do not
1887// invalidate any parameters retreived by clients.
1888TEST_F(RtpSenderReceiverTest,
1889 InternalParameterMethodsDoNotInvalidateTransaction) {
1890 CreateVideoRtpSender();
1891 RtpParameters parameters = video_rtp_sender_->GetParameters();
1892 RtpParameters new_parameters = video_rtp_sender_->GetParametersInternal();
1893 new_parameters.encodings[0].active = false;
Florent Castelliacabb362022-10-18 15:05:161894 video_rtp_sender_->SetParametersInternal(new_parameters, nullptr, true);
Amit Hilbuch619b2942019-02-26 23:55:191895 new_parameters.encodings[0].active = true;
Florent Castelliacabb362022-10-18 15:05:161896 video_rtp_sender_->SetParametersInternal(new_parameters, nullptr, true);
Amit Hilbuch619b2942019-02-26 23:55:191897 parameters.encodings[0].active = false;
1898 EXPECT_TRUE(video_rtp_sender_->SetParameters(parameters).ok());
1899}
1900
Philipp Hanckee04c3972022-12-21 14:46:461901// Checks that the senders SetStreams eliminates duplicate stream ids.
1902TEST_F(RtpSenderReceiverTest, SenderSetStreamsEliminatesDuplicateIds) {
1903 AddVideoTrack();
1904 video_rtp_sender_ =
1905 VideoRtpSender::Create(worker_thread_, video_track_->id(), nullptr);
1906 video_rtp_sender_->SetStreams({"1", "2", "1"});
1907 EXPECT_EQ(video_rtp_sender_->stream_ids().size(), 2u);
1908}
1909
Amit Hilbuch2297d332019-02-19 20:49:221910// Helper method for syntactic sugar for accepting a vector with '{}' notation.
1911std::pair<RidList, RidList> CreatePairOfRidVectors(
1912 const std::vector<std::string>& first,
1913 const std::vector<std::string>& second) {
1914 return std::make_pair(first, second);
1915}
1916
1917// These parameters are used to test disabling simulcast layers.
1918const std::pair<RidList, RidList> kDisableSimulcastLayersParameters[] = {
1919 // Tests removing the first layer. This is a special case because
1920 // the first layer's SSRC is also the 'primary' SSRC used to associate the
1921 // parameters to the media channel.
1922 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"1"}),
1923 // Tests removing some layers.
1924 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"2", "4"}),
1925 // Tests simulcast rejected scenario all layers except first are rejected.
1926 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"2", "3", "4"}),
1927 // Tests removing all layers.
1928 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"1", "2", "3", "4"}),
1929};
1930
1931// Runs test for disabling layers on a sender without a media engine set.
1932TEST_P(RtpSenderReceiverTest, DisableSimulcastLayersWithoutMediaEngine) {
1933 auto parameter = GetParam();
1934 RunDisableSimulcastLayersWithoutMediaEngineTest(parameter.first,
1935 parameter.second);
1936}
1937
1938// Runs test for disabling layers on a sender with a media engine set.
1939TEST_P(RtpSenderReceiverTest, DisableSimulcastLayersWithMediaEngine) {
1940 auto parameter = GetParam();
1941 RunDisableSimulcastLayersWithMediaEngineTest(parameter.first,
1942 parameter.second);
1943}
1944
1945INSTANTIATE_TEST_SUITE_P(
1946 DisableSimulcastLayersInSender,
1947 RtpSenderReceiverTest,
1948 ::testing::ValuesIn(kDisableSimulcastLayersParameters));
1949
deadbeef70ab1a12015-09-28 23:53:551950} // namespace webrtc