blob: 2d8a1e8f25af07997973700f0ee1886483e3d9ab [file] [log] [blame]
deadbeef70ab1a12015-09-28 23:53:551/*
kjellanderb24317b2016-02-10 15:54:432 * Copyright 2012 The WebRTC project authors. All Rights Reserved.
deadbeef70ab1a12015-09-28 23:53:553 *
kjellanderb24317b2016-02-10 15:54:434 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
deadbeef70ab1a12015-09-28 23:53:559 */
10
Yves Gerey3e707812018-11-28 15:47:4911#include <stddef.h>
Jonas Olssona4d87372019-07-05 17:08:3312
Yves Gerey3e707812018-11-28 15:47:4913#include <cstdint>
Harald Alvestrandc24a2182022-02-23 13:44:5914#include <iterator>
kwibergd1fe2812016-04-27 13:47:2915#include <memory>
deadbeef70ab1a12015-09-28 23:53:5516#include <string>
Tommif888bb52015-12-12 00:37:0117#include <utility>
Yves Gerey3e707812018-11-28 15:47:4918#include <vector>
deadbeef70ab1a12015-09-28 23:53:5519
Amit Hilbuch2297d332019-02-19 20:49:2220#include "absl/algorithm/container.h"
Yves Gerey3e707812018-11-28 15:47:4921#include "absl/memory/memory.h"
22#include "absl/types/optional.h"
23#include "api/audio_options.h"
Steve Anton10542f22019-01-11 17:11:0024#include "api/crypto/crypto_options.h"
25#include "api/crypto/frame_decryptor_interface.h"
26#include "api/crypto/frame_encryptor_interface.h"
27#include "api/dtmf_sender_interface.h"
28#include "api/media_stream_interface.h"
29#include "api/rtc_error.h"
Danil Chapovalov83bbe912019-08-07 10:24:5330#include "api/rtc_event_log/rtc_event_log.h"
Steve Anton10542f22019-01-11 17:11:0031#include "api/rtp_parameters.h"
Harald Alvestrandc24a2182022-02-23 13:44:5932#include "api/rtp_receiver_interface.h"
Mirko Bonadeid9708072019-01-25 19:26:4833#include "api/scoped_refptr.h"
Benjamin Wright84583f62018-10-04 21:22:3434#include "api/test/fake_frame_decryptor.h"
35#include "api/test/fake_frame_encryptor.h"
Jonas Orelanda3aa9bd2019-04-17 05:38:4036#include "api/video/builtin_video_bitrate_allocator_factory.h"
Harald Alvestrandc24a2182022-02-23 13:44:5937#include "api/video/video_bitrate_allocator_factory.h"
38#include "api/video/video_codec_constants.h"
Yves Gerey3e707812018-11-28 15:47:4939#include "media/base/codec.h"
Harald Alvestrandc24a2182022-02-23 13:44:5940#include "media/base/delayable.h"
Steve Anton10542f22019-01-11 17:11:0041#include "media/base/fake_media_engine.h"
42#include "media/base/media_channel.h"
43#include "media/base/media_config.h"
44#include "media/base/media_engine.h"
Harald Alvestrandc24a2182022-02-23 13:44:5945#include "media/base/rid_description.h"
Steve Anton10542f22019-01-11 17:11:0046#include "media/base/stream_params.h"
47#include "media/base/test_utils.h"
48#include "media/engine/fake_webrtc_call.h"
49#include "p2p/base/dtls_transport_internal.h"
50#include "p2p/base/fake_dtls_transport.h"
51#include "p2p/base/p2p_constants.h"
Ruslan Burakov501bfba2019-02-11 09:29:1952#include "pc/audio_rtp_receiver.h"
Steve Anton10542f22019-01-11 17:11:0053#include "pc/audio_track.h"
Yves Gerey3e707812018-11-28 15:47:4954#include "pc/channel.h"
Steve Anton10542f22019-01-11 17:11:0055#include "pc/dtls_srtp_transport.h"
56#include "pc/local_audio_source.h"
57#include "pc/media_stream.h"
Steve Anton10542f22019-01-11 17:11:0058#include "pc/rtp_sender.h"
59#include "pc/rtp_transport_internal.h"
60#include "pc/test/fake_video_track_source.h"
Ruslan Burakov501bfba2019-02-11 09:29:1961#include "pc/video_rtp_receiver.h"
Steve Anton10542f22019-01-11 17:11:0062#include "pc/video_track.h"
Yves Gerey3e707812018-11-28 15:47:4963#include "rtc_base/checks.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3164#include "rtc_base/gunit.h"
Yves Gerey3e707812018-11-28 15:47:4965#include "rtc_base/thread.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3166#include "test/gmock.h"
67#include "test/gtest.h"
Tommi4ccdf9322021-05-17 12:50:1068#include "test/run_loop.h"
Jonas Orelanded99dae2022-03-09 08:28:1069#include "test/scoped_key_value_config.h"
deadbeef70ab1a12015-09-28 23:53:5570
71using ::testing::_;
Amit Hilbuch2297d332019-02-19 20:49:2272using ::testing::ContainerEq;
deadbeef70ab1a12015-09-28 23:53:5573using ::testing::Exactly;
deadbeef5dd42fd2016-05-02 23:20:0174using ::testing::InvokeWithoutArgs;
skvladdc1c62c2016-03-17 02:07:4375using ::testing::Return;
Amit Hilbuch2297d332019-02-19 20:49:2276using RidList = std::vector<std::string>;
deadbeef70ab1a12015-09-28 23:53:5577
deadbeef20cb0c12017-02-02 04:27:0078namespace {
79
Seth Hampson845e8782018-03-02 19:34:1080static const char kStreamId1[] = "local_stream_1";
deadbeef70ab1a12015-09-28 23:53:5581static const char kVideoTrackId[] = "video_1";
82static const char kAudioTrackId[] = "audio_1";
Peter Boström0c4e06b2015-10-07 10:23:2183static const uint32_t kVideoSsrc = 98;
deadbeeffac06552015-11-25 19:26:0184static const uint32_t kVideoSsrc2 = 100;
Peter Boström0c4e06b2015-10-07 10:23:2185static const uint32_t kAudioSsrc = 99;
deadbeeffac06552015-11-25 19:26:0186static const uint32_t kAudioSsrc2 = 101;
Florent Castelli892acf02018-10-01 20:47:2087static const uint32_t kVideoSsrcSimulcast = 102;
88static const uint32_t kVideoSimulcastLayerCount = 2;
deadbeef20cb0c12017-02-02 04:27:0089static const int kDefaultTimeout = 10000; // 10 seconds.
Guido Urdaneta1ff16c82019-05-20 17:31:5390
91class MockSetStreamsObserver
92 : public webrtc::RtpSenderBase::SetStreamsObserver {
93 public:
Danil Chapovalov3a353122020-05-15 09:16:5394 MOCK_METHOD(void, OnSetStreams, (), (override));
Guido Urdaneta1ff16c82019-05-20 17:31:5395};
96
deadbeef20cb0c12017-02-02 04:27:0097} // namespace
deadbeef70ab1a12015-09-28 23:53:5598
99namespace webrtc {
100
Amit Hilbuch2297d332019-02-19 20:49:22101class RtpSenderReceiverTest
Mirko Bonadei6a489f22019-04-09 13:11:12102 : public ::testing::Test,
Fredrik Solenbergda2afbd2022-08-03 10:07:51103 public ::testing::WithParamInterface<std::pair<RidList, RidList>> {
tkchin3784b4a2016-06-25 02:31:47104 public:
Taylor Brandstetterba29c6a2016-06-27 23:30:35105 RtpSenderReceiverTest()
Steve Anton47136dd2018-01-12 18:49:35106 : network_thread_(rtc::Thread::Current()),
107 worker_thread_(rtc::Thread::Current()),
Jonas Orelanda3aa9bd2019-04-17 05:38:40108 video_bitrate_allocator_factory_(
109 webrtc::CreateBuiltinVideoBitrateAllocatorFactory()),
Steve Anton47136dd2018-01-12 18:49:35110 // Create fake media engine/etc. so we can create channels to use to
111 // test RtpSenders/RtpReceivers.
Harald Alvestrand0ac50b92022-05-18 07:51:34112 media_engine_(std::make_unique<cricket::FakeMediaEngine>()),
Tomas Gunnarssone984aa22021-04-19 07:21:06113 fake_call_(worker_thread_, network_thread_),
Seth Hampson845e8782018-03-02 19:34:10114 local_stream_(MediaStream::Create(kStreamId1)) {
Mirko Bonadei317a1f02019-09-17 15:06:18115 rtp_dtls_transport_ = std::make_unique<cricket::FakeDtlsTransport>(
Zhi Huange830e682018-03-30 17:48:35116 "fake_dtls_transport", cricket::ICE_CANDIDATE_COMPONENT_RTP);
117 rtp_transport_ = CreateDtlsSrtpTransport();
118
Harald Alvestrand485457f2022-05-23 08:46:57119 // Create the channels, discard the result; we get them later.
120 // Fake media channels are owned by the media engine.
121 media_engine_->voice().CreateMediaChannel(
Harald Alvestrand2f553702023-03-07 10:10:03122 cricket::MediaChannel::Role::kSend, &fake_call_, cricket::MediaConfig(),
Harald Alvestrand8981a6f2023-02-17 13:01:30123 cricket::AudioOptions(), webrtc::CryptoOptions(),
124 webrtc::AudioCodecPairId::Create());
Harald Alvestrand485457f2022-05-23 08:46:57125 media_engine_->video().CreateMediaChannel(
Harald Alvestrand2f553702023-03-07 10:10:03126 cricket::MediaChannel::Role::kSend, &fake_call_, cricket::MediaConfig(),
Harald Alvestrand16579cc2023-02-09 13:01:24127 cricket::VideoOptions(), webrtc::CryptoOptions(),
128 video_bitrate_allocator_factory_.get());
Harald Alvestrand2f553702023-03-07 10:10:03129 media_engine_->voice().CreateMediaChannel(
130 cricket::MediaChannel::Role::kReceive, &fake_call_,
131 cricket::MediaConfig(), cricket::AudioOptions(),
132 webrtc::CryptoOptions(), webrtc::AudioCodecPairId::Create());
133 media_engine_->video().CreateMediaChannel(
134 cricket::MediaChannel::Role::kReceive, &fake_call_,
135 cricket::MediaConfig(), cricket::VideoOptions(),
136 webrtc::CryptoOptions(), video_bitrate_allocator_factory_.get());
Tomas Gunnarsson4f8a58c2022-01-19 10:36:23137
Harald Alvestrand2f553702023-03-07 10:10:03138 voice_media_send_channel_ =
139 absl::WrapUnique(media_engine_->GetVoiceSendChannel(0));
140 video_media_send_channel_ =
141 absl::WrapUnique(media_engine_->GetVideoSendChannel(0));
142 voice_media_receive_channel_ =
143 absl::WrapUnique(media_engine_->GetVoiceReceiveChannel(0));
144 video_media_receive_channel_ =
145 absl::WrapUnique(media_engine_->GetVideoReceiveChannel(0));
Tomas Gunnarsson4f8a58c2022-01-19 10:36:23146
Harald Alvestrand2f553702023-03-07 10:10:03147 RTC_CHECK(voice_media_send_channel());
148 RTC_CHECK(video_media_send_channel());
149 RTC_CHECK(voice_media_receive_channel());
150 RTC_CHECK(video_media_receive_channel());
Harald Alvestrand50454ef2022-12-15 16:49:13151 // Create sender channel objects
Harald Alvestrand2f553702023-03-07 10:10:03152 voice_send_channel_ = std::make_unique<cricket::VoiceMediaSendChannel>(
153 voice_media_send_channel());
154 video_send_channel_ = std::make_unique<cricket::VideoMediaSendChannel>(
155 video_media_send_channel());
Taylor Brandstetterba29c6a2016-06-27 23:30:35156
157 // Create streams for predefined SSRCs. Streams need to exist in order
158 // for the senders and receievers to apply parameters to them.
159 // Normally these would be created by SetLocalDescription and
160 // SetRemoteDescription.
Harald Alvestrand2f553702023-03-07 10:10:03161 voice_media_send_channel_->AddSendStream(
Taylor Brandstetterba29c6a2016-06-27 23:30:35162 cricket::StreamParams::CreateLegacy(kAudioSsrc));
Harald Alvestrand2f553702023-03-07 10:10:03163 voice_media_receive_channel_->AddRecvStream(
Taylor Brandstetterba29c6a2016-06-27 23:30:35164 cricket::StreamParams::CreateLegacy(kAudioSsrc));
Harald Alvestrand2f553702023-03-07 10:10:03165 voice_media_send_channel_->AddSendStream(
Taylor Brandstetterba29c6a2016-06-27 23:30:35166 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
Harald Alvestrand2f553702023-03-07 10:10:03167 voice_media_receive_channel_->AddRecvStream(
Taylor Brandstetterba29c6a2016-06-27 23:30:35168 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
Harald Alvestrand2f553702023-03-07 10:10:03169 video_media_send_channel_->AddSendStream(
Taylor Brandstetterba29c6a2016-06-27 23:30:35170 cricket::StreamParams::CreateLegacy(kVideoSsrc));
Harald Alvestrand2f553702023-03-07 10:10:03171 video_media_receive_channel_->AddRecvStream(
Taylor Brandstetterba29c6a2016-06-27 23:30:35172 cricket::StreamParams::CreateLegacy(kVideoSsrc));
Harald Alvestrand2f553702023-03-07 10:10:03173 video_media_send_channel_->AddSendStream(
Taylor Brandstetterba29c6a2016-06-27 23:30:35174 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
Harald Alvestrand2f553702023-03-07 10:10:03175 video_media_receive_channel_->AddRecvStream(
Taylor Brandstetterba29c6a2016-06-27 23:30:35176 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
tkchin3784b4a2016-06-25 02:31:47177 }
Taylor Brandstetter2d549172016-06-24 21:18:22178
Tomas Gunnarsson0b5ec182021-04-01 14:49:42179 ~RtpSenderReceiverTest() {
180 audio_rtp_sender_ = nullptr;
181 video_rtp_sender_ = nullptr;
182 audio_rtp_receiver_ = nullptr;
183 video_rtp_receiver_ = nullptr;
184 local_stream_ = nullptr;
185 video_track_ = nullptr;
186 audio_track_ = nullptr;
Tomas Gunnarsson0b5ec182021-04-01 14:49:42187 }
188
Zhi Huange830e682018-03-30 17:48:35189 std::unique_ptr<webrtc::RtpTransportInternal> CreateDtlsSrtpTransport() {
Mirko Bonadei317a1f02019-09-17 15:06:18190 auto dtls_srtp_transport = std::make_unique<webrtc::DtlsSrtpTransport>(
Jonas Orelanded99dae2022-03-09 08:28:10191 /*rtcp_mux_required=*/true, field_trials_);
Zhi Huange830e682018-03-30 17:48:35192 dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport_.get(),
193 /*rtcp_dtls_transport=*/nullptr);
194 return dtls_srtp_transport;
195 }
196
deadbeef20cb0c12017-02-02 04:27:00197 // Needed to use DTMF sender.
198 void AddDtmfCodec() {
199 cricket::AudioSendParameters params;
Florent Castelli8c4b9ea2023-06-02 16:06:57200 const cricket::AudioCodec kTelephoneEventCodec =
201 cricket::CreateAudioCodec(106, "telephone-event", 8000, 1);
deadbeef20cb0c12017-02-02 04:27:00202 params.codecs.push_back(kTelephoneEventCodec);
Harald Alvestrand2f553702023-03-07 10:10:03203 voice_media_send_channel()->SetSendParameters(params);
deadbeef20cb0c12017-02-02 04:27:00204 }
Taylor Brandstetterba29c6a2016-06-27 23:30:35205
pbos5214a0a2016-12-16 23:39:11206 void AddVideoTrack() { AddVideoTrack(false); }
207
208 void AddVideoTrack(bool is_screencast) {
perkja3ede6c2016-03-08 00:27:48209 rtc::scoped_refptr<VideoTrackSourceInterface> source(
pbos5214a0a2016-12-16 23:39:11210 FakeVideoTrackSource::Create(is_screencast));
perkj773be362017-08-01 06:22:01211 video_track_ =
212 VideoTrack::Create(kVideoTrackId, source, rtc::Thread::Current());
Harald Alvestrand2f7ad282022-04-21 11:35:43213 EXPECT_TRUE(local_stream_->AddTrack(video_track_));
deadbeef70ab1a12015-09-28 23:53:55214 }
215
Taylor Brandstetterba29c6a2016-06-27 23:30:35216 void CreateAudioRtpSender() { CreateAudioRtpSender(nullptr); }
217
Mirko Bonadeic61ce0d2017-11-21 16:04:20218 void CreateAudioRtpSender(
219 const rtc::scoped_refptr<LocalAudioSource>& source) {
Taylor Brandstetterba29c6a2016-06-27 23:30:35220 audio_track_ = AudioTrack::Create(kAudioTrackId, source);
Harald Alvestrand2f7ad282022-04-21 11:35:43221 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
Guido Urdaneta1ff16c82019-05-20 17:31:53222 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 15:06:18223 std::make_unique<MockSetStreamsObserver>();
Steve Anton47136dd2018-01-12 18:49:35224 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 17:31:53225 AudioRtpSender::Create(worker_thread_, audio_track_->id(), nullptr,
226 set_streams_observer.get());
Niels Möllerafb246b2022-04-20 12:26:50227 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_.get()));
Guido Urdaneta1ff16c82019-05-20 17:31:53228 EXPECT_CALL(*set_streams_observer, OnSetStreams());
229 audio_rtp_sender_->SetStreams({local_stream_->id()});
Harald Alvestrand50454ef2022-12-15 16:49:13230 audio_rtp_sender_->SetMediaChannel(voice_send_channel_.get());
deadbeeffac06552015-11-25 19:26:01231 audio_rtp_sender_->SetSsrc(kAudioSsrc);
Taylor Brandstetterba29c6a2016-06-27 23:30:35232 VerifyVoiceChannelInput();
deadbeef70ab1a12015-09-28 23:53:55233 }
234
Steve Anton02ee47c2018-01-11 00:26:06235 void CreateAudioRtpSenderWithNoTrack() {
Amit Hilbuchea7ef2a2019-02-19 23:20:21236 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 17:31:53237 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
Harald Alvestrandc0d44d92022-12-13 12:57:24238 audio_rtp_sender_->SetMediaChannel(
Harald Alvestrand2f553702023-03-07 10:10:03239 voice_media_send_channel()->AsVoiceSendChannel());
Steve Anton02ee47c2018-01-11 00:26:06240 }
241
Seth Hampson2d2c8882018-05-16 23:02:32242 void CreateVideoRtpSender(uint32_t ssrc) {
243 CreateVideoRtpSender(false, ssrc);
244 }
245
pbos5214a0a2016-12-16 23:39:11246 void CreateVideoRtpSender() { CreateVideoRtpSender(false); }
247
Amit Hilbuch2297d332019-02-19 20:49:22248 cricket::StreamParams CreateSimulcastStreamParams(int num_layers) {
Florent Castelli892acf02018-10-01 20:47:20249 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 09:11:53250 ssrcs.reserve(num_layers);
Amit Hilbuch2297d332019-02-19 20:49:22251 for (int i = 0; i < num_layers; ++i) {
Florent Castelli892acf02018-10-01 20:47:20252 ssrcs.push_back(kVideoSsrcSimulcast + i);
Amit Hilbuch2297d332019-02-19 20:49:22253 }
254 return cricket::CreateSimStreamParams("cname", ssrcs);
255 }
256
257 uint32_t CreateVideoRtpSender(const cricket::StreamParams& stream_params) {
Harald Alvestrand2f553702023-03-07 10:10:03258 video_media_send_channel_->AddSendStream(stream_params);
Florent Castelli892acf02018-10-01 20:47:20259 uint32_t primary_ssrc = stream_params.first_ssrc();
260 CreateVideoRtpSender(primary_ssrc);
Amit Hilbuch2297d332019-02-19 20:49:22261 return primary_ssrc;
262 }
263
264 uint32_t CreateVideoRtpSenderWithSimulcast(
265 int num_layers = kVideoSimulcastLayerCount) {
266 return CreateVideoRtpSender(CreateSimulcastStreamParams(num_layers));
267 }
268
269 uint32_t CreateVideoRtpSenderWithSimulcast(
270 const std::vector<std::string>& rids) {
271 cricket::StreamParams stream_params =
272 CreateSimulcastStreamParams(rids.size());
273 std::vector<cricket::RidDescription> rid_descriptions;
274 absl::c_transform(
275 rids, std::back_inserter(rid_descriptions), [](const std::string& rid) {
276 return cricket::RidDescription(rid, cricket::RidDirection::kSend);
277 });
278 stream_params.set_rids(rid_descriptions);
279 return CreateVideoRtpSender(stream_params);
Florent Castelli892acf02018-10-01 20:47:20280 }
281
Seth Hampson2d2c8882018-05-16 23:02:32282 void CreateVideoRtpSender(bool is_screencast, uint32_t ssrc = kVideoSsrc) {
pbos5214a0a2016-12-16 23:39:11283 AddVideoTrack(is_screencast);
Guido Urdaneta1ff16c82019-05-20 17:31:53284 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 15:06:18285 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 17:31:53286 video_rtp_sender_ = VideoRtpSender::Create(
287 worker_thread_, video_track_->id(), set_streams_observer.get());
Niels Möllerafb246b2022-04-20 12:26:50288 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
Guido Urdaneta1ff16c82019-05-20 17:31:53289 EXPECT_CALL(*set_streams_observer, OnSetStreams());
290 video_rtp_sender_->SetStreams({local_stream_->id()});
Harald Alvestrandc0d44d92022-12-13 12:57:24291 video_rtp_sender_->SetMediaChannel(
Harald Alvestrand2f553702023-03-07 10:10:03292 video_media_send_channel()->AsVideoSendChannel());
Seth Hampson2d2c8882018-05-16 23:02:32293 video_rtp_sender_->SetSsrc(ssrc);
294 VerifyVideoChannelInput(ssrc);
deadbeef70ab1a12015-09-28 23:53:55295 }
Steve Anton02ee47c2018-01-11 00:26:06296 void CreateVideoRtpSenderWithNoTrack() {
Guido Urdaneta1ff16c82019-05-20 17:31:53297 video_rtp_sender_ =
298 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Harald Alvestrandc0d44d92022-12-13 12:57:24299 video_rtp_sender_->SetMediaChannel(
Harald Alvestrand2f553702023-03-07 10:10:03300 video_media_send_channel()->AsVideoSendChannel());
Steve Anton02ee47c2018-01-11 00:26:06301 }
302
deadbeef70ab1a12015-09-28 23:53:55303 void DestroyAudioRtpSender() {
deadbeef70ab1a12015-09-28 23:53:55304 audio_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 23:30:35305 VerifyVoiceChannelNoInput();
deadbeef70ab1a12015-09-28 23:53:55306 }
307
308 void DestroyVideoRtpSender() {
deadbeef70ab1a12015-09-28 23:53:55309 video_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 23:30:35310 VerifyVideoChannelNoInput();
deadbeef70ab1a12015-09-28 23:53:55311 }
312
Henrik Boström9e6fd2b2017-11-21 12:41:51313 void CreateAudioRtpReceiver(
314 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
Tommi4ccdf9322021-05-17 12:50:10315 audio_rtp_receiver_ = rtc::make_ref_counted<AudioRtpReceiver>(
316 rtc::Thread::Current(), kAudioTrackId, streams,
317 /*is_unified_plan=*/true);
Harald Alvestrandc0d44d92022-12-13 12:57:24318 audio_rtp_receiver_->SetMediaChannel(
Harald Alvestrand2f553702023-03-07 10:10:03319 voice_media_receive_channel()->AsVoiceReceiveChannel());
Steve Antond3679212018-01-18 01:41:02320 audio_rtp_receiver_->SetupMediaChannel(kAudioSsrc);
perkjd61bf802016-03-24 10:16:19321 audio_track_ = audio_rtp_receiver_->audio_track();
Taylor Brandstetterba29c6a2016-06-27 23:30:35322 VerifyVoiceChannelOutput();
deadbeef70ab1a12015-09-28 23:53:55323 }
324
Henrik Boström9e6fd2b2017-11-21 12:41:51325 void CreateVideoRtpReceiver(
326 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
Tommi4ccdf9322021-05-17 12:50:10327 video_rtp_receiver_ = rtc::make_ref_counted<VideoRtpReceiver>(
328 rtc::Thread::Current(), kVideoTrackId, streams);
Harald Alvestrandc0d44d92022-12-13 12:57:24329 video_rtp_receiver_->SetMediaChannel(
Harald Alvestrand2f553702023-03-07 10:10:03330 video_media_receive_channel()->AsVideoReceiveChannel());
Steve Antond3679212018-01-18 01:41:02331 video_rtp_receiver_->SetupMediaChannel(kVideoSsrc);
perkjf0dcfe22016-03-10 17:32:00332 video_track_ = video_rtp_receiver_->video_track();
Taylor Brandstetterba29c6a2016-06-27 23:30:35333 VerifyVideoChannelOutput();
deadbeef70ab1a12015-09-28 23:53:55334 }
335
Florent Castelli38332cd2018-11-20 13:08:06336 void CreateVideoRtpReceiverWithSimulcast(
337 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {},
338 int num_layers = kVideoSimulcastLayerCount) {
339 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 09:11:53340 ssrcs.reserve(num_layers);
Florent Castelli38332cd2018-11-20 13:08:06341 for (int i = 0; i < num_layers; ++i)
342 ssrcs.push_back(kVideoSsrcSimulcast + i);
343 cricket::StreamParams stream_params =
344 cricket::CreateSimStreamParams("cname", ssrcs);
Harald Alvestrand2f553702023-03-07 10:10:03345 video_media_receive_channel_->AddRecvStream(stream_params);
Florent Castelli38332cd2018-11-20 13:08:06346 uint32_t primary_ssrc = stream_params.first_ssrc();
347
Tommi4ccdf9322021-05-17 12:50:10348 video_rtp_receiver_ = rtc::make_ref_counted<VideoRtpReceiver>(
349 rtc::Thread::Current(), kVideoTrackId, streams);
Harald Alvestrandc0d44d92022-12-13 12:57:24350 video_rtp_receiver_->SetMediaChannel(
Harald Alvestrand2f553702023-03-07 10:10:03351 video_media_receive_channel()->AsVideoReceiveChannel());
Florent Castelli38332cd2018-11-20 13:08:06352 video_rtp_receiver_->SetupMediaChannel(primary_ssrc);
353 video_track_ = video_rtp_receiver_->video_track();
354 }
355
deadbeef70ab1a12015-09-28 23:53:55356 void DestroyAudioRtpReceiver() {
Tommi4ccdf9322021-05-17 12:50:10357 if (!audio_rtp_receiver_)
358 return;
Tommi6589def2022-02-17 22:36:47359 audio_rtp_receiver_->SetMediaChannel(nullptr);
deadbeef70ab1a12015-09-28 23:53:55360 audio_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 23:30:35361 VerifyVoiceChannelNoOutput();
deadbeef70ab1a12015-09-28 23:53:55362 }
363
364 void DestroyVideoRtpReceiver() {
Tommi4ccdf9322021-05-17 12:50:10365 if (!video_rtp_receiver_)
366 return;
367 video_rtp_receiver_->Stop();
Tommi6589def2022-02-17 22:36:47368 video_rtp_receiver_->SetMediaChannel(nullptr);
deadbeef70ab1a12015-09-28 23:53:55369 video_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 23:30:35370 VerifyVideoChannelNoOutput();
371 }
372
373 void VerifyVoiceChannelInput() { VerifyVoiceChannelInput(kAudioSsrc); }
374
375 void VerifyVoiceChannelInput(uint32_t ssrc) {
376 // Verify that the media channel has an audio source, and the stream isn't
377 // muted.
Harald Alvestrand2f553702023-03-07 10:10:03378 EXPECT_TRUE(voice_media_send_channel()->HasSource(ssrc));
379 EXPECT_FALSE(voice_media_send_channel()->IsStreamMuted(ssrc));
Taylor Brandstetterba29c6a2016-06-27 23:30:35380 }
381
382 void VerifyVideoChannelInput() { VerifyVideoChannelInput(kVideoSsrc); }
383
384 void VerifyVideoChannelInput(uint32_t ssrc) {
385 // Verify that the media channel has a video source,
Harald Alvestrand2f553702023-03-07 10:10:03386 EXPECT_TRUE(video_media_send_channel_->HasSource(ssrc));
Taylor Brandstetterba29c6a2016-06-27 23:30:35387 }
388
389 void VerifyVoiceChannelNoInput() { VerifyVoiceChannelNoInput(kAudioSsrc); }
390
391 void VerifyVoiceChannelNoInput(uint32_t ssrc) {
392 // Verify that the media channel's source is reset.
Harald Alvestrand2f553702023-03-07 10:10:03393 EXPECT_FALSE(voice_media_receive_channel()->HasSource(ssrc));
Taylor Brandstetterba29c6a2016-06-27 23:30:35394 }
395
396 void VerifyVideoChannelNoInput() { VerifyVideoChannelNoInput(kVideoSsrc); }
397
398 void VerifyVideoChannelNoInput(uint32_t ssrc) {
399 // Verify that the media channel's source is reset.
Harald Alvestrand2f553702023-03-07 10:10:03400 EXPECT_FALSE(video_media_receive_channel_->HasSource(ssrc));
Taylor Brandstetterba29c6a2016-06-27 23:30:35401 }
402
403 void VerifyVoiceChannelOutput() {
404 // Verify that the volume is initialized to 1.
405 double volume;
Harald Alvestrand2f553702023-03-07 10:10:03406 EXPECT_TRUE(
407 voice_media_receive_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 23:30:35408 EXPECT_EQ(1, volume);
409 }
410
411 void VerifyVideoChannelOutput() {
412 // Verify that the media channel has a sink.
Harald Alvestrand2f553702023-03-07 10:10:03413 EXPECT_TRUE(video_media_receive_channel_->HasSink(kVideoSsrc));
Taylor Brandstetterba29c6a2016-06-27 23:30:35414 }
415
416 void VerifyVoiceChannelNoOutput() {
417 // Verify that the volume is reset to 0.
418 double volume;
Harald Alvestrand2f553702023-03-07 10:10:03419 EXPECT_TRUE(
420 voice_media_receive_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 23:30:35421 EXPECT_EQ(0, volume);
422 }
423
424 void VerifyVideoChannelNoOutput() {
425 // Verify that the media channel's sink is reset.
Harald Alvestrand2f553702023-03-07 10:10:03426 EXPECT_FALSE(video_media_receive_channel_->HasSink(kVideoSsrc));
deadbeef70ab1a12015-09-28 23:53:55427 }
428
Amit Hilbuch2297d332019-02-19 20:49:22429 // Verifies that the encoding layers contain the specified RIDs.
430 bool VerifyEncodingLayers(const VideoRtpSender& sender,
431 const std::vector<std::string>& rids) {
432 bool has_failure = HasFailure();
433 RtpParameters parameters = sender.GetParameters();
434 std::vector<std::string> encoding_rids;
435 absl::c_transform(
436 parameters.encodings, std::back_inserter(encoding_rids),
437 [](const RtpEncodingParameters& encoding) { return encoding.rid; });
438 EXPECT_THAT(rids, ContainerEq(encoding_rids));
439 return has_failure || !HasFailure();
440 }
441
442 // Runs a test for disabling the encoding layers on the specified sender.
443 void RunDisableEncodingLayersTest(
444 const std::vector<std::string>& all_layers,
445 const std::vector<std::string>& disabled_layers,
446 VideoRtpSender* sender) {
447 std::vector<std::string> expected;
448 absl::c_copy_if(all_layers, std::back_inserter(expected),
449 [&disabled_layers](const std::string& rid) {
450 return !absl::c_linear_search(disabled_layers, rid);
451 });
452
453 EXPECT_TRUE(VerifyEncodingLayers(*sender, all_layers));
454 sender->DisableEncodingLayers(disabled_layers);
455 EXPECT_TRUE(VerifyEncodingLayers(*sender, expected));
456 }
457
458 // Runs a test for setting an encoding layer as inactive.
459 // This test assumes that some layers have already been disabled.
460 void RunSetLastLayerAsInactiveTest(VideoRtpSender* sender) {
461 auto parameters = sender->GetParameters();
462 if (parameters.encodings.size() == 0) {
463 return;
464 }
465
466 RtpEncodingParameters& encoding = parameters.encodings.back();
467 auto rid = encoding.rid;
468 EXPECT_TRUE(encoding.active);
469 encoding.active = false;
470 auto error = sender->SetParameters(parameters);
471 ASSERT_TRUE(error.ok());
472 parameters = sender->GetParameters();
473 RtpEncodingParameters& result_encoding = parameters.encodings.back();
474 EXPECT_EQ(rid, result_encoding.rid);
475 EXPECT_FALSE(result_encoding.active);
476 }
477
478 // Runs a test for disabling the encoding layers on a sender without a media
479 // channel.
480 void RunDisableSimulcastLayersWithoutMediaEngineTest(
481 const std::vector<std::string>& all_layers,
482 const std::vector<std::string>& disabled_layers) {
Guido Urdaneta1ff16c82019-05-20 17:31:53483 auto sender = VideoRtpSender::Create(rtc::Thread::Current(), "1", nullptr);
Amit Hilbuch2297d332019-02-19 20:49:22484 RtpParameters parameters;
485 parameters.encodings.resize(all_layers.size());
486 for (size_t i = 0; i < all_layers.size(); ++i) {
487 parameters.encodings[i].rid = all_layers[i];
488 }
Amit Hilbuchea7ef2a2019-02-19 23:20:21489 sender->set_init_send_encodings(parameters.encodings);
490 RunDisableEncodingLayersTest(all_layers, disabled_layers, sender.get());
491 RunSetLastLayerAsInactiveTest(sender.get());
Amit Hilbuch2297d332019-02-19 20:49:22492 }
493
494 // Runs a test for disabling the encoding layers on a sender with a media
495 // channel.
496 void RunDisableSimulcastLayersWithMediaEngineTest(
497 const std::vector<std::string>& all_layers,
498 const std::vector<std::string>& disabled_layers) {
499 uint32_t ssrc = CreateVideoRtpSenderWithSimulcast(all_layers);
500 RunDisableEncodingLayersTest(all_layers, disabled_layers,
501 video_rtp_sender_.get());
502
Harald Alvestrand2f553702023-03-07 10:10:03503 auto channel_parameters =
504 video_media_send_channel_->GetRtpSendParameters(ssrc);
Amit Hilbuch2297d332019-02-19 20:49:22505 ASSERT_EQ(channel_parameters.encodings.size(), all_layers.size());
506 for (size_t i = 0; i < all_layers.size(); ++i) {
507 EXPECT_EQ(all_layers[i], channel_parameters.encodings[i].rid);
508 bool is_active = !absl::c_linear_search(disabled_layers, all_layers[i]);
509 EXPECT_EQ(is_active, channel_parameters.encodings[i].active);
510 }
511
512 RunSetLastLayerAsInactiveTest(video_rtp_sender_.get());
513 }
514
Ruslan Burakov4bac79e2019-04-03 17:55:33515 // Check that minimum Jitter Buffer delay is propagated to the underlying
Artem Titov880fa812021-07-30 20:30:23516 // `media_channel`.
Ruslan Burakov4bac79e2019-04-03 17:55:33517 void VerifyRtpReceiverDelayBehaviour(cricket::Delayable* media_channel,
518 RtpReceiverInterface* receiver,
519 uint32_t ssrc) {
520 receiver->SetJitterBufferMinimumDelay(/*delay_seconds=*/0.5);
521 absl::optional<int> delay_ms =
522 media_channel->GetBaseMinimumPlayoutDelayMs(ssrc); // In milliseconds.
523 EXPECT_DOUBLE_EQ(0.5, delay_ms.value_or(0) / 1000.0);
524 }
525
deadbeef70ab1a12015-09-28 23:53:55526 protected:
Harald Alvestrand2f553702023-03-07 10:10:03527 cricket::FakeVideoMediaChannel* video_media_send_channel() {
528 return video_media_send_channel_.get();
Harald Alvestrand485457f2022-05-23 08:46:57529 }
Harald Alvestrand2f553702023-03-07 10:10:03530 cricket::FakeVoiceMediaChannel* voice_media_send_channel() {
531 return voice_media_send_channel_.get();
532 }
533 cricket::FakeVideoMediaChannel* video_media_receive_channel() {
534 return video_media_receive_channel_.get();
535 }
536 cricket::FakeVoiceMediaChannel* voice_media_receive_channel() {
537 return voice_media_receive_channel_.get();
Harald Alvestrand485457f2022-05-23 08:46:57538 }
539
Tommi4ccdf9322021-05-17 12:50:10540 test::RunLoop run_loop_;
Steve Anton47136dd2018-01-12 18:49:35541 rtc::Thread* const network_thread_;
542 rtc::Thread* const worker_thread_;
Danil Chapovalov83bbe912019-08-07 10:24:53543 webrtc::RtcEventLogNull event_log_;
Artem Titov880fa812021-07-30 20:30:23544 // The `rtp_dtls_transport_` and `rtp_transport_` should be destroyed after
545 // the `channel_manager`.
Zhi Huange830e682018-03-30 17:48:35546 std::unique_ptr<cricket::DtlsTransportInternal> rtp_dtls_transport_;
547 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport_;
Jonas Orelanda3aa9bd2019-04-17 05:38:40548 std::unique_ptr<webrtc::VideoBitrateAllocatorFactory>
549 video_bitrate_allocator_factory_;
Harald Alvestrand0ac50b92022-05-18 07:51:34550 std::unique_ptr<cricket::FakeMediaEngine> media_engine_;
551 rtc::UniqueRandomIdGenerator ssrc_generator_;
Taylor Brandstetterba29c6a2016-06-27 23:30:35552 cricket::FakeCall fake_call_;
Harald Alvestrand2f553702023-03-07 10:10:03553 std::unique_ptr<cricket::FakeVoiceMediaChannel> voice_media_send_channel_;
554 std::unique_ptr<cricket::FakeVideoMediaChannel> video_media_send_channel_;
555 std::unique_ptr<cricket::FakeVoiceMediaChannel> voice_media_receive_channel_;
556 std::unique_ptr<cricket::FakeVideoMediaChannel> video_media_receive_channel_;
Harald Alvestrand50454ef2022-12-15 16:49:13557 std::unique_ptr<cricket::VoiceMediaSendChannel> voice_send_channel_;
558 std::unique_ptr<cricket::VideoMediaSendChannel> video_send_channel_;
deadbeef70ab1a12015-09-28 23:53:55559 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
560 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
561 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
562 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
deadbeefe814a0d2017-02-26 02:15:09563 rtc::scoped_refptr<MediaStreamInterface> local_stream_;
deadbeef70ab1a12015-09-28 23:53:55564 rtc::scoped_refptr<VideoTrackInterface> video_track_;
565 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
Jonas Orelanded99dae2022-03-09 08:28:10566 webrtc::test::ScopedKeyValueConfig field_trials_;
deadbeef70ab1a12015-09-28 23:53:55567};
568
Artem Titov880fa812021-07-30 20:30:23569// Test that `voice_channel_` is updated when an audio track is associated
deadbeef70ab1a12015-09-28 23:53:55570// and disassociated with an AudioRtpSender.
571TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
572 CreateAudioRtpSender();
573 DestroyAudioRtpSender();
574}
575
Artem Titov880fa812021-07-30 20:30:23576// Test that `video_channel_` is updated when a video track is associated and
deadbeef70ab1a12015-09-28 23:53:55577// disassociated with a VideoRtpSender.
578TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
579 CreateVideoRtpSender();
580 DestroyVideoRtpSender();
581}
582
Artem Titov880fa812021-07-30 20:30:23583// Test that `voice_channel_` is updated when a remote audio track is
deadbeef70ab1a12015-09-28 23:53:55584// associated and disassociated with an AudioRtpReceiver.
585TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
586 CreateAudioRtpReceiver();
587 DestroyAudioRtpReceiver();
588}
589
Artem Titov880fa812021-07-30 20:30:23590// Test that `video_channel_` is updated when a remote video track is
Taylor Brandstetterba29c6a2016-06-27 23:30:35591// associated and disassociated with a VideoRtpReceiver.
deadbeef70ab1a12015-09-28 23:53:55592TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
593 CreateVideoRtpReceiver();
594 DestroyVideoRtpReceiver();
595}
596
Henrik Boström9e6fd2b2017-11-21 12:41:51597TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiverWithStreams) {
598 CreateAudioRtpReceiver({local_stream_});
599 DestroyAudioRtpReceiver();
600}
601
602TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiverWithStreams) {
603 CreateVideoRtpReceiver({local_stream_});
604 DestroyVideoRtpReceiver();
605}
606
Taylor Brandstetterba29c6a2016-06-27 23:30:35607// Test that the AudioRtpSender applies options from the local audio source.
608TEST_F(RtpSenderReceiverTest, LocalAudioSourceOptionsApplied) {
609 cricket::AudioOptions options;
Oskar Sundbom36f8f3e2017-11-16 09:54:27610 options.echo_cancellation = true;
deadbeef757146b2017-02-11 05:26:48611 auto source = LocalAudioSource::Create(&options);
Niels Möllere7cc8832022-01-04 14:20:03612 CreateAudioRtpSender(source);
Taylor Brandstetter2d549172016-06-24 21:18:22613
Harald Alvestrand2f553702023-03-07 10:10:03614 EXPECT_EQ(true, voice_media_send_channel()->options().echo_cancellation);
Taylor Brandstetter2d549172016-06-24 21:18:22615
616 DestroyAudioRtpSender();
617}
618
Taylor Brandstetterba29c6a2016-06-27 23:30:35619// Test that the stream is muted when the track is disabled, and unmuted when
620// the track is enabled.
621TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) {
622 CreateAudioRtpSender();
623
624 audio_track_->set_enabled(false);
Harald Alvestrand2f553702023-03-07 10:10:03625 EXPECT_TRUE(voice_media_send_channel()->IsStreamMuted(kAudioSsrc));
Taylor Brandstetterba29c6a2016-06-27 23:30:35626
627 audio_track_->set_enabled(true);
Harald Alvestrand2f553702023-03-07 10:10:03628 EXPECT_FALSE(voice_media_send_channel()->IsStreamMuted(kAudioSsrc));
Taylor Brandstetterba29c6a2016-06-27 23:30:35629
630 DestroyAudioRtpSender();
631}
632
633// Test that the volume is set to 0 when the track is disabled, and back to
634// 1 when the track is enabled.
deadbeef70ab1a12015-09-28 23:53:55635TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
636 CreateAudioRtpReceiver();
637
Taylor Brandstetterba29c6a2016-06-27 23:30:35638 double volume;
Harald Alvestrand2f553702023-03-07 10:10:03639 EXPECT_TRUE(
640 voice_media_receive_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 23:30:35641 EXPECT_EQ(1, volume);
Taylor Brandstetter2d549172016-06-24 21:18:22642
Tommi4ccdf9322021-05-17 12:50:10643 // Handling of enable/disable is applied asynchronously.
Taylor Brandstetterba29c6a2016-06-27 23:30:35644 audio_track_->set_enabled(false);
Tommi4ccdf9322021-05-17 12:50:10645 run_loop_.Flush();
646
Harald Alvestrand2f553702023-03-07 10:10:03647 EXPECT_TRUE(
648 voice_media_receive_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 23:30:35649 EXPECT_EQ(0, volume);
650
deadbeef70ab1a12015-09-28 23:53:55651 audio_track_->set_enabled(true);
Tommi4ccdf9322021-05-17 12:50:10652 run_loop_.Flush();
Harald Alvestrand2f553702023-03-07 10:10:03653 EXPECT_TRUE(
654 voice_media_receive_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 23:30:35655 EXPECT_EQ(1, volume);
deadbeef70ab1a12015-09-28 23:53:55656
657 DestroyAudioRtpReceiver();
658}
659
Taylor Brandstetterba29c6a2016-06-27 23:30:35660// Currently no action is taken when a remote video track is disabled or
661// enabled, so there's nothing to test here, other than what is normally
662// verified in DestroyVideoRtpSender.
deadbeef70ab1a12015-09-28 23:53:55663TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
664 CreateVideoRtpSender();
665
deadbeef70ab1a12015-09-28 23:53:55666 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 23:53:55667 video_track_->set_enabled(true);
668
669 DestroyVideoRtpSender();
670}
671
Taylor Brandstetterba29c6a2016-06-27 23:30:35672// Test that the state of the video track created by the VideoRtpReceiver is
673// updated when the receiver is destroyed.
perkjf0dcfe22016-03-10 17:32:00674TEST_F(RtpSenderReceiverTest, RemoteVideoTrackState) {
675 CreateVideoRtpReceiver();
676
677 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track_->state());
678 EXPECT_EQ(webrtc::MediaSourceInterface::kLive,
679 video_track_->GetSource()->state());
680
681 DestroyVideoRtpReceiver();
682
683 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track_->state());
684 EXPECT_EQ(webrtc::MediaSourceInterface::kEnded,
685 video_track_->GetSource()->state());
Tommi4ccdf9322021-05-17 12:50:10686 DestroyVideoRtpReceiver();
perkjf0dcfe22016-03-10 17:32:00687}
688
Taylor Brandstetterba29c6a2016-06-27 23:30:35689// Currently no action is taken when a remote video track is disabled or
690// enabled, so there's nothing to test here, other than what is normally
691// verified in DestroyVideoRtpReceiver.
deadbeef70ab1a12015-09-28 23:53:55692TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
693 CreateVideoRtpReceiver();
694
695 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 23:53:55696 video_track_->set_enabled(true);
697
698 DestroyVideoRtpReceiver();
699}
700
Taylor Brandstetterba29c6a2016-06-27 23:30:35701// Test that the AudioRtpReceiver applies volume changes from the track source
702// to the media channel.
deadbeef70ab1a12015-09-28 23:53:55703TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
704 CreateAudioRtpReceiver();
705
Taylor Brandstetterba29c6a2016-06-27 23:30:35706 double volume;
707 audio_track_->GetSource()->SetVolume(0.5);
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.5, volume);
deadbeef70ab1a12015-09-28 23:53:55712
713 // Disable the audio track, this should prevent setting the volume.
deadbeef70ab1a12015-09-28 23:53:55714 audio_track_->set_enabled(false);
Tommi4ccdf9322021-05-17 12:50:10715 RTC_DCHECK_EQ(worker_thread_, run_loop_.task_queue());
716 run_loop_.Flush();
Taylor Brandstetterba29c6a2016-06-27 23:30:35717 audio_track_->GetSource()->SetVolume(0.8);
Harald Alvestrand2f553702023-03-07 10:10:03718 EXPECT_TRUE(
719 voice_media_receive_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 23:30:35720 EXPECT_EQ(0, volume);
deadbeef70ab1a12015-09-28 23:53:55721
Taylor Brandstetterba29c6a2016-06-27 23:30:35722 // When the track is enabled, the previously set volume should take effect.
deadbeef70ab1a12015-09-28 23:53:55723 audio_track_->set_enabled(true);
Tommi4ccdf9322021-05-17 12:50:10724 run_loop_.Flush();
Harald Alvestrand2f553702023-03-07 10:10:03725 EXPECT_TRUE(
726 voice_media_receive_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 23:30:35727 EXPECT_EQ(0.8, volume);
deadbeef70ab1a12015-09-28 23:53:55728
Taylor Brandstetterba29c6a2016-06-27 23:30:35729 // Try changing volume one more time.
730 audio_track_->GetSource()->SetVolume(0.9);
Tommi4ccdf9322021-05-17 12:50:10731 run_loop_.Flush();
Harald Alvestrand2f553702023-03-07 10:10:03732 EXPECT_TRUE(
733 voice_media_receive_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 23:30:35734 EXPECT_EQ(0.9, volume);
deadbeef70ab1a12015-09-28 23:53:55735
736 DestroyAudioRtpReceiver();
737}
738
Ruslan Burakov4bac79e2019-04-03 17:55:33739TEST_F(RtpSenderReceiverTest, AudioRtpReceiverDelay) {
740 CreateAudioRtpReceiver();
Harald Alvestrandc0d44d92022-12-13 12:57:24741 VerifyRtpReceiverDelayBehaviour(
Harald Alvestrand2f553702023-03-07 10:10:03742 voice_media_receive_channel()->AsVoiceReceiveChannel(),
743 audio_rtp_receiver_.get(), kAudioSsrc);
Tommi4ccdf9322021-05-17 12:50:10744 DestroyAudioRtpReceiver();
Ruslan Burakov4bac79e2019-04-03 17:55:33745}
746
747TEST_F(RtpSenderReceiverTest, VideoRtpReceiverDelay) {
748 CreateVideoRtpReceiver();
Harald Alvestrandc0d44d92022-12-13 12:57:24749 VerifyRtpReceiverDelayBehaviour(
Harald Alvestrand2f553702023-03-07 10:10:03750 video_media_receive_channel()->AsVideoReceiveChannel(),
751 video_rtp_receiver_.get(), kVideoSsrc);
Tommi4ccdf9322021-05-17 12:50:10752 DestroyVideoRtpReceiver();
Ruslan Burakov4bac79e2019-04-03 17:55:33753}
754
Taylor Brandstetterba29c6a2016-06-27 23:30:35755// Test that the media channel isn't enabled for sending if the audio sender
756// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 19:26:01757TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-11 00:26:06758 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 19:26:01759 rtc::scoped_refptr<AudioTrackInterface> track =
760 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 23:30:35761
762 // Track but no SSRC.
Niels Möllerafb246b2022-04-20 12:26:50763 EXPECT_TRUE(audio_rtp_sender_->SetTrack(track.get()));
Taylor Brandstetterba29c6a2016-06-27 23:30:35764 VerifyVoiceChannelNoInput();
765
766 // SSRC but no track.
767 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
768 audio_rtp_sender_->SetSsrc(kAudioSsrc);
769 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 19:26:01770}
771
Taylor Brandstetterba29c6a2016-06-27 23:30:35772// Test that the media channel isn't enabled for sending if the video sender
773// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 19:26:01774TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-11 00:26:06775 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 23:30:35776
777 // Track but no SSRC.
Niels Möllerafb246b2022-04-20 12:26:50778 EXPECT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
Taylor Brandstetterba29c6a2016-06-27 23:30:35779 VerifyVideoChannelNoInput();
780
781 // SSRC but no track.
782 EXPECT_TRUE(video_rtp_sender_->SetTrack(nullptr));
783 video_rtp_sender_->SetSsrc(kVideoSsrc);
784 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 19:26:01785}
786
Taylor Brandstetterba29c6a2016-06-27 23:30:35787// Test that the media channel is enabled for sending when the audio sender
788// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 19:26:01789TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
Steve Anton02ee47c2018-01-11 00:26:06790 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 19:26:01791 rtc::scoped_refptr<AudioTrackInterface> track =
792 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 23:30:35793 audio_rtp_sender_->SetSsrc(kAudioSsrc);
Niels Möllerafb246b2022-04-20 12:26:50794 audio_rtp_sender_->SetTrack(track.get());
Taylor Brandstetterba29c6a2016-06-27 23:30:35795 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 19:26:01796
Taylor Brandstetterba29c6a2016-06-27 23:30:35797 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 19:26:01798}
799
Taylor Brandstetterba29c6a2016-06-27 23:30:35800// Test that the media channel is enabled for sending when the audio sender
801// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 19:26:01802TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
Steve Anton02ee47c2018-01-11 00:26:06803 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 19:26:01804 rtc::scoped_refptr<AudioTrackInterface> track =
805 AudioTrack::Create(kAudioTrackId, nullptr);
Niels Möllerafb246b2022-04-20 12:26:50806 audio_rtp_sender_->SetTrack(track.get());
Taylor Brandstetterba29c6a2016-06-27 23:30:35807 audio_rtp_sender_->SetSsrc(kAudioSsrc);
808 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 19:26:01809
Taylor Brandstetterba29c6a2016-06-27 23:30:35810 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 19:26:01811}
812
Taylor Brandstetterba29c6a2016-06-27 23:30:35813// Test that the media channel is enabled for sending when the video sender
814// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 19:26:01815TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
nisseaf510af2016-03-21 15:20:42816 AddVideoTrack();
Steve Anton02ee47c2018-01-11 00:26:06817 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 23:30:35818 video_rtp_sender_->SetSsrc(kVideoSsrc);
Niels Möllerafb246b2022-04-20 12:26:50819 video_rtp_sender_->SetTrack(video_track_.get());
Taylor Brandstetterba29c6a2016-06-27 23:30:35820 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 19:26:01821
Taylor Brandstetterba29c6a2016-06-27 23:30:35822 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 19:26:01823}
824
Taylor Brandstetterba29c6a2016-06-27 23:30:35825// Test that the media channel is enabled for sending when the video sender
826// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 19:26:01827TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
nisseaf510af2016-03-21 15:20:42828 AddVideoTrack();
Steve Anton02ee47c2018-01-11 00:26:06829 CreateVideoRtpSenderWithNoTrack();
Niels Möllerafb246b2022-04-20 12:26:50830 video_rtp_sender_->SetTrack(video_track_.get());
Taylor Brandstetterba29c6a2016-06-27 23:30:35831 video_rtp_sender_->SetSsrc(kVideoSsrc);
832 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 19:26:01833
Taylor Brandstetterba29c6a2016-06-27 23:30:35834 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 19:26:01835}
836
Taylor Brandstetterba29c6a2016-06-27 23:30:35837// Test that the media channel stops sending when the audio sender's SSRC is set
838// to 0.
deadbeeffac06552015-11-25 19:26:01839TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 23:30:35840 CreateAudioRtpSender();
deadbeeffac06552015-11-25 19:26:01841
Taylor Brandstetterba29c6a2016-06-27 23:30:35842 audio_rtp_sender_->SetSsrc(0);
843 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 19:26:01844}
845
Taylor Brandstetterba29c6a2016-06-27 23:30:35846// Test that the media channel stops sending when the video sender's SSRC is set
847// to 0.
deadbeeffac06552015-11-25 19:26:01848TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 23:30:35849 CreateAudioRtpSender();
deadbeeffac06552015-11-25 19:26:01850
Taylor Brandstetterba29c6a2016-06-27 23:30:35851 audio_rtp_sender_->SetSsrc(0);
852 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 19:26:01853}
854
Taylor Brandstetterba29c6a2016-06-27 23:30:35855// Test that the media channel stops sending when the audio sender's track is
856// set to null.
deadbeeffac06552015-11-25 19:26:01857TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 23:30:35858 CreateAudioRtpSender();
deadbeeffac06552015-11-25 19:26:01859
Taylor Brandstetterba29c6a2016-06-27 23:30:35860 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
861 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 19:26:01862}
863
Taylor Brandstetterba29c6a2016-06-27 23:30:35864// Test that the media channel stops sending when the video sender's track is
865// set to null.
deadbeeffac06552015-11-25 19:26:01866TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 23:30:35867 CreateVideoRtpSender();
deadbeeffac06552015-11-25 19:26:01868
Taylor Brandstetterba29c6a2016-06-27 23:30:35869 video_rtp_sender_->SetSsrc(0);
870 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 19:26:01871}
872
Taylor Brandstetterba29c6a2016-06-27 23:30:35873// Test that when the audio sender's SSRC is changed, the media channel stops
874// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 19:26:01875TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 23:30:35876 CreateAudioRtpSender();
deadbeeffac06552015-11-25 19:26:01877
Taylor Brandstetterba29c6a2016-06-27 23:30:35878 audio_rtp_sender_->SetSsrc(kAudioSsrc2);
879 VerifyVoiceChannelNoInput(kAudioSsrc);
880 VerifyVoiceChannelInput(kAudioSsrc2);
deadbeeffac06552015-11-25 19:26:01881
Taylor Brandstetterba29c6a2016-06-27 23:30:35882 audio_rtp_sender_ = nullptr;
883 VerifyVoiceChannelNoInput(kAudioSsrc2);
deadbeeffac06552015-11-25 19:26:01884}
885
Taylor Brandstetterba29c6a2016-06-27 23:30:35886// Test that when the audio sender's SSRC is changed, the media channel stops
887// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 19:26:01888TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 23:30:35889 CreateVideoRtpSender();
deadbeeffac06552015-11-25 19:26:01890
Taylor Brandstetterba29c6a2016-06-27 23:30:35891 video_rtp_sender_->SetSsrc(kVideoSsrc2);
892 VerifyVideoChannelNoInput(kVideoSsrc);
893 VerifyVideoChannelInput(kVideoSsrc2);
deadbeeffac06552015-11-25 19:26:01894
Taylor Brandstetterba29c6a2016-06-27 23:30:35895 video_rtp_sender_ = nullptr;
896 VerifyVideoChannelNoInput(kVideoSsrc2);
deadbeeffac06552015-11-25 19:26:01897}
898
skvladdc1c62c2016-03-17 02:07:43899TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) {
900 CreateAudioRtpSender();
901
skvladdc1c62c2016-03-17 02:07:43902 RtpParameters params = audio_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 23:30:35903 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 23:02:36904 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-17 02:07:43905
906 DestroyAudioRtpSender();
907}
908
Florent Castelliacabb362022-10-18 15:05:16909TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParametersAsync) {
910 CreateAudioRtpSender();
911
912 RtpParameters params = audio_rtp_sender_->GetParameters();
913 EXPECT_EQ(1u, params.encodings.size());
914 absl::optional<webrtc::RTCError> result;
915 audio_rtp_sender_->SetParametersAsync(
916 params, [&result](webrtc::RTCError error) { result = error; });
917 run_loop_.Flush();
918 EXPECT_TRUE(result->ok());
919
920 DestroyAudioRtpSender();
921}
922
Florent Castelli892acf02018-10-01 20:47:20923TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParametersBeforeNegotiation) {
Amit Hilbuchea7ef2a2019-02-19 23:20:21924 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 17:31:53925 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
Florent Castelli892acf02018-10-01 20:47:20926
927 RtpParameters params = audio_rtp_sender_->GetParameters();
928 ASSERT_EQ(1u, params.encodings.size());
929 params.encodings[0].max_bitrate_bps = 90000;
930 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
931
932 params = audio_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 20:47:20933 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
Florent Castelliacabb362022-10-18 15:05:16934 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
935
936 DestroyAudioRtpSender();
937}
938
939TEST_F(RtpSenderReceiverTest,
940 AudioSenderCanSetParametersAsyncBeforeNegotiation) {
941 audio_rtp_sender_ =
942 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
943
944 absl::optional<webrtc::RTCError> result;
945 RtpParameters params = audio_rtp_sender_->GetParameters();
946 ASSERT_EQ(1u, params.encodings.size());
947 params.encodings[0].max_bitrate_bps = 90000;
948
949 audio_rtp_sender_->SetParametersAsync(
950 params, [&result](webrtc::RTCError error) { result = error; });
951 run_loop_.Flush();
952 EXPECT_TRUE(result->ok());
953
954 params = audio_rtp_sender_->GetParameters();
955 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
956
957 audio_rtp_sender_->SetParametersAsync(
958 params, [&result](webrtc::RTCError error) { result = error; });
959 run_loop_.Flush();
960 EXPECT_TRUE(result->ok());
Florent Castelli892acf02018-10-01 20:47:20961
962 DestroyAudioRtpSender();
963}
964
965TEST_F(RtpSenderReceiverTest, AudioSenderInitParametersMovedAfterNegotiation) {
966 audio_track_ = AudioTrack::Create(kAudioTrackId, nullptr);
Harald Alvestrand2f7ad282022-04-21 11:35:43967 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
Florent Castelli892acf02018-10-01 20:47:20968
Guido Urdaneta1ff16c82019-05-20 17:31:53969 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 15:06:18970 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 17:31:53971 audio_rtp_sender_ = AudioRtpSender::Create(
972 worker_thread_, audio_track_->id(), nullptr, set_streams_observer.get());
Niels Möllerafb246b2022-04-20 12:26:50973 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_.get()));
Guido Urdaneta1ff16c82019-05-20 17:31:53974 EXPECT_CALL(*set_streams_observer, OnSetStreams());
975 audio_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli892acf02018-10-01 20:47:20976
977 std::vector<RtpEncodingParameters> init_encodings(1);
978 init_encodings[0].max_bitrate_bps = 60000;
979 audio_rtp_sender_->set_init_send_encodings(init_encodings);
980
981 RtpParameters params = audio_rtp_sender_->GetParameters();
982 ASSERT_EQ(1u, params.encodings.size());
983 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
984
985 // Simulate the setLocalDescription call
986 std::vector<uint32_t> ssrcs(1, 1);
987 cricket::StreamParams stream_params =
988 cricket::CreateSimStreamParams("cname", ssrcs);
Harald Alvestrand2f553702023-03-07 10:10:03989 voice_media_send_channel()->AddSendStream(stream_params);
Harald Alvestrandc0d44d92022-12-13 12:57:24990 audio_rtp_sender_->SetMediaChannel(
Harald Alvestrand2f553702023-03-07 10:10:03991 voice_media_send_channel()->AsVoiceSendChannel());
Florent Castelli892acf02018-10-01 20:47:20992 audio_rtp_sender_->SetSsrc(1);
993
994 params = audio_rtp_sender_->GetParameters();
995 ASSERT_EQ(1u, params.encodings.size());
996 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
997
998 DestroyAudioRtpSender();
999}
1000
1001TEST_F(RtpSenderReceiverTest,
1002 AudioSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
Amit Hilbuchea7ef2a2019-02-19 23:20:211003 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 17:31:531004 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
Florent Castelli892acf02018-10-01 20:47:201005
1006 RtpParameters params;
1007 RTCError result = audio_rtp_sender_->SetParameters(params);
1008 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1009 DestroyAudioRtpSender();
1010}
1011
Florent Castellicebf50f2018-05-03 13:31:531012TEST_F(RtpSenderReceiverTest,
1013 AudioSenderMustCallGetParametersBeforeSetParameters) {
1014 CreateAudioRtpSender();
1015
1016 RtpParameters params;
1017 RTCError result = audio_rtp_sender_->SetParameters(params);
1018 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1019
1020 DestroyAudioRtpSender();
1021}
1022
1023TEST_F(RtpSenderReceiverTest,
1024 AudioSenderSetParametersInvalidatesTransactionId) {
1025 CreateAudioRtpSender();
1026
1027 RtpParameters params = audio_rtp_sender_->GetParameters();
1028 EXPECT_EQ(1u, params.encodings.size());
1029 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
1030 RTCError result = audio_rtp_sender_->SetParameters(params);
1031 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1032
1033 DestroyAudioRtpSender();
1034}
1035
Florent Castelliacabb362022-10-18 15:05:161036TEST_F(RtpSenderReceiverTest,
1037 AudioSenderSetParametersAsyncInvalidatesTransactionId) {
1038 CreateAudioRtpSender();
1039
1040 RtpParameters params = audio_rtp_sender_->GetParameters();
1041 EXPECT_EQ(1u, params.encodings.size());
1042 absl::optional<webrtc::RTCError> result;
1043 audio_rtp_sender_->SetParametersAsync(
1044 params, [&result](webrtc::RTCError error) { result = error; });
1045 run_loop_.Flush();
1046 EXPECT_TRUE(result->ok());
1047 audio_rtp_sender_->SetParametersAsync(
1048 params, [&result](webrtc::RTCError error) { result = error; });
1049 run_loop_.Flush();
1050 EXPECT_EQ(RTCErrorType::INVALID_STATE, result->type());
1051
1052 DestroyAudioRtpSender();
1053}
1054
Florent Castellicebf50f2018-05-03 13:31:531055TEST_F(RtpSenderReceiverTest, AudioSenderDetectTransactionIdModification) {
1056 CreateAudioRtpSender();
1057
1058 RtpParameters params = audio_rtp_sender_->GetParameters();
1059 params.transaction_id = "";
1060 RTCError result = audio_rtp_sender_->SetParameters(params);
1061 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1062
1063 DestroyAudioRtpSender();
1064}
1065
1066TEST_F(RtpSenderReceiverTest, AudioSenderCheckTransactionIdRefresh) {
1067 CreateAudioRtpSender();
1068
1069 RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 10:53:231070 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 13:31:531071 auto saved_transaction_id = params.transaction_id;
1072 params = audio_rtp_sender_->GetParameters();
1073 EXPECT_NE(saved_transaction_id, params.transaction_id);
1074
1075 DestroyAudioRtpSender();
1076}
1077
1078TEST_F(RtpSenderReceiverTest, AudioSenderSetParametersOldValueFail) {
1079 CreateAudioRtpSender();
1080
1081 RtpParameters params = audio_rtp_sender_->GetParameters();
1082 RtpParameters second_params = audio_rtp_sender_->GetParameters();
1083
1084 RTCError result = audio_rtp_sender_->SetParameters(params);
1085 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
Seth Hampson2d2c8882018-05-16 23:02:321086 DestroyAudioRtpSender();
1087}
1088
1089TEST_F(RtpSenderReceiverTest, AudioSenderCantSetUnimplementedRtpParameters) {
1090 CreateAudioRtpSender();
1091 RtpParameters params = audio_rtp_sender_->GetParameters();
1092 EXPECT_EQ(1u, params.encodings.size());
1093
Florent Castelli87b3c512018-07-18 14:00:281094 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 23:02:321095 params.mid = "dummy_mid";
1096 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1097 audio_rtp_sender_->SetParameters(params).type());
1098 params = audio_rtp_sender_->GetParameters();
1099
Seth Hampson2d2c8882018-05-16 23:02:321100 DestroyAudioRtpSender();
1101}
1102
Taylor Brandstetterba29c6a2016-06-27 23:30:351103TEST_F(RtpSenderReceiverTest, SetAudioMaxSendBitrate) {
1104 CreateAudioRtpSender();
1105
Harald Alvestrand2f553702023-03-07 10:10:031106 EXPECT_EQ(-1, voice_media_send_channel()->max_bps());
Taylor Brandstetterba29c6a2016-06-27 23:30:351107 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 10:53:231108 EXPECT_EQ(1U, params.encodings.size());
deadbeefe702b302017-02-04 20:09:011109 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 09:54:271110 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 23:02:361111 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 23:30:351112
1113 // Read back the parameters and verify they have been changed.
1114 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 10:53:231115 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 09:54:271116 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 23:30:351117
1118 // Verify that the audio channel received the new parameters.
Harald Alvestrand2f553702023-03-07 10:10:031119 params = voice_media_send_channel()->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 10:53:231120 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 09:54:271121 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 23:30:351122
1123 // Verify that the global bitrate limit has not been changed.
Harald Alvestrand2f553702023-03-07 10:10:031124 EXPECT_EQ(-1, voice_media_send_channel()->max_bps());
Taylor Brandstetterba29c6a2016-06-27 23:30:351125
1126 DestroyAudioRtpSender();
1127}
1128
Seth Hampson24722b32017-12-22 17:36:421129TEST_F(RtpSenderReceiverTest, SetAudioBitratePriority) {
1130 CreateAudioRtpSender();
1131
1132 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 10:53:231133 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 17:36:421134 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1135 params.encodings[0].bitrate_priority);
1136 double new_bitrate_priority = 2.0;
1137 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 23:02:361138 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 17:36:421139
1140 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 10:53:231141 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 17:36:421142 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1143
Harald Alvestrand2f553702023-03-07 10:10:031144 params = voice_media_send_channel()->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 10:53:231145 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 17:36:421146 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1147
1148 DestroyAudioRtpSender();
1149}
1150
skvladdc1c62c2016-03-17 02:07:431151TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) {
1152 CreateVideoRtpSender();
1153
skvladdc1c62c2016-03-17 02:07:431154 RtpParameters params = video_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 23:30:351155 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 23:02:361156 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-17 02:07:431157
1158 DestroyVideoRtpSender();
1159}
1160
Florent Castelliacabb362022-10-18 15:05:161161TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParametersAsync) {
1162 CreateVideoRtpSender();
1163
1164 RtpParameters params = video_rtp_sender_->GetParameters();
1165 EXPECT_EQ(1u, params.encodings.size());
1166 absl::optional<webrtc::RTCError> result;
1167 video_rtp_sender_->SetParametersAsync(
1168 params, [&result](webrtc::RTCError error) { result = error; });
1169 run_loop_.Flush();
1170 EXPECT_TRUE(result->ok());
1171
1172 DestroyVideoRtpSender();
1173}
1174
Florent Castelli892acf02018-10-01 20:47:201175TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParametersBeforeNegotiation) {
Guido Urdaneta1ff16c82019-05-20 17:31:531176 video_rtp_sender_ =
1177 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Florent Castelli892acf02018-10-01 20:47:201178
1179 RtpParameters params = video_rtp_sender_->GetParameters();
1180 ASSERT_EQ(1u, params.encodings.size());
1181 params.encodings[0].max_bitrate_bps = 90000;
1182 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1183
1184 params = video_rtp_sender_->GetParameters();
1185 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1186 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
1187
1188 DestroyVideoRtpSender();
1189}
1190
Florent Castelliacabb362022-10-18 15:05:161191TEST_F(RtpSenderReceiverTest,
1192 VideoSenderCanSetParametersAsyncBeforeNegotiation) {
1193 video_rtp_sender_ =
1194 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
1195
1196 absl::optional<webrtc::RTCError> result;
1197 RtpParameters params = video_rtp_sender_->GetParameters();
1198 ASSERT_EQ(1u, params.encodings.size());
1199 params.encodings[0].max_bitrate_bps = 90000;
1200 video_rtp_sender_->SetParametersAsync(
1201 params, [&result](webrtc::RTCError error) { result = error; });
1202 run_loop_.Flush();
1203 EXPECT_TRUE(result->ok());
1204
1205 params = video_rtp_sender_->GetParameters();
1206 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
1207 video_rtp_sender_->SetParametersAsync(
1208 params, [&result](webrtc::RTCError error) { result = error; });
1209 run_loop_.Flush();
1210 EXPECT_TRUE(result->ok());
1211
1212 DestroyVideoRtpSender();
1213}
1214
Florent Castelli892acf02018-10-01 20:47:201215TEST_F(RtpSenderReceiverTest, VideoSenderInitParametersMovedAfterNegotiation) {
1216 AddVideoTrack(false);
1217
Guido Urdaneta1ff16c82019-05-20 17:31:531218 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 15:06:181219 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 17:31:531220 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1221 set_streams_observer.get());
Niels Möllerafb246b2022-04-20 12:26:501222 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
Guido Urdaneta1ff16c82019-05-20 17:31:531223 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1224 video_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli892acf02018-10-01 20:47:201225
1226 std::vector<RtpEncodingParameters> init_encodings(2);
1227 init_encodings[0].max_bitrate_bps = 60000;
1228 init_encodings[1].max_bitrate_bps = 900000;
1229 video_rtp_sender_->set_init_send_encodings(init_encodings);
1230
1231 RtpParameters params = video_rtp_sender_->GetParameters();
1232 ASSERT_EQ(2u, params.encodings.size());
1233 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1234 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
1235
1236 // Simulate the setLocalDescription call
1237 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 09:11:531238 ssrcs.reserve(2);
Florent Castelli892acf02018-10-01 20:47:201239 for (int i = 0; i < 2; ++i)
1240 ssrcs.push_back(kVideoSsrcSimulcast + i);
1241 cricket::StreamParams stream_params =
1242 cricket::CreateSimStreamParams("cname", ssrcs);
Harald Alvestrand2f553702023-03-07 10:10:031243 video_media_send_channel()->AddSendStream(stream_params);
Harald Alvestrandc0d44d92022-12-13 12:57:241244 video_rtp_sender_->SetMediaChannel(
Harald Alvestrand2f553702023-03-07 10:10:031245 video_media_send_channel()->AsVideoSendChannel());
Florent Castelli892acf02018-10-01 20:47:201246 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
1247
1248 params = video_rtp_sender_->GetParameters();
1249 ASSERT_EQ(2u, params.encodings.size());
1250 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1251 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
1252
1253 DestroyVideoRtpSender();
1254}
1255
1256TEST_F(RtpSenderReceiverTest,
1257 VideoSenderInitParametersMovedAfterManualSimulcastAndNegotiation) {
1258 AddVideoTrack(false);
1259
Guido Urdaneta1ff16c82019-05-20 17:31:531260 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 15:06:181261 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 17:31:531262 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1263 set_streams_observer.get());
Niels Möllerafb246b2022-04-20 12:26:501264 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
Guido Urdaneta1ff16c82019-05-20 17:31:531265 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1266 video_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli892acf02018-10-01 20:47:201267
1268 std::vector<RtpEncodingParameters> init_encodings(1);
1269 init_encodings[0].max_bitrate_bps = 60000;
1270 video_rtp_sender_->set_init_send_encodings(init_encodings);
1271
1272 RtpParameters params = video_rtp_sender_->GetParameters();
1273 ASSERT_EQ(1u, params.encodings.size());
1274 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1275
1276 // Simulate the setLocalDescription call as if the user used SDP munging
1277 // to enable simulcast
1278 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 09:11:531279 ssrcs.reserve(2);
Florent Castelli892acf02018-10-01 20:47:201280 for (int i = 0; i < 2; ++i)
1281 ssrcs.push_back(kVideoSsrcSimulcast + i);
1282 cricket::StreamParams stream_params =
1283 cricket::CreateSimStreamParams("cname", ssrcs);
Harald Alvestrand2f553702023-03-07 10:10:031284 video_media_send_channel()->AddSendStream(stream_params);
Harald Alvestrandc0d44d92022-12-13 12:57:241285 video_rtp_sender_->SetMediaChannel(
Harald Alvestrand2f553702023-03-07 10:10:031286 video_media_send_channel()->AsVideoSendChannel());
Florent Castelli892acf02018-10-01 20:47:201287 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
1288
1289 params = video_rtp_sender_->GetParameters();
1290 ASSERT_EQ(2u, params.encodings.size());
1291 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1292
1293 DestroyVideoRtpSender();
1294}
1295
Harald Alvestrand3fe8b0d2022-07-01 07:36:591296#if GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
1297using RtpSenderReceiverDeathTest = RtpSenderReceiverTest;
1298
1299TEST_F(RtpSenderReceiverDeathTest,
1300 VideoSenderManualRemoveSimulcastFailsDeathTest) {
1301 AddVideoTrack(false);
1302
1303 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
1304 std::make_unique<MockSetStreamsObserver>();
1305 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1306 set_streams_observer.get());
1307 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
1308 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1309 video_rtp_sender_->SetStreams({local_stream_->id()});
1310
1311 std::vector<RtpEncodingParameters> init_encodings(2);
1312 init_encodings[0].max_bitrate_bps = 60000;
1313 init_encodings[1].max_bitrate_bps = 120000;
1314 video_rtp_sender_->set_init_send_encodings(init_encodings);
1315
1316 RtpParameters params = video_rtp_sender_->GetParameters();
1317 ASSERT_EQ(2u, params.encodings.size());
1318 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1319
1320 // Simulate the setLocalDescription call as if the user used SDP munging
1321 // to disable simulcast.
1322 std::vector<uint32_t> ssrcs;
1323 ssrcs.reserve(2);
1324 for (int i = 0; i < 2; ++i)
1325 ssrcs.push_back(kVideoSsrcSimulcast + i);
1326 cricket::StreamParams stream_params =
1327 cricket::StreamParams::CreateLegacy(kVideoSsrc);
Harald Alvestrand2f553702023-03-07 10:10:031328 video_media_send_channel()->AddSendStream(stream_params);
Harald Alvestrandc0d44d92022-12-13 12:57:241329 video_rtp_sender_->SetMediaChannel(
Harald Alvestrand2f553702023-03-07 10:10:031330 video_media_send_channel()->AsVideoSendChannel());
Harald Alvestrand3fe8b0d2022-07-01 07:36:591331 EXPECT_DEATH(video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast), "");
1332}
1333#endif
1334
Florent Castelli892acf02018-10-01 20:47:201335TEST_F(RtpSenderReceiverTest,
1336 VideoSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
Guido Urdaneta1ff16c82019-05-20 17:31:531337 video_rtp_sender_ =
1338 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Florent Castelli892acf02018-10-01 20:47:201339
1340 RtpParameters params;
1341 RTCError result = video_rtp_sender_->SetParameters(params);
1342 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1343 DestroyVideoRtpSender();
1344}
1345
Florent Castellicebf50f2018-05-03 13:31:531346TEST_F(RtpSenderReceiverTest,
1347 VideoSenderMustCallGetParametersBeforeSetParameters) {
1348 CreateVideoRtpSender();
1349
1350 RtpParameters params;
1351 RTCError result = video_rtp_sender_->SetParameters(params);
1352 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1353
1354 DestroyVideoRtpSender();
1355}
1356
1357TEST_F(RtpSenderReceiverTest,
1358 VideoSenderSetParametersInvalidatesTransactionId) {
1359 CreateVideoRtpSender();
1360
1361 RtpParameters params = video_rtp_sender_->GetParameters();
1362 EXPECT_EQ(1u, params.encodings.size());
1363 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1364 RTCError result = video_rtp_sender_->SetParameters(params);
1365 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1366
1367 DestroyVideoRtpSender();
1368}
1369
Florent Castelliacabb362022-10-18 15:05:161370TEST_F(RtpSenderReceiverTest,
1371 VideoSenderSetParametersAsyncInvalidatesTransactionId) {
1372 CreateVideoRtpSender();
1373
1374 RtpParameters params = video_rtp_sender_->GetParameters();
1375 EXPECT_EQ(1u, params.encodings.size());
1376 absl::optional<webrtc::RTCError> result;
1377 video_rtp_sender_->SetParametersAsync(
1378 params, [&result](webrtc::RTCError error) { result = error; });
1379 run_loop_.Flush();
1380 EXPECT_TRUE(result->ok());
1381 video_rtp_sender_->SetParametersAsync(
1382 params, [&result](webrtc::RTCError error) { result = error; });
1383 run_loop_.Flush();
1384 EXPECT_EQ(RTCErrorType::INVALID_STATE, result->type());
1385
1386 DestroyVideoRtpSender();
1387}
1388
Florent Castellicebf50f2018-05-03 13:31:531389TEST_F(RtpSenderReceiverTest, VideoSenderDetectTransactionIdModification) {
1390 CreateVideoRtpSender();
1391
1392 RtpParameters params = video_rtp_sender_->GetParameters();
1393 params.transaction_id = "";
1394 RTCError result = video_rtp_sender_->SetParameters(params);
1395 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1396
1397 DestroyVideoRtpSender();
1398}
1399
1400TEST_F(RtpSenderReceiverTest, VideoSenderCheckTransactionIdRefresh) {
1401 CreateVideoRtpSender();
1402
1403 RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 10:53:231404 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 13:31:531405 auto saved_transaction_id = params.transaction_id;
1406 params = video_rtp_sender_->GetParameters();
1407 EXPECT_NE(saved_transaction_id, params.transaction_id);
1408
1409 DestroyVideoRtpSender();
1410}
1411
1412TEST_F(RtpSenderReceiverTest, VideoSenderSetParametersOldValueFail) {
1413 CreateVideoRtpSender();
1414
1415 RtpParameters params = video_rtp_sender_->GetParameters();
1416 RtpParameters second_params = video_rtp_sender_->GetParameters();
1417
1418 RTCError result = video_rtp_sender_->SetParameters(params);
1419 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1420
1421 DestroyVideoRtpSender();
1422}
1423
Seth Hampson2d2c8882018-05-16 23:02:321424TEST_F(RtpSenderReceiverTest, VideoSenderCantSetUnimplementedRtpParameters) {
1425 CreateVideoRtpSender();
1426 RtpParameters params = video_rtp_sender_->GetParameters();
1427 EXPECT_EQ(1u, params.encodings.size());
1428
Florent Castelli87b3c512018-07-18 14:00:281429 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 23:02:321430 params.mid = "dummy_mid";
1431 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1432 video_rtp_sender_->SetParameters(params).type());
1433 params = video_rtp_sender_->GetParameters();
1434
Seth Hampson2d2c8882018-05-16 23:02:321435 DestroyVideoRtpSender();
1436}
1437
Florent Castellic1a0bcb2019-01-29 13:26:481438TEST_F(RtpSenderReceiverTest, VideoSenderCanSetScaleResolutionDownBy) {
1439 CreateVideoRtpSender();
1440
1441 RtpParameters params = video_rtp_sender_->GetParameters();
1442 params.encodings[0].scale_resolution_down_by = 2;
1443
1444 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1445 params = video_rtp_sender_->GetParameters();
1446 EXPECT_EQ(2, params.encodings[0].scale_resolution_down_by);
1447
1448 DestroyVideoRtpSender();
1449}
1450
1451TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidScaleResolutionDownBy) {
1452 CreateVideoRtpSender();
1453
1454 RtpParameters params = video_rtp_sender_->GetParameters();
1455 params.encodings[0].scale_resolution_down_by = 0.5;
1456 RTCError result = video_rtp_sender_->SetParameters(params);
1457 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1458
1459 DestroyVideoRtpSender();
1460}
1461
Ă…sa Perssonfb195962021-08-16 14:41:561462TEST_F(RtpSenderReceiverTest, VideoSenderCanSetNumTemporalLayers) {
1463 CreateVideoRtpSender();
1464
1465 RtpParameters params = video_rtp_sender_->GetParameters();
1466 params.encodings[0].num_temporal_layers = 2;
1467
1468 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1469 params = video_rtp_sender_->GetParameters();
1470 EXPECT_EQ(2, params.encodings[0].num_temporal_layers);
1471
1472 DestroyVideoRtpSender();
1473}
1474
1475TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidNumTemporalLayers) {
1476 CreateVideoRtpSender();
1477
1478 RtpParameters params = video_rtp_sender_->GetParameters();
1479 params.encodings[0].num_temporal_layers = webrtc::kMaxTemporalStreams + 1;
1480 RTCError result = video_rtp_sender_->SetParameters(params);
1481 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1482
1483 DestroyVideoRtpSender();
1484}
1485
Florent Castelli907dc802019-12-06 14:03:191486TEST_F(RtpSenderReceiverTest, VideoSenderCanSetMaxFramerate) {
1487 CreateVideoRtpSender();
1488
1489 RtpParameters params = video_rtp_sender_->GetParameters();
1490 params.encodings[0].max_framerate = 20;
1491
1492 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1493 params = video_rtp_sender_->GetParameters();
1494 EXPECT_EQ(20., params.encodings[0].max_framerate);
1495
1496 DestroyVideoRtpSender();
1497}
1498
1499TEST_F(RtpSenderReceiverTest, VideoSenderCanSetMaxFramerateZero) {
1500 CreateVideoRtpSender();
1501
1502 RtpParameters params = video_rtp_sender_->GetParameters();
1503 params.encodings[0].max_framerate = 0.;
1504
1505 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1506 params = video_rtp_sender_->GetParameters();
1507 EXPECT_EQ(0., params.encodings[0].max_framerate);
1508
1509 DestroyVideoRtpSender();
1510}
1511
1512TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidMaxFramerate) {
1513 CreateVideoRtpSender();
1514
1515 RtpParameters params = video_rtp_sender_->GetParameters();
1516 params.encodings[0].max_framerate = -5.;
1517 RTCError result = video_rtp_sender_->SetParameters(params);
1518 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1519
1520 DestroyVideoRtpSender();
1521}
1522
Seth Hampson2d2c8882018-05-16 23:02:321523// A video sender can have multiple simulcast layers, in which case it will
1524// contain multiple RtpEncodingParameters. This tests that if this is the case
1525// (simulcast), then we can't set the bitrate_priority, or max_bitrate_bps
1526// for any encodings besides at index 0, because these are both implemented
1527// "per-sender."
1528TEST_F(RtpSenderReceiverTest, VideoSenderCantSetPerSenderEncodingParameters) {
1529 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 20:47:201530 CreateVideoRtpSenderWithSimulcast();
Seth Hampson2d2c8882018-05-16 23:02:321531 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 20:47:201532 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Seth Hampson2d2c8882018-05-16 23:02:321533
1534 params.encodings[1].bitrate_priority = 2.0;
1535 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1536 video_rtp_sender_->SetParameters(params).type());
1537 params = video_rtp_sender_->GetParameters();
1538
Seth Hampson2d2c8882018-05-16 23:02:321539 DestroyVideoRtpSender();
1540}
1541
Florent Castelli892acf02018-10-01 20:47:201542TEST_F(RtpSenderReceiverTest, VideoSenderCantSetReadOnlyEncodingParameters) {
1543 // Add a simulcast specific send stream that contains 2 encoding parameters.
1544 CreateVideoRtpSenderWithSimulcast();
1545 RtpParameters params = video_rtp_sender_->GetParameters();
1546 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
1547
1548 for (size_t i = 0; i < params.encodings.size(); i++) {
1549 params.encodings[i].ssrc = 1337;
1550 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION,
1551 video_rtp_sender_->SetParameters(params).type());
1552 params = video_rtp_sender_->GetParameters();
1553 }
1554
1555 DestroyVideoRtpSender();
1556}
1557
Ă…sa Persson55659812018-06-18 15:51:321558TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrate) {
Taylor Brandstetterba29c6a2016-06-27 23:30:351559 CreateVideoRtpSender();
1560
Harald Alvestrand2f553702023-03-07 10:10:031561 EXPECT_EQ(-1, video_media_send_channel()->max_bps());
Taylor Brandstetterba29c6a2016-06-27 23:30:351562 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 10:53:231563 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 15:51:321564 EXPECT_FALSE(params.encodings[0].min_bitrate_bps);
deadbeefe702b302017-02-04 20:09:011565 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Ă…sa Persson55659812018-06-18 15:51:321566 params.encodings[0].min_bitrate_bps = 100;
Oskar Sundbom36f8f3e2017-11-16 09:54:271567 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 23:02:361568 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 23:30:351569
1570 // Read back the parameters and verify they have been changed.
1571 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 10:53:231572 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 15:51:321573 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 09:54:271574 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 23:30:351575
1576 // Verify that the video channel received the new parameters.
Harald Alvestrand2f553702023-03-07 10:10:031577 params = video_media_send_channel()->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 10:53:231578 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 15:51:321579 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 09:54:271580 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 23:30:351581
1582 // Verify that the global bitrate limit has not been changed.
Harald Alvestrand2f553702023-03-07 10:10:031583 EXPECT_EQ(-1, video_media_send_channel()->max_bps());
Taylor Brandstetterba29c6a2016-06-27 23:30:351584
1585 DestroyVideoRtpSender();
1586}
1587
Ă…sa Persson55659812018-06-18 15:51:321588TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrateSimulcast) {
1589 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 20:47:201590 CreateVideoRtpSenderWithSimulcast();
Ă…sa Persson55659812018-06-18 15:51:321591
1592 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 20:47:201593 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 15:51:321594 params.encodings[0].min_bitrate_bps = 100;
1595 params.encodings[0].max_bitrate_bps = 1000;
1596 params.encodings[1].min_bitrate_bps = 200;
1597 params.encodings[1].max_bitrate_bps = 2000;
1598 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1599
1600 // Verify that the video channel received the new parameters.
Harald Alvestrand2f553702023-03-07 10:10:031601 params =
1602 video_media_send_channel()->GetRtpSendParameters(kVideoSsrcSimulcast);
Florent Castelli892acf02018-10-01 20:47:201603 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 15:51:321604 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
1605 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
1606 EXPECT_EQ(200, params.encodings[1].min_bitrate_bps);
1607 EXPECT_EQ(2000, params.encodings[1].max_bitrate_bps);
1608
1609 DestroyVideoRtpSender();
1610}
1611
Seth Hampson24722b32017-12-22 17:36:421612TEST_F(RtpSenderReceiverTest, SetVideoBitratePriority) {
1613 CreateVideoRtpSender();
1614
1615 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 10:53:231616 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 17:36:421617 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1618 params.encodings[0].bitrate_priority);
1619 double new_bitrate_priority = 2.0;
1620 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 23:02:361621 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 17:36:421622
1623 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 10:53:231624 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 17:36:421625 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1626
Harald Alvestrand2f553702023-03-07 10:10:031627 params = video_media_send_channel()->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 10:53:231628 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 17:36:421629 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1630
1631 DestroyVideoRtpSender();
1632}
1633
Florent Castelli38332cd2018-11-20 13:08:061634TEST_F(RtpSenderReceiverTest, VideoReceiverCanGetParametersWithSimulcast) {
1635 CreateVideoRtpReceiverWithSimulcast({}, 2);
1636
1637 RtpParameters params = video_rtp_receiver_->GetParameters();
1638 EXPECT_EQ(2u, params.encodings.size());
1639
1640 DestroyVideoRtpReceiver();
1641}
1642
Philipp Hanckeb83cd922022-11-09 10:06:381643TEST_F(RtpSenderReceiverTest, GenerateKeyFrameWithAudio) {
1644 CreateAudioRtpSender();
1645
1646 auto error = audio_rtp_sender_->GenerateKeyFrame({});
1647 EXPECT_FALSE(error.ok());
1648 EXPECT_EQ(error.type(), RTCErrorType::UNSUPPORTED_OPERATION);
1649
1650 DestroyAudioRtpSender();
1651}
1652
1653TEST_F(RtpSenderReceiverTest, GenerateKeyFrameWithVideo) {
1654 CreateVideoRtpSenderWithSimulcast({"1", "2", "3"});
1655
1656 auto error = video_rtp_sender_->GenerateKeyFrame({});
1657 EXPECT_TRUE(error.ok());
1658
1659 error = video_rtp_sender_->GenerateKeyFrame({"1"});
1660 EXPECT_TRUE(error.ok());
1661
1662 error = video_rtp_sender_->GenerateKeyFrame({""});
1663 EXPECT_FALSE(error.ok());
1664 EXPECT_EQ(error.type(), RTCErrorType::INVALID_PARAMETER);
1665
1666 error = video_rtp_sender_->GenerateKeyFrame({"no-such-rid"});
1667 EXPECT_FALSE(error.ok());
1668 EXPECT_EQ(error.type(), RTCErrorType::INVALID_PARAMETER);
1669
1670 DestroyVideoRtpSender();
1671}
1672
pbos5214a0a2016-12-16 23:39:111673// Test that makes sure that a video track content hint translates to the proper
1674// value for sources that are not screencast.
1675TEST_F(RtpSenderReceiverTest, PropagatesVideoTrackContentHint) {
1676 CreateVideoRtpSender();
1677
1678 video_track_->set_enabled(true);
1679
Artem Titov880fa812021-07-30 20:30:231680 // `video_track_` is not screencast by default.
Harald Alvestrand2f553702023-03-07 10:10:031681 EXPECT_EQ(false, video_media_send_channel()->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111682 // No content hint should be set by default.
1683 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1684 video_track_->content_hint());
1685 // Setting detailed should turn a non-screencast source into screencast mode.
1686 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Harald Alvestrand2f553702023-03-07 10:10:031687 EXPECT_EQ(true, video_media_send_channel()->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111688 // Removing the content hint should turn the track back into non-screencast
1689 // mode.
1690 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Harald Alvestrand2f553702023-03-07 10:10:031691 EXPECT_EQ(false, video_media_send_channel()->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111692 // Setting fluid should remain in non-screencast mode (its default).
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);
Harald Alvestrandc19ab072018-06-18 06:53:101695 // Setting text should have the same effect as Detailed
1696 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
Harald Alvestrand2f553702023-03-07 10:10:031697 EXPECT_EQ(true, video_media_send_channel()->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111698
1699 DestroyVideoRtpSender();
1700}
1701
1702// Test that makes sure that a video track content hint translates to the proper
1703// value for screencast sources.
1704TEST_F(RtpSenderReceiverTest,
1705 PropagatesVideoTrackContentHintForScreencastSource) {
1706 CreateVideoRtpSender(true);
1707
1708 video_track_->set_enabled(true);
1709
Artem Titov880fa812021-07-30 20:30:231710 // `video_track_` with a screencast source should be screencast by default.
Harald Alvestrand2f553702023-03-07 10:10:031711 EXPECT_EQ(true, video_media_send_channel()->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111712 // No content hint should be set by default.
1713 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1714 video_track_->content_hint());
1715 // Setting fluid should turn a screencast source into non-screencast mode.
1716 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Harald Alvestrand2f553702023-03-07 10:10:031717 EXPECT_EQ(false, video_media_send_channel()->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111718 // Removing the content hint should turn the track back into screencast mode.
1719 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Harald Alvestrand2f553702023-03-07 10:10:031720 EXPECT_EQ(true, video_media_send_channel()->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111721 // Setting detailed should still remain in screencast mode (its default).
1722 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Harald Alvestrand2f553702023-03-07 10:10:031723 EXPECT_EQ(true, video_media_send_channel()->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 06:53:101724 // Setting text should have the same effect as Detailed
1725 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
Harald Alvestrand2f553702023-03-07 10:10:031726 EXPECT_EQ(true, video_media_send_channel()->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111727
1728 DestroyVideoRtpSender();
1729}
1730
1731// Test that makes sure any content hints that are set on a track before
1732// VideoRtpSender is ready to send are still applied when it gets ready to send.
1733TEST_F(RtpSenderReceiverTest,
1734 PropagatesVideoTrackContentHintSetBeforeEnabling) {
1735 AddVideoTrack();
Guido Urdaneta1ff16c82019-05-20 17:31:531736 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 15:06:181737 std::make_unique<MockSetStreamsObserver>();
pbos5214a0a2016-12-16 23:39:111738 // Setting detailed overrides the default non-screencast mode. This should be
1739 // applied even if the track is set on construction.
1740 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Guido Urdaneta1ff16c82019-05-20 17:31:531741 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1742 set_streams_observer.get());
Niels Möllerafb246b2022-04-20 12:26:501743 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
Guido Urdaneta1ff16c82019-05-20 17:31:531744 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1745 video_rtp_sender_->SetStreams({local_stream_->id()});
Harald Alvestrandc0d44d92022-12-13 12:57:241746 video_rtp_sender_->SetMediaChannel(
Harald Alvestrand2f553702023-03-07 10:10:031747 video_media_send_channel()->AsVideoSendChannel());
pbos5214a0a2016-12-16 23:39:111748 video_track_->set_enabled(true);
1749
1750 // Sender is not ready to send (no SSRC) so no option should have been set.
Harald Alvestrand2f553702023-03-07 10:10:031751 EXPECT_EQ(absl::nullopt, video_media_send_channel()->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111752
1753 // Verify that the content hint is accounted for when video_rtp_sender_ does
1754 // get enabled.
1755 video_rtp_sender_->SetSsrc(kVideoSsrc);
Harald Alvestrand2f553702023-03-07 10:10:031756 EXPECT_EQ(true, video_media_send_channel()->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111757
1758 // And removing the hint should go back to false (to verify that false was
1759 // default correctly).
1760 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Harald Alvestrand2f553702023-03-07 10:10:031761 EXPECT_EQ(false, video_media_send_channel()->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111762
1763 DestroyVideoRtpSender();
1764}
1765
deadbeef20cb0c12017-02-02 04:27:001766TEST_F(RtpSenderReceiverTest, AudioSenderHasDtmfSender) {
1767 CreateAudioRtpSender();
1768 EXPECT_NE(nullptr, audio_rtp_sender_->GetDtmfSender());
1769}
1770
1771TEST_F(RtpSenderReceiverTest, VideoSenderDoesNotHaveDtmfSender) {
1772 CreateVideoRtpSender();
1773 EXPECT_EQ(nullptr, video_rtp_sender_->GetDtmfSender());
1774}
1775
Artem Titov880fa812021-07-30 20:30:231776// Test that the DTMF sender is really using `voice_channel_`, and thus returns
1777// true/false from CanSendDtmf based on what `voice_channel_` returns.
deadbeef20cb0c12017-02-02 04:27:001778TEST_F(RtpSenderReceiverTest, CanInsertDtmf) {
1779 AddDtmfCodec();
1780 CreateAudioRtpSender();
1781 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1782 ASSERT_NE(nullptr, dtmf_sender);
1783 EXPECT_TRUE(dtmf_sender->CanInsertDtmf());
1784}
1785
1786TEST_F(RtpSenderReceiverTest, CanNotInsertDtmf) {
1787 CreateAudioRtpSender();
1788 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1789 ASSERT_NE(nullptr, dtmf_sender);
1790 // DTMF codec has not been added, as it was in the above test.
1791 EXPECT_FALSE(dtmf_sender->CanInsertDtmf());
1792}
1793
1794TEST_F(RtpSenderReceiverTest, InsertDtmf) {
1795 AddDtmfCodec();
1796 CreateAudioRtpSender();
1797 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1798 ASSERT_NE(nullptr, dtmf_sender);
1799
Harald Alvestrand2f553702023-03-07 10:10:031800 EXPECT_EQ(0U, voice_media_send_channel()->dtmf_info_queue().size());
deadbeef20cb0c12017-02-02 04:27:001801
1802 // Insert DTMF
1803 const int expected_duration = 90;
1804 dtmf_sender->InsertDtmf("012", expected_duration, 100);
1805
1806 // Verify
Harald Alvestrand2f553702023-03-07 10:10:031807 ASSERT_EQ_WAIT(3U, voice_media_send_channel()->dtmf_info_queue().size(),
deadbeef20cb0c12017-02-02 04:27:001808 kDefaultTimeout);
1809 const uint32_t send_ssrc =
Harald Alvestrand2f553702023-03-07 10:10:031810 voice_media_send_channel()->send_streams()[0].first_ssrc();
1811 EXPECT_TRUE(CompareDtmfInfo(voice_media_send_channel()->dtmf_info_queue()[0],
deadbeef20cb0c12017-02-02 04:27:001812 send_ssrc, 0, expected_duration));
Harald Alvestrand2f553702023-03-07 10:10:031813 EXPECT_TRUE(CompareDtmfInfo(voice_media_send_channel()->dtmf_info_queue()[1],
deadbeef20cb0c12017-02-02 04:27:001814 send_ssrc, 1, expected_duration));
Harald Alvestrand2f553702023-03-07 10:10:031815 EXPECT_TRUE(CompareDtmfInfo(voice_media_send_channel()->dtmf_info_queue()[2],
deadbeef20cb0c12017-02-02 04:27:001816 send_ssrc, 2, expected_duration));
1817}
1818
Benjamin Wright84583f62018-10-04 21:22:341819// Validate that the default FrameEncryptor setting is nullptr.
1820TEST_F(RtpSenderReceiverTest, AudioSenderCanSetFrameEncryptor) {
1821 CreateAudioRtpSender();
1822 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1823 new FakeFrameEncryptor());
1824 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1825 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1826 EXPECT_EQ(fake_frame_encryptor.get(),
1827 audio_rtp_sender_->GetFrameEncryptor().get());
1828}
1829
Benjamin Wrightc462a6e2018-10-26 20:16:161830// Validate that setting a FrameEncryptor after the send stream is stopped does
1831// nothing.
1832TEST_F(RtpSenderReceiverTest, AudioSenderCannotSetFrameEncryptorAfterStop) {
1833 CreateAudioRtpSender();
1834 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1835 new FakeFrameEncryptor());
1836 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1837 audio_rtp_sender_->Stop();
1838 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1839 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1840}
1841
Benjamin Wright84583f62018-10-04 21:22:341842// Validate that the default FrameEncryptor setting is nullptr.
1843TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetFrameDecryptor) {
1844 CreateAudioRtpReceiver();
1845 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
Tomas Gunnarssonb3517fe2022-03-18 18:32:381846 rtc::make_ref_counted<FakeFrameDecryptor>());
Benjamin Wright84583f62018-10-04 21:22:341847 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
1848 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1849 EXPECT_EQ(fake_frame_decryptor.get(),
1850 audio_rtp_receiver_->GetFrameDecryptor().get());
Tommi4ccdf9322021-05-17 12:50:101851 DestroyAudioRtpReceiver();
Benjamin Wright84583f62018-10-04 21:22:341852}
1853
Benjamin Wrightc462a6e2018-10-26 20:16:161854// Validate that the default FrameEncryptor setting is nullptr.
1855TEST_F(RtpSenderReceiverTest, AudioReceiverCannotSetFrameDecryptorAfterStop) {
1856 CreateAudioRtpReceiver();
1857 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
Tomas Gunnarssonb3517fe2022-03-18 18:32:381858 rtc::make_ref_counted<FakeFrameDecryptor>());
Benjamin Wrightc462a6e2018-10-26 20:16:161859 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
Tommi6589def2022-02-17 22:36:471860 audio_rtp_receiver_->SetMediaChannel(nullptr);
Benjamin Wrightc462a6e2018-10-26 20:16:161861 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1862 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
Tommi4ccdf9322021-05-17 12:50:101863 DestroyAudioRtpReceiver();
Benjamin Wrightc462a6e2018-10-26 20:16:161864}
1865
1866// Validate that the default FrameEncryptor setting is nullptr.
1867TEST_F(RtpSenderReceiverTest, VideoSenderCanSetFrameEncryptor) {
1868 CreateVideoRtpSender();
1869 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1870 new FakeFrameEncryptor());
1871 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1872 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1873 EXPECT_EQ(fake_frame_encryptor.get(),
1874 video_rtp_sender_->GetFrameEncryptor().get());
1875}
1876
1877// Validate that setting a FrameEncryptor after the send stream is stopped does
1878// nothing.
1879TEST_F(RtpSenderReceiverTest, VideoSenderCannotSetFrameEncryptorAfterStop) {
1880 CreateVideoRtpSender();
1881 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1882 new FakeFrameEncryptor());
1883 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1884 video_rtp_sender_->Stop();
1885 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1886 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1887}
1888
1889// Validate that the default FrameEncryptor setting is nullptr.
1890TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetFrameDecryptor) {
1891 CreateVideoRtpReceiver();
1892 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
Tomas Gunnarssonb3517fe2022-03-18 18:32:381893 rtc::make_ref_counted<FakeFrameDecryptor>());
Benjamin Wrightc462a6e2018-10-26 20:16:161894 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
1895 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1896 EXPECT_EQ(fake_frame_decryptor.get(),
1897 video_rtp_receiver_->GetFrameDecryptor().get());
Tommi4ccdf9322021-05-17 12:50:101898 DestroyVideoRtpReceiver();
Benjamin Wrightc462a6e2018-10-26 20:16:161899}
1900
1901// Validate that the default FrameEncryptor setting is nullptr.
1902TEST_F(RtpSenderReceiverTest, VideoReceiverCannotSetFrameDecryptorAfterStop) {
1903 CreateVideoRtpReceiver();
1904 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
Tomas Gunnarssonb3517fe2022-03-18 18:32:381905 rtc::make_ref_counted<FakeFrameDecryptor>());
Benjamin Wrightc462a6e2018-10-26 20:16:161906 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
Tommi6589def2022-02-17 22:36:471907 video_rtp_receiver_->SetMediaChannel(nullptr);
Benjamin Wrightc462a6e2018-10-26 20:16:161908 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1909 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
Tommi4ccdf9322021-05-17 12:50:101910 DestroyVideoRtpReceiver();
Benjamin Wrightc462a6e2018-10-26 20:16:161911}
1912
Amit Hilbuch619b2942019-02-26 23:55:191913// Checks that calling the internal methods for get/set parameters do not
1914// invalidate any parameters retreived by clients.
1915TEST_F(RtpSenderReceiverTest,
1916 InternalParameterMethodsDoNotInvalidateTransaction) {
1917 CreateVideoRtpSender();
1918 RtpParameters parameters = video_rtp_sender_->GetParameters();
1919 RtpParameters new_parameters = video_rtp_sender_->GetParametersInternal();
1920 new_parameters.encodings[0].active = false;
Florent Castelliacabb362022-10-18 15:05:161921 video_rtp_sender_->SetParametersInternal(new_parameters, nullptr, true);
Amit Hilbuch619b2942019-02-26 23:55:191922 new_parameters.encodings[0].active = true;
Florent Castelliacabb362022-10-18 15:05:161923 video_rtp_sender_->SetParametersInternal(new_parameters, nullptr, true);
Amit Hilbuch619b2942019-02-26 23:55:191924 parameters.encodings[0].active = false;
1925 EXPECT_TRUE(video_rtp_sender_->SetParameters(parameters).ok());
1926}
1927
Philipp Hanckee04c3972022-12-21 14:46:461928// Checks that the senders SetStreams eliminates duplicate stream ids.
1929TEST_F(RtpSenderReceiverTest, SenderSetStreamsEliminatesDuplicateIds) {
1930 AddVideoTrack();
1931 video_rtp_sender_ =
1932 VideoRtpSender::Create(worker_thread_, video_track_->id(), nullptr);
1933 video_rtp_sender_->SetStreams({"1", "2", "1"});
1934 EXPECT_EQ(video_rtp_sender_->stream_ids().size(), 2u);
1935}
1936
Amit Hilbuch2297d332019-02-19 20:49:221937// Helper method for syntactic sugar for accepting a vector with '{}' notation.
1938std::pair<RidList, RidList> CreatePairOfRidVectors(
1939 const std::vector<std::string>& first,
1940 const std::vector<std::string>& second) {
1941 return std::make_pair(first, second);
1942}
1943
1944// These parameters are used to test disabling simulcast layers.
1945const std::pair<RidList, RidList> kDisableSimulcastLayersParameters[] = {
1946 // Tests removing the first layer. This is a special case because
1947 // the first layer's SSRC is also the 'primary' SSRC used to associate the
1948 // parameters to the media channel.
1949 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"1"}),
1950 // Tests removing some layers.
1951 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"2", "4"}),
1952 // Tests simulcast rejected scenario all layers except first are rejected.
1953 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"2", "3", "4"}),
1954 // Tests removing all layers.
1955 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"1", "2", "3", "4"}),
1956};
1957
1958// Runs test for disabling layers on a sender without a media engine set.
1959TEST_P(RtpSenderReceiverTest, DisableSimulcastLayersWithoutMediaEngine) {
1960 auto parameter = GetParam();
1961 RunDisableSimulcastLayersWithoutMediaEngineTest(parameter.first,
1962 parameter.second);
1963}
1964
1965// Runs test for disabling layers on a sender with a media engine set.
1966TEST_P(RtpSenderReceiverTest, DisableSimulcastLayersWithMediaEngine) {
1967 auto parameter = GetParam();
1968 RunDisableSimulcastLayersWithMediaEngineTest(parameter.first,
1969 parameter.second);
1970}
1971
1972INSTANTIATE_TEST_SUITE_P(
1973 DisableSimulcastLayersInSender,
1974 RtpSenderReceiverTest,
1975 ::testing::ValuesIn(kDisableSimulcastLayersParameters));
1976
deadbeef70ab1a12015-09-28 23:53:551977} // namespace webrtc