blob: 3092e53c2de318fb41a69bf0ab49f163e16fa225 [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_(
108 webrtc::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 Alvestrand2f553702023-03-07 10:10:03122 webrtc::CryptoOptions(), webrtc::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 Alvestrand2f553702023-03-07 10:10:03125 webrtc::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(),
128 webrtc::CryptoOptions(), webrtc::AudioCodecPairId::Create());
129 video_media_receive_channel_ = media_engine_->video().CreateReceiveChannel(
130 &fake_call_, cricket::MediaConfig(), cricket::VideoOptions(),
131 webrtc::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
Zhi Huange830e682018-03-30 17:48:35165 std::unique_ptr<webrtc::RtpTransportInternal> CreateDtlsSrtpTransport() {
Mirko Bonadei317a1f02019-09-17 15:06:18166 auto dtls_srtp_transport = std::make_unique<webrtc::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_;
Danil Chapovalov83bbe912019-08-07 10:24:53518 webrtc::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_;
522 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport_;
Jonas Orelanda3aa9bd2019-04-17 05:38:40523 std::unique_ptr<webrtc::VideoBitrateAllocatorFactory>
524 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_;
Jonas Orelanded99dae2022-03-09 08:28:10543 webrtc::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
654 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track_->state());
655 EXPECT_EQ(webrtc::MediaSourceInterface::kLive,
656 video_track_->GetSource()->state());
657
658 DestroyVideoRtpReceiver();
659
660 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track_->state());
661 EXPECT_EQ(webrtc::MediaSourceInterface::kEnded,
662 video_track_->GetSource()->state());
Tommi4ccdf9322021-05-17 12:50:10663 DestroyVideoRtpReceiver();
perkjf0dcfe22016-03-10 17:32:00664}
665
Taylor Brandstetterba29c6a2016-06-27 23:30:35666// Currently no action is taken when a remote video track is disabled or
667// enabled, so there's nothing to test here, other than what is normally
668// verified in DestroyVideoRtpReceiver.
deadbeef70ab1a12015-09-28 23:53:55669TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
670 CreateVideoRtpReceiver();
671
672 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 23:53:55673 video_track_->set_enabled(true);
674
675 DestroyVideoRtpReceiver();
676}
677
Taylor Brandstetterba29c6a2016-06-27 23:30:35678// Test that the AudioRtpReceiver applies volume changes from the track source
679// to the media channel.
deadbeef70ab1a12015-09-28 23:53:55680TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
681 CreateAudioRtpReceiver();
682
Taylor Brandstetterba29c6a2016-06-27 23:30:35683 double volume;
684 audio_track_->GetSource()->SetVolume(0.5);
Tommi4ccdf9322021-05-17 12:50:10685 run_loop_.Flush();
Harald Alvestrand2f553702023-03-07 10:10:03686 EXPECT_TRUE(
687 voice_media_receive_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 23:30:35688 EXPECT_EQ(0.5, volume);
deadbeef70ab1a12015-09-28 23:53:55689
690 // Disable the audio track, this should prevent setting the volume.
deadbeef70ab1a12015-09-28 23:53:55691 audio_track_->set_enabled(false);
Tommi4ccdf9322021-05-17 12:50:10692 RTC_DCHECK_EQ(worker_thread_, run_loop_.task_queue());
693 run_loop_.Flush();
Taylor Brandstetterba29c6a2016-06-27 23:30:35694 audio_track_->GetSource()->SetVolume(0.8);
Harald Alvestrand2f553702023-03-07 10:10:03695 EXPECT_TRUE(
696 voice_media_receive_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 23:30:35697 EXPECT_EQ(0, volume);
deadbeef70ab1a12015-09-28 23:53:55698
Taylor Brandstetterba29c6a2016-06-27 23:30:35699 // When the track is enabled, the previously set volume should take effect.
deadbeef70ab1a12015-09-28 23:53:55700 audio_track_->set_enabled(true);
Tommi4ccdf9322021-05-17 12:50:10701 run_loop_.Flush();
Harald Alvestrand2f553702023-03-07 10:10:03702 EXPECT_TRUE(
703 voice_media_receive_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 23:30:35704 EXPECT_EQ(0.8, volume);
deadbeef70ab1a12015-09-28 23:53:55705
Taylor Brandstetterba29c6a2016-06-27 23:30:35706 // Try changing volume one more time.
707 audio_track_->GetSource()->SetVolume(0.9);
Tommi4ccdf9322021-05-17 12:50:10708 run_loop_.Flush();
Harald Alvestrand2f553702023-03-07 10:10:03709 EXPECT_TRUE(
710 voice_media_receive_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 23:30:35711 EXPECT_EQ(0.9, volume);
deadbeef70ab1a12015-09-28 23:53:55712
713 DestroyAudioRtpReceiver();
714}
715
Ruslan Burakov4bac79e2019-04-03 17:55:33716TEST_F(RtpSenderReceiverTest, AudioRtpReceiverDelay) {
717 CreateAudioRtpReceiver();
Harald Alvestrandc0d44d92022-12-13 12:57:24718 VerifyRtpReceiverDelayBehaviour(
Harald Alvestrand2f553702023-03-07 10:10:03719 voice_media_receive_channel()->AsVoiceReceiveChannel(),
720 audio_rtp_receiver_.get(), kAudioSsrc);
Tommi4ccdf9322021-05-17 12:50:10721 DestroyAudioRtpReceiver();
Ruslan Burakov4bac79e2019-04-03 17:55:33722}
723
724TEST_F(RtpSenderReceiverTest, VideoRtpReceiverDelay) {
725 CreateVideoRtpReceiver();
Harald Alvestrandc0d44d92022-12-13 12:57:24726 VerifyRtpReceiverDelayBehaviour(
Harald Alvestrand2f553702023-03-07 10:10:03727 video_media_receive_channel()->AsVideoReceiveChannel(),
728 video_rtp_receiver_.get(), kVideoSsrc);
Tommi4ccdf9322021-05-17 12:50:10729 DestroyVideoRtpReceiver();
Ruslan Burakov4bac79e2019-04-03 17:55:33730}
731
Taylor Brandstetterba29c6a2016-06-27 23:30:35732// Test that the media channel isn't enabled for sending if the audio sender
733// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 19:26:01734TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-11 00:26:06735 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 19:26:01736 rtc::scoped_refptr<AudioTrackInterface> track =
737 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 23:30:35738
739 // Track but no SSRC.
Niels Möllerafb246b2022-04-20 12:26:50740 EXPECT_TRUE(audio_rtp_sender_->SetTrack(track.get()));
Taylor Brandstetterba29c6a2016-06-27 23:30:35741 VerifyVoiceChannelNoInput();
742
743 // SSRC but no track.
744 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
745 audio_rtp_sender_->SetSsrc(kAudioSsrc);
746 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 19:26:01747}
748
Taylor Brandstetterba29c6a2016-06-27 23:30:35749// Test that the media channel isn't enabled for sending if the video sender
750// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 19:26:01751TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-11 00:26:06752 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 23:30:35753
754 // Track but no SSRC.
Niels Möllerafb246b2022-04-20 12:26:50755 EXPECT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
Taylor Brandstetterba29c6a2016-06-27 23:30:35756 VerifyVideoChannelNoInput();
757
758 // SSRC but no track.
759 EXPECT_TRUE(video_rtp_sender_->SetTrack(nullptr));
760 video_rtp_sender_->SetSsrc(kVideoSsrc);
761 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 19:26:01762}
763
Taylor Brandstetterba29c6a2016-06-27 23:30:35764// Test that the media channel is enabled for sending when the audio sender
765// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 19:26:01766TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
Steve Anton02ee47c2018-01-11 00:26:06767 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 19:26:01768 rtc::scoped_refptr<AudioTrackInterface> track =
769 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 23:30:35770 audio_rtp_sender_->SetSsrc(kAudioSsrc);
Niels Möllerafb246b2022-04-20 12:26:50771 audio_rtp_sender_->SetTrack(track.get());
Taylor Brandstetterba29c6a2016-06-27 23:30:35772 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 19:26:01773
Taylor Brandstetterba29c6a2016-06-27 23:30:35774 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 19:26:01775}
776
Taylor Brandstetterba29c6a2016-06-27 23:30:35777// Test that the media channel is enabled for sending when the audio sender
778// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 19:26:01779TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
Steve Anton02ee47c2018-01-11 00:26:06780 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 19:26:01781 rtc::scoped_refptr<AudioTrackInterface> track =
782 AudioTrack::Create(kAudioTrackId, nullptr);
Niels Möllerafb246b2022-04-20 12:26:50783 audio_rtp_sender_->SetTrack(track.get());
Taylor Brandstetterba29c6a2016-06-27 23:30:35784 audio_rtp_sender_->SetSsrc(kAudioSsrc);
785 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 19:26:01786
Taylor Brandstetterba29c6a2016-06-27 23:30:35787 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 19:26:01788}
789
Taylor Brandstetterba29c6a2016-06-27 23:30:35790// Test that the media channel is enabled for sending when the video sender
791// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 19:26:01792TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
nisseaf510af2016-03-21 15:20:42793 AddVideoTrack();
Steve Anton02ee47c2018-01-11 00:26:06794 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 23:30:35795 video_rtp_sender_->SetSsrc(kVideoSsrc);
Niels Möllerafb246b2022-04-20 12:26:50796 video_rtp_sender_->SetTrack(video_track_.get());
Taylor Brandstetterba29c6a2016-06-27 23:30:35797 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 19:26:01798
Taylor Brandstetterba29c6a2016-06-27 23:30:35799 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 19:26:01800}
801
Taylor Brandstetterba29c6a2016-06-27 23:30:35802// Test that the media channel is enabled for sending when the video sender
803// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 19:26:01804TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
nisseaf510af2016-03-21 15:20:42805 AddVideoTrack();
Steve Anton02ee47c2018-01-11 00:26:06806 CreateVideoRtpSenderWithNoTrack();
Niels Möllerafb246b2022-04-20 12:26:50807 video_rtp_sender_->SetTrack(video_track_.get());
Taylor Brandstetterba29c6a2016-06-27 23:30:35808 video_rtp_sender_->SetSsrc(kVideoSsrc);
809 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 19:26:01810
Taylor Brandstetterba29c6a2016-06-27 23:30:35811 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 19:26:01812}
813
Taylor Brandstetterba29c6a2016-06-27 23:30:35814// Test that the media channel stops sending when the audio sender's SSRC is set
815// to 0.
deadbeeffac06552015-11-25 19:26:01816TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 23:30:35817 CreateAudioRtpSender();
deadbeeffac06552015-11-25 19:26:01818
Taylor Brandstetterba29c6a2016-06-27 23:30:35819 audio_rtp_sender_->SetSsrc(0);
820 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 19:26:01821}
822
Taylor Brandstetterba29c6a2016-06-27 23:30:35823// Test that the media channel stops sending when the video sender's SSRC is set
824// to 0.
deadbeeffac06552015-11-25 19:26:01825TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 23:30:35826 CreateAudioRtpSender();
deadbeeffac06552015-11-25 19:26:01827
Taylor Brandstetterba29c6a2016-06-27 23:30:35828 audio_rtp_sender_->SetSsrc(0);
829 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 19:26:01830}
831
Taylor Brandstetterba29c6a2016-06-27 23:30:35832// Test that the media channel stops sending when the audio sender's track is
833// set to null.
deadbeeffac06552015-11-25 19:26:01834TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 23:30:35835 CreateAudioRtpSender();
deadbeeffac06552015-11-25 19:26:01836
Taylor Brandstetterba29c6a2016-06-27 23:30:35837 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
838 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 19:26:01839}
840
Taylor Brandstetterba29c6a2016-06-27 23:30:35841// Test that the media channel stops sending when the video sender's track is
842// set to null.
deadbeeffac06552015-11-25 19:26:01843TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 23:30:35844 CreateVideoRtpSender();
deadbeeffac06552015-11-25 19:26:01845
Taylor Brandstetterba29c6a2016-06-27 23:30:35846 video_rtp_sender_->SetSsrc(0);
847 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 19:26:01848}
849
Taylor Brandstetterba29c6a2016-06-27 23:30:35850// Test that when the audio sender's SSRC is changed, the media channel stops
851// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 19:26:01852TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 23:30:35853 CreateAudioRtpSender();
deadbeeffac06552015-11-25 19:26:01854
Taylor Brandstetterba29c6a2016-06-27 23:30:35855 audio_rtp_sender_->SetSsrc(kAudioSsrc2);
856 VerifyVoiceChannelNoInput(kAudioSsrc);
857 VerifyVoiceChannelInput(kAudioSsrc2);
deadbeeffac06552015-11-25 19:26:01858
Taylor Brandstetterba29c6a2016-06-27 23:30:35859 audio_rtp_sender_ = nullptr;
860 VerifyVoiceChannelNoInput(kAudioSsrc2);
deadbeeffac06552015-11-25 19:26:01861}
862
Taylor Brandstetterba29c6a2016-06-27 23:30:35863// Test that when the audio sender's SSRC is changed, the media channel stops
864// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 19:26:01865TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 23:30:35866 CreateVideoRtpSender();
deadbeeffac06552015-11-25 19:26:01867
Taylor Brandstetterba29c6a2016-06-27 23:30:35868 video_rtp_sender_->SetSsrc(kVideoSsrc2);
869 VerifyVideoChannelNoInput(kVideoSsrc);
870 VerifyVideoChannelInput(kVideoSsrc2);
deadbeeffac06552015-11-25 19:26:01871
Taylor Brandstetterba29c6a2016-06-27 23:30:35872 video_rtp_sender_ = nullptr;
873 VerifyVideoChannelNoInput(kVideoSsrc2);
deadbeeffac06552015-11-25 19:26:01874}
875
skvladdc1c62c2016-03-17 02:07:43876TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) {
877 CreateAudioRtpSender();
878
skvladdc1c62c2016-03-17 02:07:43879 RtpParameters params = audio_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 23:30:35880 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 23:02:36881 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-17 02:07:43882
883 DestroyAudioRtpSender();
884}
885
Florent Castelliacabb362022-10-18 15:05:16886TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParametersAsync) {
887 CreateAudioRtpSender();
888
889 RtpParameters params = audio_rtp_sender_->GetParameters();
890 EXPECT_EQ(1u, params.encodings.size());
891 absl::optional<webrtc::RTCError> result;
892 audio_rtp_sender_->SetParametersAsync(
893 params, [&result](webrtc::RTCError error) { result = error; });
894 run_loop_.Flush();
895 EXPECT_TRUE(result->ok());
896
897 DestroyAudioRtpSender();
898}
899
Florent Castelli892acf02018-10-01 20:47:20900TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParametersBeforeNegotiation) {
Amit Hilbuchea7ef2a2019-02-19 23:20:21901 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 17:31:53902 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
Florent Castelli892acf02018-10-01 20:47:20903
904 RtpParameters params = audio_rtp_sender_->GetParameters();
905 ASSERT_EQ(1u, params.encodings.size());
906 params.encodings[0].max_bitrate_bps = 90000;
907 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
908
909 params = audio_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 20:47:20910 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
Florent Castelliacabb362022-10-18 15:05:16911 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
912
913 DestroyAudioRtpSender();
914}
915
916TEST_F(RtpSenderReceiverTest,
917 AudioSenderCanSetParametersAsyncBeforeNegotiation) {
918 audio_rtp_sender_ =
919 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
920
921 absl::optional<webrtc::RTCError> result;
922 RtpParameters params = audio_rtp_sender_->GetParameters();
923 ASSERT_EQ(1u, params.encodings.size());
924 params.encodings[0].max_bitrate_bps = 90000;
925
926 audio_rtp_sender_->SetParametersAsync(
927 params, [&result](webrtc::RTCError error) { result = error; });
928 run_loop_.Flush();
929 EXPECT_TRUE(result->ok());
930
931 params = audio_rtp_sender_->GetParameters();
932 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
933
934 audio_rtp_sender_->SetParametersAsync(
935 params, [&result](webrtc::RTCError error) { result = error; });
936 run_loop_.Flush();
937 EXPECT_TRUE(result->ok());
Florent Castelli892acf02018-10-01 20:47:20938
939 DestroyAudioRtpSender();
940}
941
942TEST_F(RtpSenderReceiverTest, AudioSenderInitParametersMovedAfterNegotiation) {
943 audio_track_ = AudioTrack::Create(kAudioTrackId, nullptr);
Harald Alvestrand2f7ad282022-04-21 11:35:43944 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
Florent Castelli892acf02018-10-01 20:47:20945
Guido Urdaneta1ff16c82019-05-20 17:31:53946 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 15:06:18947 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 17:31:53948 audio_rtp_sender_ = AudioRtpSender::Create(
949 worker_thread_, audio_track_->id(), nullptr, set_streams_observer.get());
Niels Möllerafb246b2022-04-20 12:26:50950 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_.get()));
Guido Urdaneta1ff16c82019-05-20 17:31:53951 EXPECT_CALL(*set_streams_observer, OnSetStreams());
952 audio_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli892acf02018-10-01 20:47:20953
954 std::vector<RtpEncodingParameters> init_encodings(1);
955 init_encodings[0].max_bitrate_bps = 60000;
956 audio_rtp_sender_->set_init_send_encodings(init_encodings);
957
958 RtpParameters params = audio_rtp_sender_->GetParameters();
959 ASSERT_EQ(1u, params.encodings.size());
960 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
961
962 // Simulate the setLocalDescription call
963 std::vector<uint32_t> ssrcs(1, 1);
964 cricket::StreamParams stream_params =
965 cricket::CreateSimStreamParams("cname", ssrcs);
Harald Alvestrand2f553702023-03-07 10:10:03966 voice_media_send_channel()->AddSendStream(stream_params);
Harald Alvestrandc0d44d92022-12-13 12:57:24967 audio_rtp_sender_->SetMediaChannel(
Harald Alvestrand2f553702023-03-07 10:10:03968 voice_media_send_channel()->AsVoiceSendChannel());
Florent Castelli892acf02018-10-01 20:47:20969 audio_rtp_sender_->SetSsrc(1);
970
971 params = audio_rtp_sender_->GetParameters();
972 ASSERT_EQ(1u, params.encodings.size());
973 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
974
975 DestroyAudioRtpSender();
976}
977
978TEST_F(RtpSenderReceiverTest,
979 AudioSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
Amit Hilbuchea7ef2a2019-02-19 23:20:21980 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 17:31:53981 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
Florent Castelli892acf02018-10-01 20:47:20982
983 RtpParameters params;
984 RTCError result = audio_rtp_sender_->SetParameters(params);
985 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
986 DestroyAudioRtpSender();
987}
988
Florent Castellicebf50f2018-05-03 13:31:53989TEST_F(RtpSenderReceiverTest,
990 AudioSenderMustCallGetParametersBeforeSetParameters) {
991 CreateAudioRtpSender();
992
993 RtpParameters params;
994 RTCError result = audio_rtp_sender_->SetParameters(params);
995 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
996
997 DestroyAudioRtpSender();
998}
999
1000TEST_F(RtpSenderReceiverTest,
1001 AudioSenderSetParametersInvalidatesTransactionId) {
1002 CreateAudioRtpSender();
1003
1004 RtpParameters params = audio_rtp_sender_->GetParameters();
1005 EXPECT_EQ(1u, params.encodings.size());
1006 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
1007 RTCError result = audio_rtp_sender_->SetParameters(params);
1008 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1009
1010 DestroyAudioRtpSender();
1011}
1012
Florent Castelliacabb362022-10-18 15:05:161013TEST_F(RtpSenderReceiverTest,
1014 AudioSenderSetParametersAsyncInvalidatesTransactionId) {
1015 CreateAudioRtpSender();
1016
1017 RtpParameters params = audio_rtp_sender_->GetParameters();
1018 EXPECT_EQ(1u, params.encodings.size());
1019 absl::optional<webrtc::RTCError> result;
1020 audio_rtp_sender_->SetParametersAsync(
1021 params, [&result](webrtc::RTCError error) { result = error; });
1022 run_loop_.Flush();
1023 EXPECT_TRUE(result->ok());
1024 audio_rtp_sender_->SetParametersAsync(
1025 params, [&result](webrtc::RTCError error) { result = error; });
1026 run_loop_.Flush();
1027 EXPECT_EQ(RTCErrorType::INVALID_STATE, result->type());
1028
1029 DestroyAudioRtpSender();
1030}
1031
Florent Castellicebf50f2018-05-03 13:31:531032TEST_F(RtpSenderReceiverTest, AudioSenderDetectTransactionIdModification) {
1033 CreateAudioRtpSender();
1034
1035 RtpParameters params = audio_rtp_sender_->GetParameters();
1036 params.transaction_id = "";
1037 RTCError result = audio_rtp_sender_->SetParameters(params);
1038 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1039
1040 DestroyAudioRtpSender();
1041}
1042
1043TEST_F(RtpSenderReceiverTest, AudioSenderCheckTransactionIdRefresh) {
1044 CreateAudioRtpSender();
1045
1046 RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 10:53:231047 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 13:31:531048 auto saved_transaction_id = params.transaction_id;
1049 params = audio_rtp_sender_->GetParameters();
1050 EXPECT_NE(saved_transaction_id, params.transaction_id);
1051
1052 DestroyAudioRtpSender();
1053}
1054
1055TEST_F(RtpSenderReceiverTest, AudioSenderSetParametersOldValueFail) {
1056 CreateAudioRtpSender();
1057
1058 RtpParameters params = audio_rtp_sender_->GetParameters();
1059 RtpParameters second_params = audio_rtp_sender_->GetParameters();
1060
1061 RTCError result = audio_rtp_sender_->SetParameters(params);
1062 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
Seth Hampson2d2c8882018-05-16 23:02:321063 DestroyAudioRtpSender();
1064}
1065
1066TEST_F(RtpSenderReceiverTest, AudioSenderCantSetUnimplementedRtpParameters) {
1067 CreateAudioRtpSender();
1068 RtpParameters params = audio_rtp_sender_->GetParameters();
1069 EXPECT_EQ(1u, params.encodings.size());
1070
Florent Castelli87b3c512018-07-18 14:00:281071 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 23:02:321072 params.mid = "dummy_mid";
1073 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1074 audio_rtp_sender_->SetParameters(params).type());
1075 params = audio_rtp_sender_->GetParameters();
1076
Seth Hampson2d2c8882018-05-16 23:02:321077 DestroyAudioRtpSender();
1078}
1079
Taylor Brandstetterba29c6a2016-06-27 23:30:351080TEST_F(RtpSenderReceiverTest, SetAudioMaxSendBitrate) {
1081 CreateAudioRtpSender();
1082
Harald Alvestrand2f553702023-03-07 10:10:031083 EXPECT_EQ(-1, voice_media_send_channel()->max_bps());
Taylor Brandstetterba29c6a2016-06-27 23:30:351084 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 10:53:231085 EXPECT_EQ(1U, params.encodings.size());
deadbeefe702b302017-02-04 20:09:011086 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 09:54:271087 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 23:02:361088 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 23:30:351089
1090 // Read back the parameters and verify they have been changed.
1091 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 10:53:231092 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 09:54:271093 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 23:30:351094
1095 // Verify that the audio channel received the new parameters.
Harald Alvestrand2f553702023-03-07 10:10:031096 params = voice_media_send_channel()->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 10:53:231097 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 09:54:271098 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 23:30:351099
1100 // Verify that the global bitrate limit has not been changed.
Harald Alvestrand2f553702023-03-07 10:10:031101 EXPECT_EQ(-1, voice_media_send_channel()->max_bps());
Taylor Brandstetterba29c6a2016-06-27 23:30:351102
1103 DestroyAudioRtpSender();
1104}
1105
Seth Hampson24722b32017-12-22 17:36:421106TEST_F(RtpSenderReceiverTest, SetAudioBitratePriority) {
1107 CreateAudioRtpSender();
1108
1109 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 10:53:231110 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 17:36:421111 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1112 params.encodings[0].bitrate_priority);
1113 double new_bitrate_priority = 2.0;
1114 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 23:02:361115 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 17:36:421116
1117 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 10:53:231118 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 17:36:421119 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1120
Harald Alvestrand2f553702023-03-07 10:10:031121 params = voice_media_send_channel()->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 10:53:231122 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 17:36:421123 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1124
1125 DestroyAudioRtpSender();
1126}
1127
skvladdc1c62c2016-03-17 02:07:431128TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) {
1129 CreateVideoRtpSender();
1130
skvladdc1c62c2016-03-17 02:07:431131 RtpParameters params = video_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 23:30:351132 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 23:02:361133 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-17 02:07:431134
1135 DestroyVideoRtpSender();
1136}
1137
Florent Castelliacabb362022-10-18 15:05:161138TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParametersAsync) {
1139 CreateVideoRtpSender();
1140
1141 RtpParameters params = video_rtp_sender_->GetParameters();
1142 EXPECT_EQ(1u, params.encodings.size());
1143 absl::optional<webrtc::RTCError> result;
1144 video_rtp_sender_->SetParametersAsync(
1145 params, [&result](webrtc::RTCError error) { result = error; });
1146 run_loop_.Flush();
1147 EXPECT_TRUE(result->ok());
1148
1149 DestroyVideoRtpSender();
1150}
1151
Florent Castelli892acf02018-10-01 20:47:201152TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParametersBeforeNegotiation) {
Guido Urdaneta1ff16c82019-05-20 17:31:531153 video_rtp_sender_ =
1154 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Florent Castelli892acf02018-10-01 20:47:201155
1156 RtpParameters params = video_rtp_sender_->GetParameters();
1157 ASSERT_EQ(1u, params.encodings.size());
1158 params.encodings[0].max_bitrate_bps = 90000;
1159 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1160
1161 params = video_rtp_sender_->GetParameters();
1162 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1163 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
1164
1165 DestroyVideoRtpSender();
1166}
1167
Florent Castelliacabb362022-10-18 15:05:161168TEST_F(RtpSenderReceiverTest,
1169 VideoSenderCanSetParametersAsyncBeforeNegotiation) {
1170 video_rtp_sender_ =
1171 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
1172
1173 absl::optional<webrtc::RTCError> result;
1174 RtpParameters params = video_rtp_sender_->GetParameters();
1175 ASSERT_EQ(1u, params.encodings.size());
1176 params.encodings[0].max_bitrate_bps = 90000;
1177 video_rtp_sender_->SetParametersAsync(
1178 params, [&result](webrtc::RTCError error) { result = error; });
1179 run_loop_.Flush();
1180 EXPECT_TRUE(result->ok());
1181
1182 params = video_rtp_sender_->GetParameters();
1183 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
1184 video_rtp_sender_->SetParametersAsync(
1185 params, [&result](webrtc::RTCError error) { result = error; });
1186 run_loop_.Flush();
1187 EXPECT_TRUE(result->ok());
1188
1189 DestroyVideoRtpSender();
1190}
1191
Florent Castelli892acf02018-10-01 20:47:201192TEST_F(RtpSenderReceiverTest, VideoSenderInitParametersMovedAfterNegotiation) {
1193 AddVideoTrack(false);
1194
Guido Urdaneta1ff16c82019-05-20 17:31:531195 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 15:06:181196 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 17:31:531197 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1198 set_streams_observer.get());
Niels Möllerafb246b2022-04-20 12:26:501199 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
Guido Urdaneta1ff16c82019-05-20 17:31:531200 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1201 video_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli892acf02018-10-01 20:47:201202
1203 std::vector<RtpEncodingParameters> init_encodings(2);
1204 init_encodings[0].max_bitrate_bps = 60000;
1205 init_encodings[1].max_bitrate_bps = 900000;
1206 video_rtp_sender_->set_init_send_encodings(init_encodings);
1207
1208 RtpParameters params = video_rtp_sender_->GetParameters();
1209 ASSERT_EQ(2u, params.encodings.size());
1210 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1211 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
1212
1213 // Simulate the setLocalDescription call
1214 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 09:11:531215 ssrcs.reserve(2);
Florent Castelli892acf02018-10-01 20:47:201216 for (int i = 0; i < 2; ++i)
1217 ssrcs.push_back(kVideoSsrcSimulcast + i);
1218 cricket::StreamParams stream_params =
1219 cricket::CreateSimStreamParams("cname", ssrcs);
Harald Alvestrand2f553702023-03-07 10:10:031220 video_media_send_channel()->AddSendStream(stream_params);
Harald Alvestrandc0d44d92022-12-13 12:57:241221 video_rtp_sender_->SetMediaChannel(
Harald Alvestrand2f553702023-03-07 10:10:031222 video_media_send_channel()->AsVideoSendChannel());
Florent Castelli892acf02018-10-01 20:47:201223 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
1224
1225 params = video_rtp_sender_->GetParameters();
1226 ASSERT_EQ(2u, params.encodings.size());
1227 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1228 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
1229
1230 DestroyVideoRtpSender();
1231}
1232
1233TEST_F(RtpSenderReceiverTest,
1234 VideoSenderInitParametersMovedAfterManualSimulcastAndNegotiation) {
1235 AddVideoTrack(false);
1236
Guido Urdaneta1ff16c82019-05-20 17:31:531237 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 15:06:181238 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 17:31:531239 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1240 set_streams_observer.get());
Niels Möllerafb246b2022-04-20 12:26:501241 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
Guido Urdaneta1ff16c82019-05-20 17:31:531242 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1243 video_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli892acf02018-10-01 20:47:201244
1245 std::vector<RtpEncodingParameters> init_encodings(1);
1246 init_encodings[0].max_bitrate_bps = 60000;
1247 video_rtp_sender_->set_init_send_encodings(init_encodings);
1248
1249 RtpParameters params = video_rtp_sender_->GetParameters();
1250 ASSERT_EQ(1u, params.encodings.size());
1251 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1252
1253 // Simulate the setLocalDescription call as if the user used SDP munging
1254 // to enable simulcast
1255 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 09:11:531256 ssrcs.reserve(2);
Florent Castelli892acf02018-10-01 20:47:201257 for (int i = 0; i < 2; ++i)
1258 ssrcs.push_back(kVideoSsrcSimulcast + i);
1259 cricket::StreamParams stream_params =
1260 cricket::CreateSimStreamParams("cname", ssrcs);
Harald Alvestrand2f553702023-03-07 10:10:031261 video_media_send_channel()->AddSendStream(stream_params);
Harald Alvestrandc0d44d92022-12-13 12:57:241262 video_rtp_sender_->SetMediaChannel(
Harald Alvestrand2f553702023-03-07 10:10:031263 video_media_send_channel()->AsVideoSendChannel());
Florent Castelli892acf02018-10-01 20:47:201264 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
1265
1266 params = video_rtp_sender_->GetParameters();
1267 ASSERT_EQ(2u, params.encodings.size());
1268 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1269
1270 DestroyVideoRtpSender();
1271}
1272
Harald Alvestrand3fe8b0d2022-07-01 07:36:591273#if GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
1274using RtpSenderReceiverDeathTest = RtpSenderReceiverTest;
1275
1276TEST_F(RtpSenderReceiverDeathTest,
1277 VideoSenderManualRemoveSimulcastFailsDeathTest) {
1278 AddVideoTrack(false);
1279
1280 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
1281 std::make_unique<MockSetStreamsObserver>();
1282 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1283 set_streams_observer.get());
1284 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
1285 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1286 video_rtp_sender_->SetStreams({local_stream_->id()});
1287
1288 std::vector<RtpEncodingParameters> init_encodings(2);
1289 init_encodings[0].max_bitrate_bps = 60000;
1290 init_encodings[1].max_bitrate_bps = 120000;
1291 video_rtp_sender_->set_init_send_encodings(init_encodings);
1292
1293 RtpParameters params = video_rtp_sender_->GetParameters();
1294 ASSERT_EQ(2u, params.encodings.size());
1295 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1296
1297 // Simulate the setLocalDescription call as if the user used SDP munging
1298 // to disable simulcast.
1299 std::vector<uint32_t> ssrcs;
1300 ssrcs.reserve(2);
1301 for (int i = 0; i < 2; ++i)
1302 ssrcs.push_back(kVideoSsrcSimulcast + i);
1303 cricket::StreamParams stream_params =
1304 cricket::StreamParams::CreateLegacy(kVideoSsrc);
Harald Alvestrand2f553702023-03-07 10:10:031305 video_media_send_channel()->AddSendStream(stream_params);
Harald Alvestrandc0d44d92022-12-13 12:57:241306 video_rtp_sender_->SetMediaChannel(
Harald Alvestrand2f553702023-03-07 10:10:031307 video_media_send_channel()->AsVideoSendChannel());
Harald Alvestrand3fe8b0d2022-07-01 07:36:591308 EXPECT_DEATH(video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast), "");
1309}
1310#endif
1311
Florent Castelli892acf02018-10-01 20:47:201312TEST_F(RtpSenderReceiverTest,
1313 VideoSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
Guido Urdaneta1ff16c82019-05-20 17:31:531314 video_rtp_sender_ =
1315 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Florent Castelli892acf02018-10-01 20:47:201316
1317 RtpParameters params;
1318 RTCError result = video_rtp_sender_->SetParameters(params);
1319 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1320 DestroyVideoRtpSender();
1321}
1322
Florent Castellicebf50f2018-05-03 13:31:531323TEST_F(RtpSenderReceiverTest,
1324 VideoSenderMustCallGetParametersBeforeSetParameters) {
1325 CreateVideoRtpSender();
1326
1327 RtpParameters params;
1328 RTCError result = video_rtp_sender_->SetParameters(params);
1329 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1330
1331 DestroyVideoRtpSender();
1332}
1333
1334TEST_F(RtpSenderReceiverTest,
1335 VideoSenderSetParametersInvalidatesTransactionId) {
1336 CreateVideoRtpSender();
1337
1338 RtpParameters params = video_rtp_sender_->GetParameters();
1339 EXPECT_EQ(1u, params.encodings.size());
1340 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1341 RTCError result = video_rtp_sender_->SetParameters(params);
1342 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1343
1344 DestroyVideoRtpSender();
1345}
1346
Florent Castelliacabb362022-10-18 15:05:161347TEST_F(RtpSenderReceiverTest,
1348 VideoSenderSetParametersAsyncInvalidatesTransactionId) {
1349 CreateVideoRtpSender();
1350
1351 RtpParameters params = video_rtp_sender_->GetParameters();
1352 EXPECT_EQ(1u, params.encodings.size());
1353 absl::optional<webrtc::RTCError> result;
1354 video_rtp_sender_->SetParametersAsync(
1355 params, [&result](webrtc::RTCError error) { result = error; });
1356 run_loop_.Flush();
1357 EXPECT_TRUE(result->ok());
1358 video_rtp_sender_->SetParametersAsync(
1359 params, [&result](webrtc::RTCError error) { result = error; });
1360 run_loop_.Flush();
1361 EXPECT_EQ(RTCErrorType::INVALID_STATE, result->type());
1362
1363 DestroyVideoRtpSender();
1364}
1365
Florent Castellicebf50f2018-05-03 13:31:531366TEST_F(RtpSenderReceiverTest, VideoSenderDetectTransactionIdModification) {
1367 CreateVideoRtpSender();
1368
1369 RtpParameters params = video_rtp_sender_->GetParameters();
1370 params.transaction_id = "";
1371 RTCError result = video_rtp_sender_->SetParameters(params);
1372 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1373
1374 DestroyVideoRtpSender();
1375}
1376
1377TEST_F(RtpSenderReceiverTest, VideoSenderCheckTransactionIdRefresh) {
1378 CreateVideoRtpSender();
1379
1380 RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 10:53:231381 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 13:31:531382 auto saved_transaction_id = params.transaction_id;
1383 params = video_rtp_sender_->GetParameters();
1384 EXPECT_NE(saved_transaction_id, params.transaction_id);
1385
1386 DestroyVideoRtpSender();
1387}
1388
1389TEST_F(RtpSenderReceiverTest, VideoSenderSetParametersOldValueFail) {
1390 CreateVideoRtpSender();
1391
1392 RtpParameters params = video_rtp_sender_->GetParameters();
1393 RtpParameters second_params = video_rtp_sender_->GetParameters();
1394
1395 RTCError result = video_rtp_sender_->SetParameters(params);
1396 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1397
1398 DestroyVideoRtpSender();
1399}
1400
Seth Hampson2d2c8882018-05-16 23:02:321401TEST_F(RtpSenderReceiverTest, VideoSenderCantSetUnimplementedRtpParameters) {
1402 CreateVideoRtpSender();
1403 RtpParameters params = video_rtp_sender_->GetParameters();
1404 EXPECT_EQ(1u, params.encodings.size());
1405
Florent Castelli87b3c512018-07-18 14:00:281406 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 23:02:321407 params.mid = "dummy_mid";
1408 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1409 video_rtp_sender_->SetParameters(params).type());
1410 params = video_rtp_sender_->GetParameters();
1411
Seth Hampson2d2c8882018-05-16 23:02:321412 DestroyVideoRtpSender();
1413}
1414
Florent Castellic1a0bcb2019-01-29 13:26:481415TEST_F(RtpSenderReceiverTest, VideoSenderCanSetScaleResolutionDownBy) {
1416 CreateVideoRtpSender();
1417
1418 RtpParameters params = video_rtp_sender_->GetParameters();
1419 params.encodings[0].scale_resolution_down_by = 2;
1420
1421 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1422 params = video_rtp_sender_->GetParameters();
1423 EXPECT_EQ(2, params.encodings[0].scale_resolution_down_by);
1424
1425 DestroyVideoRtpSender();
1426}
1427
1428TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidScaleResolutionDownBy) {
1429 CreateVideoRtpSender();
1430
1431 RtpParameters params = video_rtp_sender_->GetParameters();
1432 params.encodings[0].scale_resolution_down_by = 0.5;
1433 RTCError result = video_rtp_sender_->SetParameters(params);
1434 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1435
1436 DestroyVideoRtpSender();
1437}
1438
Ă…sa Perssonfb195962021-08-16 14:41:561439TEST_F(RtpSenderReceiverTest, VideoSenderCanSetNumTemporalLayers) {
1440 CreateVideoRtpSender();
1441
1442 RtpParameters params = video_rtp_sender_->GetParameters();
1443 params.encodings[0].num_temporal_layers = 2;
1444
1445 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1446 params = video_rtp_sender_->GetParameters();
1447 EXPECT_EQ(2, params.encodings[0].num_temporal_layers);
1448
1449 DestroyVideoRtpSender();
1450}
1451
1452TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidNumTemporalLayers) {
1453 CreateVideoRtpSender();
1454
1455 RtpParameters params = video_rtp_sender_->GetParameters();
1456 params.encodings[0].num_temporal_layers = webrtc::kMaxTemporalStreams + 1;
1457 RTCError result = video_rtp_sender_->SetParameters(params);
1458 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1459
1460 DestroyVideoRtpSender();
1461}
1462
Florent Castelli907dc802019-12-06 14:03:191463TEST_F(RtpSenderReceiverTest, VideoSenderCanSetMaxFramerate) {
1464 CreateVideoRtpSender();
1465
1466 RtpParameters params = video_rtp_sender_->GetParameters();
1467 params.encodings[0].max_framerate = 20;
1468
1469 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1470 params = video_rtp_sender_->GetParameters();
1471 EXPECT_EQ(20., params.encodings[0].max_framerate);
1472
1473 DestroyVideoRtpSender();
1474}
1475
1476TEST_F(RtpSenderReceiverTest, VideoSenderCanSetMaxFramerateZero) {
1477 CreateVideoRtpSender();
1478
1479 RtpParameters params = video_rtp_sender_->GetParameters();
1480 params.encodings[0].max_framerate = 0.;
1481
1482 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1483 params = video_rtp_sender_->GetParameters();
1484 EXPECT_EQ(0., params.encodings[0].max_framerate);
1485
1486 DestroyVideoRtpSender();
1487}
1488
1489TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidMaxFramerate) {
1490 CreateVideoRtpSender();
1491
1492 RtpParameters params = video_rtp_sender_->GetParameters();
1493 params.encodings[0].max_framerate = -5.;
1494 RTCError result = video_rtp_sender_->SetParameters(params);
1495 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1496
1497 DestroyVideoRtpSender();
1498}
1499
Seth Hampson2d2c8882018-05-16 23:02:321500// A video sender can have multiple simulcast layers, in which case it will
1501// contain multiple RtpEncodingParameters. This tests that if this is the case
1502// (simulcast), then we can't set the bitrate_priority, or max_bitrate_bps
1503// for any encodings besides at index 0, because these are both implemented
1504// "per-sender."
1505TEST_F(RtpSenderReceiverTest, VideoSenderCantSetPerSenderEncodingParameters) {
1506 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 20:47:201507 CreateVideoRtpSenderWithSimulcast();
Seth Hampson2d2c8882018-05-16 23:02:321508 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 20:47:201509 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Seth Hampson2d2c8882018-05-16 23:02:321510
1511 params.encodings[1].bitrate_priority = 2.0;
1512 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1513 video_rtp_sender_->SetParameters(params).type());
1514 params = video_rtp_sender_->GetParameters();
1515
Seth Hampson2d2c8882018-05-16 23:02:321516 DestroyVideoRtpSender();
1517}
1518
Florent Castelli892acf02018-10-01 20:47:201519TEST_F(RtpSenderReceiverTest, VideoSenderCantSetReadOnlyEncodingParameters) {
1520 // Add a simulcast specific send stream that contains 2 encoding parameters.
1521 CreateVideoRtpSenderWithSimulcast();
1522 RtpParameters params = video_rtp_sender_->GetParameters();
1523 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
1524
1525 for (size_t i = 0; i < params.encodings.size(); i++) {
1526 params.encodings[i].ssrc = 1337;
1527 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION,
1528 video_rtp_sender_->SetParameters(params).type());
1529 params = video_rtp_sender_->GetParameters();
1530 }
1531
1532 DestroyVideoRtpSender();
1533}
1534
Ă…sa Persson55659812018-06-18 15:51:321535TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrate) {
Taylor Brandstetterba29c6a2016-06-27 23:30:351536 CreateVideoRtpSender();
1537
Harald Alvestrand2f553702023-03-07 10:10:031538 EXPECT_EQ(-1, video_media_send_channel()->max_bps());
Taylor Brandstetterba29c6a2016-06-27 23:30:351539 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 10:53:231540 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 15:51:321541 EXPECT_FALSE(params.encodings[0].min_bitrate_bps);
deadbeefe702b302017-02-04 20:09:011542 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Ă…sa Persson55659812018-06-18 15:51:321543 params.encodings[0].min_bitrate_bps = 100;
Oskar Sundbom36f8f3e2017-11-16 09:54:271544 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 23:02:361545 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 23:30:351546
1547 // Read back the parameters and verify they have been changed.
1548 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 10:53:231549 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 15:51:321550 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 09:54:271551 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 23:30:351552
1553 // Verify that the video channel received the new parameters.
Harald Alvestrand2f553702023-03-07 10:10:031554 params = video_media_send_channel()->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 10:53:231555 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 15:51:321556 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 09:54:271557 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 23:30:351558
1559 // Verify that the global bitrate limit has not been changed.
Harald Alvestrand2f553702023-03-07 10:10:031560 EXPECT_EQ(-1, video_media_send_channel()->max_bps());
Taylor Brandstetterba29c6a2016-06-27 23:30:351561
1562 DestroyVideoRtpSender();
1563}
1564
Ă…sa Persson55659812018-06-18 15:51:321565TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrateSimulcast) {
1566 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 20:47:201567 CreateVideoRtpSenderWithSimulcast();
Ă…sa Persson55659812018-06-18 15:51:321568
1569 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 20:47:201570 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 15:51:321571 params.encodings[0].min_bitrate_bps = 100;
1572 params.encodings[0].max_bitrate_bps = 1000;
1573 params.encodings[1].min_bitrate_bps = 200;
1574 params.encodings[1].max_bitrate_bps = 2000;
1575 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1576
1577 // Verify that the video channel received the new parameters.
Harald Alvestrand2f553702023-03-07 10:10:031578 params =
1579 video_media_send_channel()->GetRtpSendParameters(kVideoSsrcSimulcast);
Florent Castelli892acf02018-10-01 20:47:201580 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 15:51:321581 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
1582 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
1583 EXPECT_EQ(200, params.encodings[1].min_bitrate_bps);
1584 EXPECT_EQ(2000, params.encodings[1].max_bitrate_bps);
1585
1586 DestroyVideoRtpSender();
1587}
1588
Seth Hampson24722b32017-12-22 17:36:421589TEST_F(RtpSenderReceiverTest, SetVideoBitratePriority) {
1590 CreateVideoRtpSender();
1591
1592 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 10:53:231593 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 17:36:421594 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1595 params.encodings[0].bitrate_priority);
1596 double new_bitrate_priority = 2.0;
1597 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 23:02:361598 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 17:36:421599
1600 params = video_rtp_sender_->GetParameters();
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
Harald Alvestrand2f553702023-03-07 10:10:031604 params = video_media_send_channel()->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 10:53:231605 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 17:36:421606 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1607
1608 DestroyVideoRtpSender();
1609}
1610
Florent Castelli38332cd2018-11-20 13:08:061611TEST_F(RtpSenderReceiverTest, VideoReceiverCanGetParametersWithSimulcast) {
1612 CreateVideoRtpReceiverWithSimulcast({}, 2);
1613
1614 RtpParameters params = video_rtp_receiver_->GetParameters();
1615 EXPECT_EQ(2u, params.encodings.size());
1616
1617 DestroyVideoRtpReceiver();
1618}
1619
Philipp Hanckeb83cd922022-11-09 10:06:381620TEST_F(RtpSenderReceiverTest, GenerateKeyFrameWithAudio) {
1621 CreateAudioRtpSender();
1622
1623 auto error = audio_rtp_sender_->GenerateKeyFrame({});
1624 EXPECT_FALSE(error.ok());
1625 EXPECT_EQ(error.type(), RTCErrorType::UNSUPPORTED_OPERATION);
1626
1627 DestroyAudioRtpSender();
1628}
1629
1630TEST_F(RtpSenderReceiverTest, GenerateKeyFrameWithVideo) {
1631 CreateVideoRtpSenderWithSimulcast({"1", "2", "3"});
1632
1633 auto error = video_rtp_sender_->GenerateKeyFrame({});
1634 EXPECT_TRUE(error.ok());
1635
1636 error = video_rtp_sender_->GenerateKeyFrame({"1"});
1637 EXPECT_TRUE(error.ok());
1638
1639 error = video_rtp_sender_->GenerateKeyFrame({""});
1640 EXPECT_FALSE(error.ok());
1641 EXPECT_EQ(error.type(), RTCErrorType::INVALID_PARAMETER);
1642
1643 error = video_rtp_sender_->GenerateKeyFrame({"no-such-rid"});
1644 EXPECT_FALSE(error.ok());
1645 EXPECT_EQ(error.type(), RTCErrorType::INVALID_PARAMETER);
1646
1647 DestroyVideoRtpSender();
1648}
1649
pbos5214a0a2016-12-16 23:39:111650// Test that makes sure that a video track content hint translates to the proper
1651// value for sources that are not screencast.
1652TEST_F(RtpSenderReceiverTest, PropagatesVideoTrackContentHint) {
1653 CreateVideoRtpSender();
1654
1655 video_track_->set_enabled(true);
1656
Artem Titov880fa812021-07-30 20:30:231657 // `video_track_` is not screencast by default.
Harald Alvestrand2f553702023-03-07 10:10:031658 EXPECT_EQ(false, video_media_send_channel()->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111659 // No content hint should be set by default.
1660 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1661 video_track_->content_hint());
1662 // Setting detailed should turn a non-screencast source into screencast mode.
1663 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Harald Alvestrand2f553702023-03-07 10:10:031664 EXPECT_EQ(true, video_media_send_channel()->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111665 // Removing the content hint should turn the track back into non-screencast
1666 // mode.
1667 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Harald Alvestrand2f553702023-03-07 10:10:031668 EXPECT_EQ(false, video_media_send_channel()->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111669 // Setting fluid should remain in non-screencast mode (its default).
1670 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Harald Alvestrand2f553702023-03-07 10:10:031671 EXPECT_EQ(false, video_media_send_channel()->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 06:53:101672 // Setting text should have the same effect as Detailed
1673 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
Harald Alvestrand2f553702023-03-07 10:10:031674 EXPECT_EQ(true, video_media_send_channel()->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111675
1676 DestroyVideoRtpSender();
1677}
1678
1679// Test that makes sure that a video track content hint translates to the proper
1680// value for screencast sources.
1681TEST_F(RtpSenderReceiverTest,
1682 PropagatesVideoTrackContentHintForScreencastSource) {
1683 CreateVideoRtpSender(true);
1684
1685 video_track_->set_enabled(true);
1686
Artem Titov880fa812021-07-30 20:30:231687 // `video_track_` with a screencast source should be screencast by default.
Harald Alvestrand2f553702023-03-07 10:10:031688 EXPECT_EQ(true, video_media_send_channel()->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111689 // No content hint should be set by default.
1690 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1691 video_track_->content_hint());
1692 // Setting fluid should turn a screencast source into non-screencast mode.
1693 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Harald Alvestrand2f553702023-03-07 10:10:031694 EXPECT_EQ(false, video_media_send_channel()->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111695 // Removing the content hint should turn the track back into screencast mode.
1696 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Harald Alvestrand2f553702023-03-07 10:10:031697 EXPECT_EQ(true, video_media_send_channel()->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111698 // Setting detailed should still remain in screencast mode (its default).
1699 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Harald Alvestrand2f553702023-03-07 10:10:031700 EXPECT_EQ(true, video_media_send_channel()->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 06:53:101701 // Setting text should have the same effect as Detailed
1702 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
Harald Alvestrand2f553702023-03-07 10:10:031703 EXPECT_EQ(true, video_media_send_channel()->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111704
1705 DestroyVideoRtpSender();
1706}
1707
1708// Test that makes sure any content hints that are set on a track before
1709// VideoRtpSender is ready to send are still applied when it gets ready to send.
1710TEST_F(RtpSenderReceiverTest,
1711 PropagatesVideoTrackContentHintSetBeforeEnabling) {
1712 AddVideoTrack();
Guido Urdaneta1ff16c82019-05-20 17:31:531713 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 15:06:181714 std::make_unique<MockSetStreamsObserver>();
pbos5214a0a2016-12-16 23:39:111715 // Setting detailed overrides the default non-screencast mode. This should be
1716 // applied even if the track is set on construction.
1717 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Guido Urdaneta1ff16c82019-05-20 17:31:531718 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1719 set_streams_observer.get());
Niels Möllerafb246b2022-04-20 12:26:501720 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
Guido Urdaneta1ff16c82019-05-20 17:31:531721 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1722 video_rtp_sender_->SetStreams({local_stream_->id()});
Harald Alvestrandc0d44d92022-12-13 12:57:241723 video_rtp_sender_->SetMediaChannel(
Harald Alvestrand2f553702023-03-07 10:10:031724 video_media_send_channel()->AsVideoSendChannel());
pbos5214a0a2016-12-16 23:39:111725 video_track_->set_enabled(true);
1726
1727 // Sender is not ready to send (no SSRC) so no option should have been set.
Harald Alvestrand2f553702023-03-07 10:10:031728 EXPECT_EQ(absl::nullopt, video_media_send_channel()->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111729
1730 // Verify that the content hint is accounted for when video_rtp_sender_ does
1731 // get enabled.
1732 video_rtp_sender_->SetSsrc(kVideoSsrc);
Harald Alvestrand2f553702023-03-07 10:10:031733 EXPECT_EQ(true, video_media_send_channel()->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111734
1735 // And removing the hint should go back to false (to verify that false was
1736 // default correctly).
1737 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Harald Alvestrand2f553702023-03-07 10:10:031738 EXPECT_EQ(false, video_media_send_channel()->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111739
1740 DestroyVideoRtpSender();
1741}
1742
deadbeef20cb0c12017-02-02 04:27:001743TEST_F(RtpSenderReceiverTest, AudioSenderHasDtmfSender) {
1744 CreateAudioRtpSender();
1745 EXPECT_NE(nullptr, audio_rtp_sender_->GetDtmfSender());
1746}
1747
1748TEST_F(RtpSenderReceiverTest, VideoSenderDoesNotHaveDtmfSender) {
1749 CreateVideoRtpSender();
1750 EXPECT_EQ(nullptr, video_rtp_sender_->GetDtmfSender());
1751}
1752
Artem Titov880fa812021-07-30 20:30:231753// Test that the DTMF sender is really using `voice_channel_`, and thus returns
1754// true/false from CanSendDtmf based on what `voice_channel_` returns.
deadbeef20cb0c12017-02-02 04:27:001755TEST_F(RtpSenderReceiverTest, CanInsertDtmf) {
1756 AddDtmfCodec();
1757 CreateAudioRtpSender();
1758 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1759 ASSERT_NE(nullptr, dtmf_sender);
1760 EXPECT_TRUE(dtmf_sender->CanInsertDtmf());
1761}
1762
1763TEST_F(RtpSenderReceiverTest, CanNotInsertDtmf) {
1764 CreateAudioRtpSender();
1765 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1766 ASSERT_NE(nullptr, dtmf_sender);
1767 // DTMF codec has not been added, as it was in the above test.
1768 EXPECT_FALSE(dtmf_sender->CanInsertDtmf());
1769}
1770
1771TEST_F(RtpSenderReceiverTest, InsertDtmf) {
1772 AddDtmfCodec();
1773 CreateAudioRtpSender();
1774 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1775 ASSERT_NE(nullptr, dtmf_sender);
1776
Harald Alvestrand2f553702023-03-07 10:10:031777 EXPECT_EQ(0U, voice_media_send_channel()->dtmf_info_queue().size());
deadbeef20cb0c12017-02-02 04:27:001778
1779 // Insert DTMF
1780 const int expected_duration = 90;
1781 dtmf_sender->InsertDtmf("012", expected_duration, 100);
1782
1783 // Verify
Harald Alvestrand2f553702023-03-07 10:10:031784 ASSERT_EQ_WAIT(3U, voice_media_send_channel()->dtmf_info_queue().size(),
deadbeef20cb0c12017-02-02 04:27:001785 kDefaultTimeout);
1786 const uint32_t send_ssrc =
Harald Alvestrand2f553702023-03-07 10:10:031787 voice_media_send_channel()->send_streams()[0].first_ssrc();
1788 EXPECT_TRUE(CompareDtmfInfo(voice_media_send_channel()->dtmf_info_queue()[0],
deadbeef20cb0c12017-02-02 04:27:001789 send_ssrc, 0, expected_duration));
Harald Alvestrand2f553702023-03-07 10:10:031790 EXPECT_TRUE(CompareDtmfInfo(voice_media_send_channel()->dtmf_info_queue()[1],
deadbeef20cb0c12017-02-02 04:27:001791 send_ssrc, 1, expected_duration));
Harald Alvestrand2f553702023-03-07 10:10:031792 EXPECT_TRUE(CompareDtmfInfo(voice_media_send_channel()->dtmf_info_queue()[2],
deadbeef20cb0c12017-02-02 04:27:001793 send_ssrc, 2, expected_duration));
1794}
1795
Benjamin Wright84583f62018-10-04 21:22:341796// Validate that the default FrameEncryptor setting is nullptr.
1797TEST_F(RtpSenderReceiverTest, AudioSenderCanSetFrameEncryptor) {
1798 CreateAudioRtpSender();
1799 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1800 new FakeFrameEncryptor());
1801 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1802 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1803 EXPECT_EQ(fake_frame_encryptor.get(),
1804 audio_rtp_sender_->GetFrameEncryptor().get());
1805}
1806
Benjamin Wrightc462a6e2018-10-26 20:16:161807// Validate that setting a FrameEncryptor after the send stream is stopped does
1808// nothing.
1809TEST_F(RtpSenderReceiverTest, AudioSenderCannotSetFrameEncryptorAfterStop) {
1810 CreateAudioRtpSender();
1811 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1812 new FakeFrameEncryptor());
1813 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1814 audio_rtp_sender_->Stop();
1815 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1816 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1817}
1818
Benjamin Wright84583f62018-10-04 21:22:341819// Validate that the default FrameEncryptor setting is nullptr.
1820TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetFrameDecryptor) {
1821 CreateAudioRtpReceiver();
1822 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
Tomas Gunnarssonb3517fe2022-03-18 18:32:381823 rtc::make_ref_counted<FakeFrameDecryptor>());
Benjamin Wright84583f62018-10-04 21:22:341824 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
1825 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1826 EXPECT_EQ(fake_frame_decryptor.get(),
1827 audio_rtp_receiver_->GetFrameDecryptor().get());
Tommi4ccdf9322021-05-17 12:50:101828 DestroyAudioRtpReceiver();
Benjamin Wright84583f62018-10-04 21:22:341829}
1830
Benjamin Wrightc462a6e2018-10-26 20:16:161831// Validate that the default FrameEncryptor setting is nullptr.
1832TEST_F(RtpSenderReceiverTest, AudioReceiverCannotSetFrameDecryptorAfterStop) {
1833 CreateAudioRtpReceiver();
1834 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
Tomas Gunnarssonb3517fe2022-03-18 18:32:381835 rtc::make_ref_counted<FakeFrameDecryptor>());
Benjamin Wrightc462a6e2018-10-26 20:16:161836 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
Tommi6589def2022-02-17 22:36:471837 audio_rtp_receiver_->SetMediaChannel(nullptr);
Benjamin Wrightc462a6e2018-10-26 20:16:161838 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1839 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
Tommi4ccdf9322021-05-17 12:50:101840 DestroyAudioRtpReceiver();
Benjamin Wrightc462a6e2018-10-26 20:16:161841}
1842
1843// Validate that the default FrameEncryptor setting is nullptr.
1844TEST_F(RtpSenderReceiverTest, VideoSenderCanSetFrameEncryptor) {
1845 CreateVideoRtpSender();
1846 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1847 new FakeFrameEncryptor());
1848 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1849 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1850 EXPECT_EQ(fake_frame_encryptor.get(),
1851 video_rtp_sender_->GetFrameEncryptor().get());
1852}
1853
1854// Validate that setting a FrameEncryptor after the send stream is stopped does
1855// nothing.
1856TEST_F(RtpSenderReceiverTest, VideoSenderCannotSetFrameEncryptorAfterStop) {
1857 CreateVideoRtpSender();
1858 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1859 new FakeFrameEncryptor());
1860 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1861 video_rtp_sender_->Stop();
1862 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1863 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1864}
1865
1866// Validate that the default FrameEncryptor setting is nullptr.
1867TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetFrameDecryptor) {
1868 CreateVideoRtpReceiver();
1869 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
Tomas Gunnarssonb3517fe2022-03-18 18:32:381870 rtc::make_ref_counted<FakeFrameDecryptor>());
Benjamin Wrightc462a6e2018-10-26 20:16:161871 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
1872 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1873 EXPECT_EQ(fake_frame_decryptor.get(),
1874 video_rtp_receiver_->GetFrameDecryptor().get());
Tommi4ccdf9322021-05-17 12:50:101875 DestroyVideoRtpReceiver();
Benjamin Wrightc462a6e2018-10-26 20:16:161876}
1877
1878// Validate that the default FrameEncryptor setting is nullptr.
1879TEST_F(RtpSenderReceiverTest, VideoReceiverCannotSetFrameDecryptorAfterStop) {
1880 CreateVideoRtpReceiver();
1881 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
Tomas Gunnarssonb3517fe2022-03-18 18:32:381882 rtc::make_ref_counted<FakeFrameDecryptor>());
Benjamin Wrightc462a6e2018-10-26 20:16:161883 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
Tommi6589def2022-02-17 22:36:471884 video_rtp_receiver_->SetMediaChannel(nullptr);
Benjamin Wrightc462a6e2018-10-26 20:16:161885 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1886 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
Tommi4ccdf9322021-05-17 12:50:101887 DestroyVideoRtpReceiver();
Benjamin Wrightc462a6e2018-10-26 20:16:161888}
1889
Amit Hilbuch619b2942019-02-26 23:55:191890// Checks that calling the internal methods for get/set parameters do not
1891// invalidate any parameters retreived by clients.
1892TEST_F(RtpSenderReceiverTest,
1893 InternalParameterMethodsDoNotInvalidateTransaction) {
1894 CreateVideoRtpSender();
1895 RtpParameters parameters = video_rtp_sender_->GetParameters();
1896 RtpParameters new_parameters = video_rtp_sender_->GetParametersInternal();
1897 new_parameters.encodings[0].active = false;
Florent Castelliacabb362022-10-18 15:05:161898 video_rtp_sender_->SetParametersInternal(new_parameters, nullptr, true);
Amit Hilbuch619b2942019-02-26 23:55:191899 new_parameters.encodings[0].active = true;
Florent Castelliacabb362022-10-18 15:05:161900 video_rtp_sender_->SetParametersInternal(new_parameters, nullptr, true);
Amit Hilbuch619b2942019-02-26 23:55:191901 parameters.encodings[0].active = false;
1902 EXPECT_TRUE(video_rtp_sender_->SetParameters(parameters).ok());
1903}
1904
Philipp Hanckee04c3972022-12-21 14:46:461905// Checks that the senders SetStreams eliminates duplicate stream ids.
1906TEST_F(RtpSenderReceiverTest, SenderSetStreamsEliminatesDuplicateIds) {
1907 AddVideoTrack();
1908 video_rtp_sender_ =
1909 VideoRtpSender::Create(worker_thread_, video_track_->id(), nullptr);
1910 video_rtp_sender_->SetStreams({"1", "2", "1"});
1911 EXPECT_EQ(video_rtp_sender_->stream_ids().size(), 2u);
1912}
1913
Amit Hilbuch2297d332019-02-19 20:49:221914// Helper method for syntactic sugar for accepting a vector with '{}' notation.
1915std::pair<RidList, RidList> CreatePairOfRidVectors(
1916 const std::vector<std::string>& first,
1917 const std::vector<std::string>& second) {
1918 return std::make_pair(first, second);
1919}
1920
1921// These parameters are used to test disabling simulcast layers.
1922const std::pair<RidList, RidList> kDisableSimulcastLayersParameters[] = {
1923 // Tests removing the first layer. This is a special case because
1924 // the first layer's SSRC is also the 'primary' SSRC used to associate the
1925 // parameters to the media channel.
1926 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"1"}),
1927 // Tests removing some layers.
1928 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"2", "4"}),
1929 // Tests simulcast rejected scenario all layers except first are rejected.
1930 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"2", "3", "4"}),
1931 // Tests removing all layers.
1932 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"1", "2", "3", "4"}),
1933};
1934
1935// Runs test for disabling layers on a sender without a media engine set.
1936TEST_P(RtpSenderReceiverTest, DisableSimulcastLayersWithoutMediaEngine) {
1937 auto parameter = GetParam();
1938 RunDisableSimulcastLayersWithoutMediaEngineTest(parameter.first,
1939 parameter.second);
1940}
1941
1942// Runs test for disabling layers on a sender with a media engine set.
1943TEST_P(RtpSenderReceiverTest, DisableSimulcastLayersWithMediaEngine) {
1944 auto parameter = GetParam();
1945 RunDisableSimulcastLayersWithMediaEngineTest(parameter.first,
1946 parameter.second);
1947}
1948
1949INSTANTIATE_TEST_SUITE_P(
1950 DisableSimulcastLayersInSender,
1951 RtpSenderReceiverTest,
1952 ::testing::ValuesIn(kDisableSimulcastLayersParameters));
1953
deadbeef70ab1a12015-09-28 23:53:551954} // namespace webrtc