blob: e51b058210fa0a9d9a837bc38e235d8ee0a2123d [file] [log] [blame]
deadbeef70ab1a12015-09-28 16:53:55 -07001/*
kjellanderb24317b2016-02-10 07:54:43 -08002 * Copyright 2012 The WebRTC project authors. All Rights Reserved.
deadbeef70ab1a12015-09-28 16:53:55 -07003 *
kjellanderb24317b2016-02-10 07:54:43 -08004 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
deadbeef70ab1a12015-09-28 16:53:55 -07009 */
10
Yves Gerey3e707812018-11-28 16:47:49 +010011#include <stddef.h>
Jonas Olssona4d87372019-07-05 19:08:33 +020012
Yves Gerey3e707812018-11-28 16:47:49 +010013#include <cstdint>
Harald Alvestrandc24a2182022-02-23 13:44:59 +000014#include <iterator>
kwibergd1fe2812016-04-27 06:47:29 -070015#include <memory>
deadbeef70ab1a12015-09-28 16:53:55 -070016#include <string>
Tommif888bb52015-12-12 01:37:01 +010017#include <utility>
Yves Gerey3e707812018-11-28 16:47:49 +010018#include <vector>
deadbeef70ab1a12015-09-28 16:53:55 -070019
Amit Hilbuch2297d332019-02-19 12:49:22 -080020#include "absl/algorithm/container.h"
Yves Gerey3e707812018-11-28 16:47:49 +010021#include "absl/memory/memory.h"
22#include "absl/types/optional.h"
23#include "api/audio_options.h"
Steve Anton10542f22019-01-11 09:11:00 -080024#include "api/crypto/crypto_options.h"
25#include "api/crypto/frame_decryptor_interface.h"
26#include "api/crypto/frame_encryptor_interface.h"
27#include "api/dtmf_sender_interface.h"
28#include "api/media_stream_interface.h"
29#include "api/rtc_error.h"
Danil Chapovalov83bbe912019-08-07 12:24:53 +020030#include "api/rtc_event_log/rtc_event_log.h"
Steve Anton10542f22019-01-11 09:11:00 -080031#include "api/rtp_parameters.h"
Harald Alvestrandc24a2182022-02-23 13:44:59 +000032#include "api/rtp_receiver_interface.h"
Mirko Bonadeid9708072019-01-25 20:26:48 +010033#include "api/scoped_refptr.h"
Benjamin Wright84583f62018-10-04 14:22:34 -070034#include "api/test/fake_frame_decryptor.h"
35#include "api/test/fake_frame_encryptor.h"
Jonas Orelanda3aa9bd2019-04-17 07:38:40 +020036#include "api/video/builtin_video_bitrate_allocator_factory.h"
Harald Alvestrandc24a2182022-02-23 13:44:59 +000037#include "api/video/video_bitrate_allocator_factory.h"
38#include "api/video/video_codec_constants.h"
Yves Gerey3e707812018-11-28 16:47:49 +010039#include "media/base/codec.h"
Harald Alvestrandc24a2182022-02-23 13:44:59 +000040#include "media/base/delayable.h"
Steve Anton10542f22019-01-11 09:11:00 -080041#include "media/base/fake_media_engine.h"
42#include "media/base/media_channel.h"
43#include "media/base/media_config.h"
44#include "media/base/media_engine.h"
Harald Alvestrandc24a2182022-02-23 13:44:59 +000045#include "media/base/rid_description.h"
Steve Anton10542f22019-01-11 09:11:00 -080046#include "media/base/stream_params.h"
47#include "media/base/test_utils.h"
48#include "media/engine/fake_webrtc_call.h"
49#include "p2p/base/dtls_transport_internal.h"
50#include "p2p/base/fake_dtls_transport.h"
51#include "p2p/base/p2p_constants.h"
Ruslan Burakov501bfba2019-02-11 10:29:19 +010052#include "pc/audio_rtp_receiver.h"
Steve Anton10542f22019-01-11 09:11:00 -080053#include "pc/audio_track.h"
Yves Gerey3e707812018-11-28 16:47:49 +010054#include "pc/channel.h"
Steve Anton10542f22019-01-11 09:11:00 -080055#include "pc/dtls_srtp_transport.h"
56#include "pc/local_audio_source.h"
57#include "pc/media_stream.h"
Steve Anton10542f22019-01-11 09:11:00 -080058#include "pc/rtp_sender.h"
59#include "pc/rtp_transport_internal.h"
60#include "pc/test/fake_video_track_source.h"
Ruslan Burakov501bfba2019-02-11 10:29:19 +010061#include "pc/video_rtp_receiver.h"
Steve Anton10542f22019-01-11 09:11:00 -080062#include "pc/video_track.h"
Yves Gerey3e707812018-11-28 16:47:49 +010063#include "rtc_base/checks.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020064#include "rtc_base/gunit.h"
Yves Gerey3e707812018-11-28 16:47:49 +010065#include "rtc_base/thread.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020066#include "test/gmock.h"
67#include "test/gtest.h"
Tommi4ccdf932021-05-17 14:50:10 +020068#include "test/run_loop.h"
Jonas Orelanded99dae2022-03-09 09:28:10 +010069#include "test/scoped_key_value_config.h"
deadbeef70ab1a12015-09-28 16:53:55 -070070
71using ::testing::_;
Amit Hilbuch2297d332019-02-19 12:49:22 -080072using ::testing::ContainerEq;
deadbeef70ab1a12015-09-28 16:53:55 -070073using ::testing::Exactly;
deadbeef5dd42fd2016-05-02 16:20:01 -070074using ::testing::InvokeWithoutArgs;
skvladdc1c62c2016-03-16 19:07:43 -070075using ::testing::Return;
Amit Hilbuch2297d332019-02-19 12:49:22 -080076using RidList = std::vector<std::string>;
deadbeef70ab1a12015-09-28 16:53:55 -070077
deadbeef20cb0c12017-02-01 20:27:00 -080078namespace {
79
Seth Hampson845e8782018-03-02 11:34:10 -080080static const char kStreamId1[] = "local_stream_1";
deadbeef70ab1a12015-09-28 16:53:55 -070081static const char kVideoTrackId[] = "video_1";
82static const char kAudioTrackId[] = "audio_1";
Peter Boström0c4e06b2015-10-07 12:23:21 +020083static const uint32_t kVideoSsrc = 98;
deadbeeffac06552015-11-25 11:26:01 -080084static const uint32_t kVideoSsrc2 = 100;
Peter Boström0c4e06b2015-10-07 12:23:21 +020085static const uint32_t kAudioSsrc = 99;
deadbeeffac06552015-11-25 11:26:01 -080086static const uint32_t kAudioSsrc2 = 101;
Florent Castelli892acf02018-10-01 22:47:20 +020087static const uint32_t kVideoSsrcSimulcast = 102;
88static const uint32_t kVideoSimulcastLayerCount = 2;
deadbeef20cb0c12017-02-01 20:27:00 -080089static const int kDefaultTimeout = 10000; // 10 seconds.
Guido Urdaneta1ff16c82019-05-20 19:31:53 +020090
91class MockSetStreamsObserver
92 : public webrtc::RtpSenderBase::SetStreamsObserver {
93 public:
Danil Chapovalov3a353122020-05-15 11:16:53 +020094 MOCK_METHOD(void, OnSetStreams, (), (override));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +020095};
96
deadbeef20cb0c12017-02-01 20:27:00 -080097} // namespace
deadbeef70ab1a12015-09-28 16:53:55 -070098
99namespace webrtc {
100
Amit Hilbuch2297d332019-02-19 12:49:22 -0800101class RtpSenderReceiverTest
Mirko Bonadei6a489f22019-04-09 15:11:12 +0200102 : public ::testing::Test,
Fredrik Solenbergda2afbd2022-08-03 12:07:51 +0200103 public ::testing::WithParamInterface<std::pair<RidList, RidList>> {
tkchin3784b4a2016-06-24 19:31:47 -0700104 public:
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700105 RtpSenderReceiverTest()
Steve Anton47136dd2018-01-12 10:49:35 -0800106 : network_thread_(rtc::Thread::Current()),
107 worker_thread_(rtc::Thread::Current()),
Jonas Orelanda3aa9bd2019-04-17 07:38:40 +0200108 video_bitrate_allocator_factory_(
109 webrtc::CreateBuiltinVideoBitrateAllocatorFactory()),
Steve Anton47136dd2018-01-12 10:49:35 -0800110 // Create fake media engine/etc. so we can create channels to use to
111 // test RtpSenders/RtpReceivers.
Harald Alvestrand0ac50b92022-05-18 07:51:34 +0000112 media_engine_(std::make_unique<cricket::FakeMediaEngine>()),
Tomas Gunnarssone984aa22021-04-19 09:21:06 +0200113 fake_call_(worker_thread_, network_thread_),
Seth Hampson845e8782018-03-02 11:34:10 -0800114 local_stream_(MediaStream::Create(kStreamId1)) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200115 rtp_dtls_transport_ = std::make_unique<cricket::FakeDtlsTransport>(
Zhi Huange830e682018-03-30 10:48:35 -0700116 "fake_dtls_transport", cricket::ICE_CANDIDATE_COMPONENT_RTP);
117 rtp_transport_ = CreateDtlsSrtpTransport();
118
Harald Alvestrand485457f2022-05-23 08:46:57 +0000119 // Create the channels, discard the result; we get them later.
120 // Fake media channels are owned by the media engine.
121 media_engine_->voice().CreateMediaChannel(
122 &fake_call_, cricket::MediaConfig(), cricket::AudioOptions(),
123 webrtc::CryptoOptions());
124 media_engine_->video().CreateMediaChannel(
125 &fake_call_, cricket::MediaConfig(), cricket::VideoOptions(),
126 webrtc::CryptoOptions(), video_bitrate_allocator_factory_.get());
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +0100127
Harald Alvestrand485457f2022-05-23 08:46:57 +0000128 voice_media_channel_ = absl::WrapUnique(media_engine_->GetVoiceChannel(0));
129 video_media_channel_ = absl::WrapUnique(media_engine_->GetVideoChannel(0));
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +0100130
Harald Alvestrand485457f2022-05-23 08:46:57 +0000131 RTC_CHECK(voice_media_channel());
132 RTC_CHECK(video_media_channel());
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000133 // Create sender channel objects
134 voice_send_channel_ =
135 std::make_unique<cricket::VoiceMediaSendChannel>(voice_media_channel());
136 video_send_channel_ =
137 std::make_unique<cricket::VideoMediaSendChannel>(video_media_channel());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700138
139 // Create streams for predefined SSRCs. Streams need to exist in order
140 // for the senders and receievers to apply parameters to them.
141 // Normally these would be created by SetLocalDescription and
142 // SetRemoteDescription.
143 voice_media_channel_->AddSendStream(
144 cricket::StreamParams::CreateLegacy(kAudioSsrc));
145 voice_media_channel_->AddRecvStream(
146 cricket::StreamParams::CreateLegacy(kAudioSsrc));
147 voice_media_channel_->AddSendStream(
148 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
149 voice_media_channel_->AddRecvStream(
150 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
151 video_media_channel_->AddSendStream(
152 cricket::StreamParams::CreateLegacy(kVideoSsrc));
153 video_media_channel_->AddRecvStream(
154 cricket::StreamParams::CreateLegacy(kVideoSsrc));
155 video_media_channel_->AddSendStream(
156 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
157 video_media_channel_->AddRecvStream(
158 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
tkchin3784b4a2016-06-24 19:31:47 -0700159 }
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700160
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200161 ~RtpSenderReceiverTest() {
162 audio_rtp_sender_ = nullptr;
163 video_rtp_sender_ = nullptr;
164 audio_rtp_receiver_ = nullptr;
165 video_rtp_receiver_ = nullptr;
166 local_stream_ = nullptr;
167 video_track_ = nullptr;
168 audio_track_ = nullptr;
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200169 }
170
Zhi Huange830e682018-03-30 10:48:35 -0700171 std::unique_ptr<webrtc::RtpTransportInternal> CreateDtlsSrtpTransport() {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200172 auto dtls_srtp_transport = std::make_unique<webrtc::DtlsSrtpTransport>(
Jonas Orelanded99dae2022-03-09 09:28:10 +0100173 /*rtcp_mux_required=*/true, field_trials_);
Zhi Huange830e682018-03-30 10:48:35 -0700174 dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport_.get(),
175 /*rtcp_dtls_transport=*/nullptr);
176 return dtls_srtp_transport;
177 }
178
deadbeef20cb0c12017-02-01 20:27:00 -0800179 // Needed to use DTMF sender.
180 void AddDtmfCodec() {
181 cricket::AudioSendParameters params;
182 const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000,
183 0, 1);
184 params.codecs.push_back(kTelephoneEventCodec);
Harald Alvestrand485457f2022-05-23 08:46:57 +0000185 voice_media_channel()->SetSendParameters(params);
deadbeef20cb0c12017-02-01 20:27:00 -0800186 }
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700187
pbos5214a0a2016-12-16 15:39:11 -0800188 void AddVideoTrack() { AddVideoTrack(false); }
189
190 void AddVideoTrack(bool is_screencast) {
perkja3ede6c2016-03-08 01:27:48 +0100191 rtc::scoped_refptr<VideoTrackSourceInterface> source(
pbos5214a0a2016-12-16 15:39:11 -0800192 FakeVideoTrackSource::Create(is_screencast));
perkj773be362017-07-31 23:22:01 -0700193 video_track_ =
194 VideoTrack::Create(kVideoTrackId, source, rtc::Thread::Current());
Harald Alvestrand2f7ad282022-04-21 11:35:43 +0000195 EXPECT_TRUE(local_stream_->AddTrack(video_track_));
deadbeef70ab1a12015-09-28 16:53:55 -0700196 }
197
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700198 void CreateAudioRtpSender() { CreateAudioRtpSender(nullptr); }
199
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +0100200 void CreateAudioRtpSender(
201 const rtc::scoped_refptr<LocalAudioSource>& source) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700202 audio_track_ = AudioTrack::Create(kAudioTrackId, source);
Harald Alvestrand2f7ad282022-04-21 11:35:43 +0000203 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200204 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200205 std::make_unique<MockSetStreamsObserver>();
Steve Anton47136dd2018-01-12 10:49:35 -0800206 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200207 AudioRtpSender::Create(worker_thread_, audio_track_->id(), nullptr,
208 set_streams_observer.get());
Niels Möllerafb246b2022-04-20 14:26:50 +0200209 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_.get()));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200210 EXPECT_CALL(*set_streams_observer, OnSetStreams());
211 audio_rtp_sender_->SetStreams({local_stream_->id()});
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000212 audio_rtp_sender_->SetMediaChannel(voice_send_channel_.get());
deadbeeffac06552015-11-25 11:26:01 -0800213 audio_rtp_sender_->SetSsrc(kAudioSsrc);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700214 VerifyVoiceChannelInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700215 }
216
Steve Anton02ee47c2018-01-10 16:26:06 -0800217 void CreateAudioRtpSenderWithNoTrack() {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800218 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200219 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
Harald Alvestrandc0d44d92022-12-13 12:57:24 +0000220 audio_rtp_sender_->SetMediaChannel(
221 voice_media_channel()->AsVoiceSendChannel());
Steve Anton02ee47c2018-01-10 16:26:06 -0800222 }
223
Seth Hampson2d2c8882018-05-16 16:02:32 -0700224 void CreateVideoRtpSender(uint32_t ssrc) {
225 CreateVideoRtpSender(false, ssrc);
226 }
227
pbos5214a0a2016-12-16 15:39:11 -0800228 void CreateVideoRtpSender() { CreateVideoRtpSender(false); }
229
Amit Hilbuch2297d332019-02-19 12:49:22 -0800230 cricket::StreamParams CreateSimulcastStreamParams(int num_layers) {
Florent Castelli892acf02018-10-01 22:47:20 +0200231 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +0100232 ssrcs.reserve(num_layers);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800233 for (int i = 0; i < num_layers; ++i) {
Florent Castelli892acf02018-10-01 22:47:20 +0200234 ssrcs.push_back(kVideoSsrcSimulcast + i);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800235 }
236 return cricket::CreateSimStreamParams("cname", ssrcs);
237 }
238
239 uint32_t CreateVideoRtpSender(const cricket::StreamParams& stream_params) {
Florent Castelli892acf02018-10-01 22:47:20 +0200240 video_media_channel_->AddSendStream(stream_params);
241 uint32_t primary_ssrc = stream_params.first_ssrc();
242 CreateVideoRtpSender(primary_ssrc);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800243 return primary_ssrc;
244 }
245
246 uint32_t CreateVideoRtpSenderWithSimulcast(
247 int num_layers = kVideoSimulcastLayerCount) {
248 return CreateVideoRtpSender(CreateSimulcastStreamParams(num_layers));
249 }
250
251 uint32_t CreateVideoRtpSenderWithSimulcast(
252 const std::vector<std::string>& rids) {
253 cricket::StreamParams stream_params =
254 CreateSimulcastStreamParams(rids.size());
255 std::vector<cricket::RidDescription> rid_descriptions;
256 absl::c_transform(
257 rids, std::back_inserter(rid_descriptions), [](const std::string& rid) {
258 return cricket::RidDescription(rid, cricket::RidDirection::kSend);
259 });
260 stream_params.set_rids(rid_descriptions);
261 return CreateVideoRtpSender(stream_params);
Florent Castelli892acf02018-10-01 22:47:20 +0200262 }
263
Seth Hampson2d2c8882018-05-16 16:02:32 -0700264 void CreateVideoRtpSender(bool is_screencast, uint32_t ssrc = kVideoSsrc) {
pbos5214a0a2016-12-16 15:39:11 -0800265 AddVideoTrack(is_screencast);
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200266 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200267 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200268 video_rtp_sender_ = VideoRtpSender::Create(
269 worker_thread_, video_track_->id(), set_streams_observer.get());
Niels Möllerafb246b2022-04-20 14:26:50 +0200270 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200271 EXPECT_CALL(*set_streams_observer, OnSetStreams());
272 video_rtp_sender_->SetStreams({local_stream_->id()});
Harald Alvestrandc0d44d92022-12-13 12:57:24 +0000273 video_rtp_sender_->SetMediaChannel(
274 video_media_channel()->AsVideoSendChannel());
Seth Hampson2d2c8882018-05-16 16:02:32 -0700275 video_rtp_sender_->SetSsrc(ssrc);
276 VerifyVideoChannelInput(ssrc);
deadbeef70ab1a12015-09-28 16:53:55 -0700277 }
Steve Anton02ee47c2018-01-10 16:26:06 -0800278 void CreateVideoRtpSenderWithNoTrack() {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200279 video_rtp_sender_ =
280 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Harald Alvestrandc0d44d92022-12-13 12:57:24 +0000281 video_rtp_sender_->SetMediaChannel(
282 video_media_channel()->AsVideoSendChannel());
Steve Anton02ee47c2018-01-10 16:26:06 -0800283 }
284
deadbeef70ab1a12015-09-28 16:53:55 -0700285 void DestroyAudioRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700286 audio_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700287 VerifyVoiceChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700288 }
289
290 void DestroyVideoRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700291 video_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700292 VerifyVideoChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700293 }
294
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100295 void CreateAudioRtpReceiver(
296 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
Tommi4ccdf932021-05-17 14:50:10 +0200297 audio_rtp_receiver_ = rtc::make_ref_counted<AudioRtpReceiver>(
298 rtc::Thread::Current(), kAudioTrackId, streams,
299 /*is_unified_plan=*/true);
Harald Alvestrandc0d44d92022-12-13 12:57:24 +0000300 audio_rtp_receiver_->SetMediaChannel(
301 voice_media_channel()->AsVoiceReceiveChannel());
Steve Antond3679212018-01-17 17:41:02 -0800302 audio_rtp_receiver_->SetupMediaChannel(kAudioSsrc);
perkjd61bf802016-03-24 03:16:19 -0700303 audio_track_ = audio_rtp_receiver_->audio_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700304 VerifyVoiceChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700305 }
306
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100307 void CreateVideoRtpReceiver(
308 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
Tommi4ccdf932021-05-17 14:50:10 +0200309 video_rtp_receiver_ = rtc::make_ref_counted<VideoRtpReceiver>(
310 rtc::Thread::Current(), kVideoTrackId, streams);
Harald Alvestrandc0d44d92022-12-13 12:57:24 +0000311 video_rtp_receiver_->SetMediaChannel(
312 video_media_channel()->AsVideoReceiveChannel());
Steve Antond3679212018-01-17 17:41:02 -0800313 video_rtp_receiver_->SetupMediaChannel(kVideoSsrc);
perkjf0dcfe22016-03-10 18:32:00 +0100314 video_track_ = video_rtp_receiver_->video_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700315 VerifyVideoChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700316 }
317
Florent Castelli38332cd2018-11-20 14:08:06 +0100318 void CreateVideoRtpReceiverWithSimulcast(
319 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {},
320 int num_layers = kVideoSimulcastLayerCount) {
321 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +0100322 ssrcs.reserve(num_layers);
Florent Castelli38332cd2018-11-20 14:08:06 +0100323 for (int i = 0; i < num_layers; ++i)
324 ssrcs.push_back(kVideoSsrcSimulcast + i);
325 cricket::StreamParams stream_params =
326 cricket::CreateSimStreamParams("cname", ssrcs);
327 video_media_channel_->AddRecvStream(stream_params);
328 uint32_t primary_ssrc = stream_params.first_ssrc();
329
Tommi4ccdf932021-05-17 14:50:10 +0200330 video_rtp_receiver_ = rtc::make_ref_counted<VideoRtpReceiver>(
331 rtc::Thread::Current(), kVideoTrackId, streams);
Harald Alvestrandc0d44d92022-12-13 12:57:24 +0000332 video_rtp_receiver_->SetMediaChannel(
333 video_media_channel()->AsVideoReceiveChannel());
Florent Castelli38332cd2018-11-20 14:08:06 +0100334 video_rtp_receiver_->SetupMediaChannel(primary_ssrc);
335 video_track_ = video_rtp_receiver_->video_track();
336 }
337
deadbeef70ab1a12015-09-28 16:53:55 -0700338 void DestroyAudioRtpReceiver() {
Tommi4ccdf932021-05-17 14:50:10 +0200339 if (!audio_rtp_receiver_)
340 return;
Tommi6589def2022-02-17 23:36:47 +0100341 audio_rtp_receiver_->SetMediaChannel(nullptr);
deadbeef70ab1a12015-09-28 16:53:55 -0700342 audio_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700343 VerifyVoiceChannelNoOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700344 }
345
346 void DestroyVideoRtpReceiver() {
Tommi4ccdf932021-05-17 14:50:10 +0200347 if (!video_rtp_receiver_)
348 return;
349 video_rtp_receiver_->Stop();
Tommi6589def2022-02-17 23:36:47 +0100350 video_rtp_receiver_->SetMediaChannel(nullptr);
deadbeef70ab1a12015-09-28 16:53:55 -0700351 video_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700352 VerifyVideoChannelNoOutput();
353 }
354
355 void VerifyVoiceChannelInput() { VerifyVoiceChannelInput(kAudioSsrc); }
356
357 void VerifyVoiceChannelInput(uint32_t ssrc) {
358 // Verify that the media channel has an audio source, and the stream isn't
359 // muted.
Harald Alvestrand485457f2022-05-23 08:46:57 +0000360 EXPECT_TRUE(voice_media_channel()->HasSource(ssrc));
361 EXPECT_FALSE(voice_media_channel()->IsStreamMuted(ssrc));
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700362 }
363
364 void VerifyVideoChannelInput() { VerifyVideoChannelInput(kVideoSsrc); }
365
366 void VerifyVideoChannelInput(uint32_t ssrc) {
367 // Verify that the media channel has a video source,
368 EXPECT_TRUE(video_media_channel_->HasSource(ssrc));
369 }
370
371 void VerifyVoiceChannelNoInput() { VerifyVoiceChannelNoInput(kAudioSsrc); }
372
373 void VerifyVoiceChannelNoInput(uint32_t ssrc) {
374 // Verify that the media channel's source is reset.
Harald Alvestrand485457f2022-05-23 08:46:57 +0000375 EXPECT_FALSE(voice_media_channel()->HasSource(ssrc));
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700376 }
377
378 void VerifyVideoChannelNoInput() { VerifyVideoChannelNoInput(kVideoSsrc); }
379
380 void VerifyVideoChannelNoInput(uint32_t ssrc) {
381 // Verify that the media channel's source is reset.
382 EXPECT_FALSE(video_media_channel_->HasSource(ssrc));
383 }
384
385 void VerifyVoiceChannelOutput() {
386 // Verify that the volume is initialized to 1.
387 double volume;
Harald Alvestrand485457f2022-05-23 08:46:57 +0000388 EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700389 EXPECT_EQ(1, volume);
390 }
391
392 void VerifyVideoChannelOutput() {
393 // Verify that the media channel has a sink.
394 EXPECT_TRUE(video_media_channel_->HasSink(kVideoSsrc));
395 }
396
397 void VerifyVoiceChannelNoOutput() {
398 // Verify that the volume is reset to 0.
399 double volume;
Harald Alvestrand485457f2022-05-23 08:46:57 +0000400 EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700401 EXPECT_EQ(0, volume);
402 }
403
404 void VerifyVideoChannelNoOutput() {
405 // Verify that the media channel's sink is reset.
406 EXPECT_FALSE(video_media_channel_->HasSink(kVideoSsrc));
deadbeef70ab1a12015-09-28 16:53:55 -0700407 }
408
Amit Hilbuch2297d332019-02-19 12:49:22 -0800409 // Verifies that the encoding layers contain the specified RIDs.
410 bool VerifyEncodingLayers(const VideoRtpSender& sender,
411 const std::vector<std::string>& rids) {
412 bool has_failure = HasFailure();
413 RtpParameters parameters = sender.GetParameters();
414 std::vector<std::string> encoding_rids;
415 absl::c_transform(
416 parameters.encodings, std::back_inserter(encoding_rids),
417 [](const RtpEncodingParameters& encoding) { return encoding.rid; });
418 EXPECT_THAT(rids, ContainerEq(encoding_rids));
419 return has_failure || !HasFailure();
420 }
421
422 // Runs a test for disabling the encoding layers on the specified sender.
423 void RunDisableEncodingLayersTest(
424 const std::vector<std::string>& all_layers,
425 const std::vector<std::string>& disabled_layers,
426 VideoRtpSender* sender) {
427 std::vector<std::string> expected;
428 absl::c_copy_if(all_layers, std::back_inserter(expected),
429 [&disabled_layers](const std::string& rid) {
430 return !absl::c_linear_search(disabled_layers, rid);
431 });
432
433 EXPECT_TRUE(VerifyEncodingLayers(*sender, all_layers));
434 sender->DisableEncodingLayers(disabled_layers);
435 EXPECT_TRUE(VerifyEncodingLayers(*sender, expected));
436 }
437
438 // Runs a test for setting an encoding layer as inactive.
439 // This test assumes that some layers have already been disabled.
440 void RunSetLastLayerAsInactiveTest(VideoRtpSender* sender) {
441 auto parameters = sender->GetParameters();
442 if (parameters.encodings.size() == 0) {
443 return;
444 }
445
446 RtpEncodingParameters& encoding = parameters.encodings.back();
447 auto rid = encoding.rid;
448 EXPECT_TRUE(encoding.active);
449 encoding.active = false;
450 auto error = sender->SetParameters(parameters);
451 ASSERT_TRUE(error.ok());
452 parameters = sender->GetParameters();
453 RtpEncodingParameters& result_encoding = parameters.encodings.back();
454 EXPECT_EQ(rid, result_encoding.rid);
455 EXPECT_FALSE(result_encoding.active);
456 }
457
458 // Runs a test for disabling the encoding layers on a sender without a media
459 // channel.
460 void RunDisableSimulcastLayersWithoutMediaEngineTest(
461 const std::vector<std::string>& all_layers,
462 const std::vector<std::string>& disabled_layers) {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200463 auto sender = VideoRtpSender::Create(rtc::Thread::Current(), "1", nullptr);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800464 RtpParameters parameters;
465 parameters.encodings.resize(all_layers.size());
466 for (size_t i = 0; i < all_layers.size(); ++i) {
467 parameters.encodings[i].rid = all_layers[i];
468 }
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800469 sender->set_init_send_encodings(parameters.encodings);
470 RunDisableEncodingLayersTest(all_layers, disabled_layers, sender.get());
471 RunSetLastLayerAsInactiveTest(sender.get());
Amit Hilbuch2297d332019-02-19 12:49:22 -0800472 }
473
474 // Runs a test for disabling the encoding layers on a sender with a media
475 // channel.
476 void RunDisableSimulcastLayersWithMediaEngineTest(
477 const std::vector<std::string>& all_layers,
478 const std::vector<std::string>& disabled_layers) {
479 uint32_t ssrc = CreateVideoRtpSenderWithSimulcast(all_layers);
480 RunDisableEncodingLayersTest(all_layers, disabled_layers,
481 video_rtp_sender_.get());
482
483 auto channel_parameters = video_media_channel_->GetRtpSendParameters(ssrc);
484 ASSERT_EQ(channel_parameters.encodings.size(), all_layers.size());
485 for (size_t i = 0; i < all_layers.size(); ++i) {
486 EXPECT_EQ(all_layers[i], channel_parameters.encodings[i].rid);
487 bool is_active = !absl::c_linear_search(disabled_layers, all_layers[i]);
488 EXPECT_EQ(is_active, channel_parameters.encodings[i].active);
489 }
490
491 RunSetLastLayerAsInactiveTest(video_rtp_sender_.get());
492 }
493
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200494 // Check that minimum Jitter Buffer delay is propagated to the underlying
Artem Titov880fa812021-07-30 22:30:23 +0200495 // `media_channel`.
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200496 void VerifyRtpReceiverDelayBehaviour(cricket::Delayable* media_channel,
497 RtpReceiverInterface* receiver,
498 uint32_t ssrc) {
499 receiver->SetJitterBufferMinimumDelay(/*delay_seconds=*/0.5);
500 absl::optional<int> delay_ms =
501 media_channel->GetBaseMinimumPlayoutDelayMs(ssrc); // In milliseconds.
502 EXPECT_DOUBLE_EQ(0.5, delay_ms.value_or(0) / 1000.0);
503 }
504
deadbeef70ab1a12015-09-28 16:53:55 -0700505 protected:
Harald Alvestrand485457f2022-05-23 08:46:57 +0000506 cricket::FakeVideoMediaChannel* video_media_channel() {
507 return video_media_channel_.get();
508 }
509 cricket::FakeVoiceMediaChannel* voice_media_channel() {
510 return voice_media_channel_.get();
511 }
512
Tommi4ccdf932021-05-17 14:50:10 +0200513 test::RunLoop run_loop_;
Steve Anton47136dd2018-01-12 10:49:35 -0800514 rtc::Thread* const network_thread_;
515 rtc::Thread* const worker_thread_;
Danil Chapovalov83bbe912019-08-07 12:24:53 +0200516 webrtc::RtcEventLogNull event_log_;
Artem Titov880fa812021-07-30 22:30:23 +0200517 // The `rtp_dtls_transport_` and `rtp_transport_` should be destroyed after
518 // the `channel_manager`.
Zhi Huange830e682018-03-30 10:48:35 -0700519 std::unique_ptr<cricket::DtlsTransportInternal> rtp_dtls_transport_;
520 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport_;
Jonas Orelanda3aa9bd2019-04-17 07:38:40 +0200521 std::unique_ptr<webrtc::VideoBitrateAllocatorFactory>
522 video_bitrate_allocator_factory_;
Harald Alvestrand0ac50b92022-05-18 07:51:34 +0000523 std::unique_ptr<cricket::FakeMediaEngine> media_engine_;
524 rtc::UniqueRandomIdGenerator ssrc_generator_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700525 cricket::FakeCall fake_call_;
Harald Alvestrand485457f2022-05-23 08:46:57 +0000526 std::unique_ptr<cricket::FakeVoiceMediaChannel> voice_media_channel_;
527 std::unique_ptr<cricket::FakeVideoMediaChannel> video_media_channel_;
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000528 std::unique_ptr<cricket::VoiceMediaSendChannel> voice_send_channel_;
529 std::unique_ptr<cricket::VideoMediaSendChannel> video_send_channel_;
deadbeef70ab1a12015-09-28 16:53:55 -0700530 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
531 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
532 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
533 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
deadbeefe814a0d2017-02-25 18:15:09 -0800534 rtc::scoped_refptr<MediaStreamInterface> local_stream_;
deadbeef70ab1a12015-09-28 16:53:55 -0700535 rtc::scoped_refptr<VideoTrackInterface> video_track_;
536 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
Jonas Orelanded99dae2022-03-09 09:28:10 +0100537 webrtc::test::ScopedKeyValueConfig field_trials_;
deadbeef70ab1a12015-09-28 16:53:55 -0700538};
539
Artem Titov880fa812021-07-30 22:30:23 +0200540// Test that `voice_channel_` is updated when an audio track is associated
deadbeef70ab1a12015-09-28 16:53:55 -0700541// and disassociated with an AudioRtpSender.
542TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
543 CreateAudioRtpSender();
544 DestroyAudioRtpSender();
545}
546
Artem Titov880fa812021-07-30 22:30:23 +0200547// Test that `video_channel_` is updated when a video track is associated and
deadbeef70ab1a12015-09-28 16:53:55 -0700548// disassociated with a VideoRtpSender.
549TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
550 CreateVideoRtpSender();
551 DestroyVideoRtpSender();
552}
553
Artem Titov880fa812021-07-30 22:30:23 +0200554// Test that `voice_channel_` is updated when a remote audio track is
deadbeef70ab1a12015-09-28 16:53:55 -0700555// associated and disassociated with an AudioRtpReceiver.
556TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
557 CreateAudioRtpReceiver();
558 DestroyAudioRtpReceiver();
559}
560
Artem Titov880fa812021-07-30 22:30:23 +0200561// Test that `video_channel_` is updated when a remote video track is
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700562// associated and disassociated with a VideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700563TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
564 CreateVideoRtpReceiver();
565 DestroyVideoRtpReceiver();
566}
567
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100568TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiverWithStreams) {
569 CreateAudioRtpReceiver({local_stream_});
570 DestroyAudioRtpReceiver();
571}
572
573TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiverWithStreams) {
574 CreateVideoRtpReceiver({local_stream_});
575 DestroyVideoRtpReceiver();
576}
577
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700578// Test that the AudioRtpSender applies options from the local audio source.
579TEST_F(RtpSenderReceiverTest, LocalAudioSourceOptionsApplied) {
580 cricket::AudioOptions options;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100581 options.echo_cancellation = true;
deadbeef757146b2017-02-10 21:26:48 -0800582 auto source = LocalAudioSource::Create(&options);
Niels Möllere7cc8832022-01-04 15:20:03 +0100583 CreateAudioRtpSender(source);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700584
Harald Alvestrand485457f2022-05-23 08:46:57 +0000585 EXPECT_EQ(true, voice_media_channel()->options().echo_cancellation);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700586
587 DestroyAudioRtpSender();
588}
589
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700590// Test that the stream is muted when the track is disabled, and unmuted when
591// the track is enabled.
592TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) {
593 CreateAudioRtpSender();
594
595 audio_track_->set_enabled(false);
Harald Alvestrand485457f2022-05-23 08:46:57 +0000596 EXPECT_TRUE(voice_media_channel()->IsStreamMuted(kAudioSsrc));
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700597
598 audio_track_->set_enabled(true);
Harald Alvestrand485457f2022-05-23 08:46:57 +0000599 EXPECT_FALSE(voice_media_channel()->IsStreamMuted(kAudioSsrc));
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700600
601 DestroyAudioRtpSender();
602}
603
604// Test that the volume is set to 0 when the track is disabled, and back to
605// 1 when the track is enabled.
deadbeef70ab1a12015-09-28 16:53:55 -0700606TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
607 CreateAudioRtpReceiver();
608
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700609 double volume;
Harald Alvestrand485457f2022-05-23 08:46:57 +0000610 EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700611 EXPECT_EQ(1, volume);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700612
Tommi4ccdf932021-05-17 14:50:10 +0200613 // Handling of enable/disable is applied asynchronously.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700614 audio_track_->set_enabled(false);
Tommi4ccdf932021-05-17 14:50:10 +0200615 run_loop_.Flush();
616
Harald Alvestrand485457f2022-05-23 08:46:57 +0000617 EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700618 EXPECT_EQ(0, volume);
619
deadbeef70ab1a12015-09-28 16:53:55 -0700620 audio_track_->set_enabled(true);
Tommi4ccdf932021-05-17 14:50:10 +0200621 run_loop_.Flush();
Harald Alvestrand485457f2022-05-23 08:46:57 +0000622 EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700623 EXPECT_EQ(1, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700624
625 DestroyAudioRtpReceiver();
626}
627
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700628// Currently no action is taken when a remote video track is disabled or
629// enabled, so there's nothing to test here, other than what is normally
630// verified in DestroyVideoRtpSender.
deadbeef70ab1a12015-09-28 16:53:55 -0700631TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
632 CreateVideoRtpSender();
633
deadbeef70ab1a12015-09-28 16:53:55 -0700634 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700635 video_track_->set_enabled(true);
636
637 DestroyVideoRtpSender();
638}
639
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700640// Test that the state of the video track created by the VideoRtpReceiver is
641// updated when the receiver is destroyed.
perkjf0dcfe22016-03-10 18:32:00 +0100642TEST_F(RtpSenderReceiverTest, RemoteVideoTrackState) {
643 CreateVideoRtpReceiver();
644
645 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track_->state());
646 EXPECT_EQ(webrtc::MediaSourceInterface::kLive,
647 video_track_->GetSource()->state());
648
649 DestroyVideoRtpReceiver();
650
651 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track_->state());
652 EXPECT_EQ(webrtc::MediaSourceInterface::kEnded,
653 video_track_->GetSource()->state());
Tommi4ccdf932021-05-17 14:50:10 +0200654 DestroyVideoRtpReceiver();
perkjf0dcfe22016-03-10 18:32:00 +0100655}
656
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700657// Currently no action is taken when a remote video track is disabled or
658// enabled, so there's nothing to test here, other than what is normally
659// verified in DestroyVideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700660TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
661 CreateVideoRtpReceiver();
662
663 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700664 video_track_->set_enabled(true);
665
666 DestroyVideoRtpReceiver();
667}
668
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700669// Test that the AudioRtpReceiver applies volume changes from the track source
670// to the media channel.
deadbeef70ab1a12015-09-28 16:53:55 -0700671TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
672 CreateAudioRtpReceiver();
673
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700674 double volume;
675 audio_track_->GetSource()->SetVolume(0.5);
Tommi4ccdf932021-05-17 14:50:10 +0200676 run_loop_.Flush();
Harald Alvestrand485457f2022-05-23 08:46:57 +0000677 EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700678 EXPECT_EQ(0.5, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700679
680 // Disable the audio track, this should prevent setting the volume.
deadbeef70ab1a12015-09-28 16:53:55 -0700681 audio_track_->set_enabled(false);
Tommi4ccdf932021-05-17 14:50:10 +0200682 RTC_DCHECK_EQ(worker_thread_, run_loop_.task_queue());
683 run_loop_.Flush();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700684 audio_track_->GetSource()->SetVolume(0.8);
Harald Alvestrand485457f2022-05-23 08:46:57 +0000685 EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700686 EXPECT_EQ(0, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700687
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700688 // When the track is enabled, the previously set volume should take effect.
deadbeef70ab1a12015-09-28 16:53:55 -0700689 audio_track_->set_enabled(true);
Tommi4ccdf932021-05-17 14:50:10 +0200690 run_loop_.Flush();
Harald Alvestrand485457f2022-05-23 08:46:57 +0000691 EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700692 EXPECT_EQ(0.8, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700693
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700694 // Try changing volume one more time.
695 audio_track_->GetSource()->SetVolume(0.9);
Tommi4ccdf932021-05-17 14:50:10 +0200696 run_loop_.Flush();
Harald Alvestrand485457f2022-05-23 08:46:57 +0000697 EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700698 EXPECT_EQ(0.9, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700699
700 DestroyAudioRtpReceiver();
701}
702
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200703TEST_F(RtpSenderReceiverTest, AudioRtpReceiverDelay) {
704 CreateAudioRtpReceiver();
Harald Alvestrandc0d44d92022-12-13 12:57:24 +0000705 VerifyRtpReceiverDelayBehaviour(
706 voice_media_channel()->AsVoiceReceiveChannel(), audio_rtp_receiver_.get(),
707 kAudioSsrc);
Tommi4ccdf932021-05-17 14:50:10 +0200708 DestroyAudioRtpReceiver();
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200709}
710
711TEST_F(RtpSenderReceiverTest, VideoRtpReceiverDelay) {
712 CreateVideoRtpReceiver();
Harald Alvestrandc0d44d92022-12-13 12:57:24 +0000713 VerifyRtpReceiverDelayBehaviour(
714 video_media_channel()->AsVideoReceiveChannel(), video_rtp_receiver_.get(),
715 kVideoSsrc);
Tommi4ccdf932021-05-17 14:50:10 +0200716 DestroyVideoRtpReceiver();
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200717}
718
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700719// Test that the media channel isn't enabled for sending if the audio sender
720// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800721TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800722 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800723 rtc::scoped_refptr<AudioTrackInterface> track =
724 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700725
726 // Track but no SSRC.
Niels Möllerafb246b2022-04-20 14:26:50 +0200727 EXPECT_TRUE(audio_rtp_sender_->SetTrack(track.get()));
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700728 VerifyVoiceChannelNoInput();
729
730 // SSRC but no track.
731 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
732 audio_rtp_sender_->SetSsrc(kAudioSsrc);
733 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800734}
735
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700736// Test that the media channel isn't enabled for sending if the video sender
737// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800738TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800739 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700740
741 // Track but no SSRC.
Niels Möllerafb246b2022-04-20 14:26:50 +0200742 EXPECT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700743 VerifyVideoChannelNoInput();
744
745 // SSRC but no track.
746 EXPECT_TRUE(video_rtp_sender_->SetTrack(nullptr));
747 video_rtp_sender_->SetSsrc(kVideoSsrc);
748 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800749}
750
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700751// Test that the media channel is enabled for sending when the audio sender
752// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800753TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800754 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800755 rtc::scoped_refptr<AudioTrackInterface> track =
756 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700757 audio_rtp_sender_->SetSsrc(kAudioSsrc);
Niels Möllerafb246b2022-04-20 14:26:50 +0200758 audio_rtp_sender_->SetTrack(track.get());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700759 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800760
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700761 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800762}
763
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700764// Test that the media channel is enabled for sending when the audio sender
765// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800766TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800767 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800768 rtc::scoped_refptr<AudioTrackInterface> track =
769 AudioTrack::Create(kAudioTrackId, nullptr);
Niels Möllerafb246b2022-04-20 14:26:50 +0200770 audio_rtp_sender_->SetTrack(track.get());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700771 audio_rtp_sender_->SetSsrc(kAudioSsrc);
772 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800773
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700774 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800775}
776
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700777// Test that the media channel is enabled for sending when the video sender
778// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800779TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
nisseaf510af2016-03-21 08:20:42 -0700780 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800781 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700782 video_rtp_sender_->SetSsrc(kVideoSsrc);
Niels Möllerafb246b2022-04-20 14:26:50 +0200783 video_rtp_sender_->SetTrack(video_track_.get());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700784 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800785
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700786 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800787}
788
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700789// Test that the media channel is enabled for sending when the video sender
790// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800791TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
nisseaf510af2016-03-21 08:20:42 -0700792 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800793 CreateVideoRtpSenderWithNoTrack();
Niels Möllerafb246b2022-04-20 14:26:50 +0200794 video_rtp_sender_->SetTrack(video_track_.get());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700795 video_rtp_sender_->SetSsrc(kVideoSsrc);
796 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800797
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700798 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800799}
800
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700801// Test that the media channel stops sending when the audio sender's SSRC is set
802// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800803TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700804 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800805
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700806 audio_rtp_sender_->SetSsrc(0);
807 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800808}
809
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700810// Test that the media channel stops sending when the video sender's SSRC is set
811// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800812TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700813 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800814
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700815 audio_rtp_sender_->SetSsrc(0);
816 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800817}
818
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700819// Test that the media channel stops sending when the audio sender's track is
820// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800821TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700822 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800823
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700824 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
825 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800826}
827
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700828// Test that the media channel stops sending when the video sender's track is
829// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800830TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700831 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800832
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700833 video_rtp_sender_->SetSsrc(0);
834 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800835}
836
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700837// Test that when the audio sender's SSRC is changed, the media channel stops
838// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800839TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700840 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800841
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700842 audio_rtp_sender_->SetSsrc(kAudioSsrc2);
843 VerifyVoiceChannelNoInput(kAudioSsrc);
844 VerifyVoiceChannelInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800845
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700846 audio_rtp_sender_ = nullptr;
847 VerifyVoiceChannelNoInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800848}
849
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700850// Test that when the audio sender's SSRC is changed, the media channel stops
851// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800852TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700853 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800854
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700855 video_rtp_sender_->SetSsrc(kVideoSsrc2);
856 VerifyVideoChannelNoInput(kVideoSsrc);
857 VerifyVideoChannelInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800858
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700859 video_rtp_sender_ = nullptr;
860 VerifyVideoChannelNoInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800861}
862
skvladdc1c62c2016-03-16 19:07:43 -0700863TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) {
864 CreateAudioRtpSender();
865
skvladdc1c62c2016-03-16 19:07:43 -0700866 RtpParameters params = audio_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700867 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -0800868 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -0700869
870 DestroyAudioRtpSender();
871}
872
Florent Castelliacabb362022-10-18 17:05:16 +0200873TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParametersAsync) {
874 CreateAudioRtpSender();
875
876 RtpParameters params = audio_rtp_sender_->GetParameters();
877 EXPECT_EQ(1u, params.encodings.size());
878 absl::optional<webrtc::RTCError> result;
879 audio_rtp_sender_->SetParametersAsync(
880 params, [&result](webrtc::RTCError error) { result = error; });
881 run_loop_.Flush();
882 EXPECT_TRUE(result->ok());
883
884 DestroyAudioRtpSender();
885}
886
Florent Castelli892acf02018-10-01 22:47:20 +0200887TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParametersBeforeNegotiation) {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800888 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200889 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +0200890
891 RtpParameters params = audio_rtp_sender_->GetParameters();
892 ASSERT_EQ(1u, params.encodings.size());
893 params.encodings[0].max_bitrate_bps = 90000;
894 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
895
896 params = audio_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +0200897 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
Florent Castelliacabb362022-10-18 17:05:16 +0200898 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
899
900 DestroyAudioRtpSender();
901}
902
903TEST_F(RtpSenderReceiverTest,
904 AudioSenderCanSetParametersAsyncBeforeNegotiation) {
905 audio_rtp_sender_ =
906 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
907
908 absl::optional<webrtc::RTCError> result;
909 RtpParameters params = audio_rtp_sender_->GetParameters();
910 ASSERT_EQ(1u, params.encodings.size());
911 params.encodings[0].max_bitrate_bps = 90000;
912
913 audio_rtp_sender_->SetParametersAsync(
914 params, [&result](webrtc::RTCError error) { result = error; });
915 run_loop_.Flush();
916 EXPECT_TRUE(result->ok());
917
918 params = audio_rtp_sender_->GetParameters();
919 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
920
921 audio_rtp_sender_->SetParametersAsync(
922 params, [&result](webrtc::RTCError error) { result = error; });
923 run_loop_.Flush();
924 EXPECT_TRUE(result->ok());
Florent Castelli892acf02018-10-01 22:47:20 +0200925
926 DestroyAudioRtpSender();
927}
928
929TEST_F(RtpSenderReceiverTest, AudioSenderInitParametersMovedAfterNegotiation) {
930 audio_track_ = AudioTrack::Create(kAudioTrackId, nullptr);
Harald Alvestrand2f7ad282022-04-21 11:35:43 +0000931 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
Florent Castelli892acf02018-10-01 22:47:20 +0200932
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200933 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200934 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200935 audio_rtp_sender_ = AudioRtpSender::Create(
936 worker_thread_, audio_track_->id(), nullptr, set_streams_observer.get());
Niels Möllerafb246b2022-04-20 14:26:50 +0200937 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_.get()));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200938 EXPECT_CALL(*set_streams_observer, OnSetStreams());
939 audio_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli892acf02018-10-01 22:47:20 +0200940
941 std::vector<RtpEncodingParameters> init_encodings(1);
942 init_encodings[0].max_bitrate_bps = 60000;
943 audio_rtp_sender_->set_init_send_encodings(init_encodings);
944
945 RtpParameters params = audio_rtp_sender_->GetParameters();
946 ASSERT_EQ(1u, params.encodings.size());
947 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
948
949 // Simulate the setLocalDescription call
950 std::vector<uint32_t> ssrcs(1, 1);
951 cricket::StreamParams stream_params =
952 cricket::CreateSimStreamParams("cname", ssrcs);
Harald Alvestrand485457f2022-05-23 08:46:57 +0000953 voice_media_channel()->AddSendStream(stream_params);
Harald Alvestrandc0d44d92022-12-13 12:57:24 +0000954 audio_rtp_sender_->SetMediaChannel(
955 voice_media_channel()->AsVoiceSendChannel());
Florent Castelli892acf02018-10-01 22:47:20 +0200956 audio_rtp_sender_->SetSsrc(1);
957
958 params = audio_rtp_sender_->GetParameters();
959 ASSERT_EQ(1u, params.encodings.size());
960 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
961
962 DestroyAudioRtpSender();
963}
964
965TEST_F(RtpSenderReceiverTest,
966 AudioSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800967 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200968 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +0200969
970 RtpParameters params;
971 RTCError result = audio_rtp_sender_->SetParameters(params);
972 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
973 DestroyAudioRtpSender();
974}
975
Florent Castellicebf50f2018-05-03 15:31:53 +0200976TEST_F(RtpSenderReceiverTest,
977 AudioSenderMustCallGetParametersBeforeSetParameters) {
978 CreateAudioRtpSender();
979
980 RtpParameters params;
981 RTCError result = audio_rtp_sender_->SetParameters(params);
982 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
983
984 DestroyAudioRtpSender();
985}
986
987TEST_F(RtpSenderReceiverTest,
988 AudioSenderSetParametersInvalidatesTransactionId) {
989 CreateAudioRtpSender();
990
991 RtpParameters params = audio_rtp_sender_->GetParameters();
992 EXPECT_EQ(1u, params.encodings.size());
993 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
994 RTCError result = audio_rtp_sender_->SetParameters(params);
995 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
996
997 DestroyAudioRtpSender();
998}
999
Florent Castelliacabb362022-10-18 17:05:16 +02001000TEST_F(RtpSenderReceiverTest,
1001 AudioSenderSetParametersAsyncInvalidatesTransactionId) {
1002 CreateAudioRtpSender();
1003
1004 RtpParameters params = audio_rtp_sender_->GetParameters();
1005 EXPECT_EQ(1u, params.encodings.size());
1006 absl::optional<webrtc::RTCError> result;
1007 audio_rtp_sender_->SetParametersAsync(
1008 params, [&result](webrtc::RTCError error) { result = error; });
1009 run_loop_.Flush();
1010 EXPECT_TRUE(result->ok());
1011 audio_rtp_sender_->SetParametersAsync(
1012 params, [&result](webrtc::RTCError error) { result = error; });
1013 run_loop_.Flush();
1014 EXPECT_EQ(RTCErrorType::INVALID_STATE, result->type());
1015
1016 DestroyAudioRtpSender();
1017}
1018
Florent Castellicebf50f2018-05-03 15:31:53 +02001019TEST_F(RtpSenderReceiverTest, AudioSenderDetectTransactionIdModification) {
1020 CreateAudioRtpSender();
1021
1022 RtpParameters params = audio_rtp_sender_->GetParameters();
1023 params.transaction_id = "";
1024 RTCError result = audio_rtp_sender_->SetParameters(params);
1025 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1026
1027 DestroyAudioRtpSender();
1028}
1029
1030TEST_F(RtpSenderReceiverTest, AudioSenderCheckTransactionIdRefresh) {
1031 CreateAudioRtpSender();
1032
1033 RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001034 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 15:31:53 +02001035 auto saved_transaction_id = params.transaction_id;
1036 params = audio_rtp_sender_->GetParameters();
1037 EXPECT_NE(saved_transaction_id, params.transaction_id);
1038
1039 DestroyAudioRtpSender();
1040}
1041
1042TEST_F(RtpSenderReceiverTest, AudioSenderSetParametersOldValueFail) {
1043 CreateAudioRtpSender();
1044
1045 RtpParameters params = audio_rtp_sender_->GetParameters();
1046 RtpParameters second_params = audio_rtp_sender_->GetParameters();
1047
1048 RTCError result = audio_rtp_sender_->SetParameters(params);
1049 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
Seth Hampson2d2c8882018-05-16 16:02:32 -07001050 DestroyAudioRtpSender();
1051}
1052
1053TEST_F(RtpSenderReceiverTest, AudioSenderCantSetUnimplementedRtpParameters) {
1054 CreateAudioRtpSender();
1055 RtpParameters params = audio_rtp_sender_->GetParameters();
1056 EXPECT_EQ(1u, params.encodings.size());
1057
Florent Castelli87b3c512018-07-18 16:00:28 +02001058 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 16:02:32 -07001059 params.mid = "dummy_mid";
1060 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1061 audio_rtp_sender_->SetParameters(params).type());
1062 params = audio_rtp_sender_->GetParameters();
1063
Seth Hampson2d2c8882018-05-16 16:02:32 -07001064 DestroyAudioRtpSender();
1065}
1066
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001067TEST_F(RtpSenderReceiverTest, SetAudioMaxSendBitrate) {
1068 CreateAudioRtpSender();
1069
Harald Alvestrand485457f2022-05-23 08:46:57 +00001070 EXPECT_EQ(-1, voice_media_channel()->max_bps());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001071 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001072 EXPECT_EQ(1U, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -08001073 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001074 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -08001075 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001076
1077 // Read back the parameters and verify they have been changed.
1078 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001079 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001080 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001081
1082 // Verify that the audio channel received the new parameters.
Harald Alvestrand485457f2022-05-23 08:46:57 +00001083 params = voice_media_channel()->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001084 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001085 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001086
1087 // Verify that the global bitrate limit has not been changed.
Harald Alvestrand485457f2022-05-23 08:46:57 +00001088 EXPECT_EQ(-1, voice_media_channel()->max_bps());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001089
1090 DestroyAudioRtpSender();
1091}
1092
Seth Hampson24722b32017-12-22 09:36:42 -08001093TEST_F(RtpSenderReceiverTest, SetAudioBitratePriority) {
1094 CreateAudioRtpSender();
1095
1096 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001097 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001098 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1099 params.encodings[0].bitrate_priority);
1100 double new_bitrate_priority = 2.0;
1101 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -08001102 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -08001103
1104 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001105 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001106 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1107
Harald Alvestrand485457f2022-05-23 08:46:57 +00001108 params = voice_media_channel()->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001109 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001110 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1111
1112 DestroyAudioRtpSender();
1113}
1114
skvladdc1c62c2016-03-16 19:07:43 -07001115TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) {
1116 CreateVideoRtpSender();
1117
skvladdc1c62c2016-03-16 19:07:43 -07001118 RtpParameters params = video_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001119 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -08001120 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -07001121
1122 DestroyVideoRtpSender();
1123}
1124
Florent Castelliacabb362022-10-18 17:05:16 +02001125TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParametersAsync) {
1126 CreateVideoRtpSender();
1127
1128 RtpParameters params = video_rtp_sender_->GetParameters();
1129 EXPECT_EQ(1u, params.encodings.size());
1130 absl::optional<webrtc::RTCError> result;
1131 video_rtp_sender_->SetParametersAsync(
1132 params, [&result](webrtc::RTCError error) { result = error; });
1133 run_loop_.Flush();
1134 EXPECT_TRUE(result->ok());
1135
1136 DestroyVideoRtpSender();
1137}
1138
Florent Castelli892acf02018-10-01 22:47:20 +02001139TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParametersBeforeNegotiation) {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001140 video_rtp_sender_ =
1141 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +02001142
1143 RtpParameters params = video_rtp_sender_->GetParameters();
1144 ASSERT_EQ(1u, params.encodings.size());
1145 params.encodings[0].max_bitrate_bps = 90000;
1146 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1147
1148 params = video_rtp_sender_->GetParameters();
1149 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1150 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
1151
1152 DestroyVideoRtpSender();
1153}
1154
Florent Castelliacabb362022-10-18 17:05:16 +02001155TEST_F(RtpSenderReceiverTest,
1156 VideoSenderCanSetParametersAsyncBeforeNegotiation) {
1157 video_rtp_sender_ =
1158 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
1159
1160 absl::optional<webrtc::RTCError> result;
1161 RtpParameters params = video_rtp_sender_->GetParameters();
1162 ASSERT_EQ(1u, params.encodings.size());
1163 params.encodings[0].max_bitrate_bps = 90000;
1164 video_rtp_sender_->SetParametersAsync(
1165 params, [&result](webrtc::RTCError error) { result = error; });
1166 run_loop_.Flush();
1167 EXPECT_TRUE(result->ok());
1168
1169 params = video_rtp_sender_->GetParameters();
1170 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
1171 video_rtp_sender_->SetParametersAsync(
1172 params, [&result](webrtc::RTCError error) { result = error; });
1173 run_loop_.Flush();
1174 EXPECT_TRUE(result->ok());
1175
1176 DestroyVideoRtpSender();
1177}
1178
Florent Castelli892acf02018-10-01 22:47:20 +02001179TEST_F(RtpSenderReceiverTest, VideoSenderInitParametersMovedAfterNegotiation) {
1180 AddVideoTrack(false);
1181
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001182 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001183 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001184 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1185 set_streams_observer.get());
Niels Möllerafb246b2022-04-20 14:26:50 +02001186 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001187 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1188 video_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli892acf02018-10-01 22:47:20 +02001189
1190 std::vector<RtpEncodingParameters> init_encodings(2);
1191 init_encodings[0].max_bitrate_bps = 60000;
1192 init_encodings[1].max_bitrate_bps = 900000;
1193 video_rtp_sender_->set_init_send_encodings(init_encodings);
1194
1195 RtpParameters params = video_rtp_sender_->GetParameters();
1196 ASSERT_EQ(2u, params.encodings.size());
1197 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1198 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
1199
1200 // Simulate the setLocalDescription call
1201 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +01001202 ssrcs.reserve(2);
Florent Castelli892acf02018-10-01 22:47:20 +02001203 for (int i = 0; i < 2; ++i)
1204 ssrcs.push_back(kVideoSsrcSimulcast + i);
1205 cricket::StreamParams stream_params =
1206 cricket::CreateSimStreamParams("cname", ssrcs);
Harald Alvestrand485457f2022-05-23 08:46:57 +00001207 video_media_channel()->AddSendStream(stream_params);
Harald Alvestrandc0d44d92022-12-13 12:57:24 +00001208 video_rtp_sender_->SetMediaChannel(
1209 video_media_channel()->AsVideoSendChannel());
Florent Castelli892acf02018-10-01 22:47:20 +02001210 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
1211
1212 params = video_rtp_sender_->GetParameters();
1213 ASSERT_EQ(2u, params.encodings.size());
1214 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1215 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
1216
1217 DestroyVideoRtpSender();
1218}
1219
1220TEST_F(RtpSenderReceiverTest,
1221 VideoSenderInitParametersMovedAfterManualSimulcastAndNegotiation) {
1222 AddVideoTrack(false);
1223
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001224 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001225 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001226 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1227 set_streams_observer.get());
Niels Möllerafb246b2022-04-20 14:26:50 +02001228 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001229 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1230 video_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli892acf02018-10-01 22:47:20 +02001231
1232 std::vector<RtpEncodingParameters> init_encodings(1);
1233 init_encodings[0].max_bitrate_bps = 60000;
1234 video_rtp_sender_->set_init_send_encodings(init_encodings);
1235
1236 RtpParameters params = video_rtp_sender_->GetParameters();
1237 ASSERT_EQ(1u, params.encodings.size());
1238 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1239
1240 // Simulate the setLocalDescription call as if the user used SDP munging
1241 // to enable simulcast
1242 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +01001243 ssrcs.reserve(2);
Florent Castelli892acf02018-10-01 22:47:20 +02001244 for (int i = 0; i < 2; ++i)
1245 ssrcs.push_back(kVideoSsrcSimulcast + i);
1246 cricket::StreamParams stream_params =
1247 cricket::CreateSimStreamParams("cname", ssrcs);
Harald Alvestrand485457f2022-05-23 08:46:57 +00001248 video_media_channel()->AddSendStream(stream_params);
Harald Alvestrandc0d44d92022-12-13 12:57:24 +00001249 video_rtp_sender_->SetMediaChannel(
1250 video_media_channel()->AsVideoSendChannel());
Florent Castelli892acf02018-10-01 22:47:20 +02001251 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
1252
1253 params = video_rtp_sender_->GetParameters();
1254 ASSERT_EQ(2u, params.encodings.size());
1255 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1256
1257 DestroyVideoRtpSender();
1258}
1259
Harald Alvestrand3fe8b0d2022-07-01 07:36:59 +00001260#if GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
1261using RtpSenderReceiverDeathTest = RtpSenderReceiverTest;
1262
1263TEST_F(RtpSenderReceiverDeathTest,
1264 VideoSenderManualRemoveSimulcastFailsDeathTest) {
1265 AddVideoTrack(false);
1266
1267 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
1268 std::make_unique<MockSetStreamsObserver>();
1269 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1270 set_streams_observer.get());
1271 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
1272 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1273 video_rtp_sender_->SetStreams({local_stream_->id()});
1274
1275 std::vector<RtpEncodingParameters> init_encodings(2);
1276 init_encodings[0].max_bitrate_bps = 60000;
1277 init_encodings[1].max_bitrate_bps = 120000;
1278 video_rtp_sender_->set_init_send_encodings(init_encodings);
1279
1280 RtpParameters params = video_rtp_sender_->GetParameters();
1281 ASSERT_EQ(2u, params.encodings.size());
1282 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1283
1284 // Simulate the setLocalDescription call as if the user used SDP munging
1285 // to disable simulcast.
1286 std::vector<uint32_t> ssrcs;
1287 ssrcs.reserve(2);
1288 for (int i = 0; i < 2; ++i)
1289 ssrcs.push_back(kVideoSsrcSimulcast + i);
1290 cricket::StreamParams stream_params =
1291 cricket::StreamParams::CreateLegacy(kVideoSsrc);
1292 video_media_channel()->AddSendStream(stream_params);
Harald Alvestrandc0d44d92022-12-13 12:57:24 +00001293 video_rtp_sender_->SetMediaChannel(
1294 video_media_channel()->AsVideoSendChannel());
Harald Alvestrand3fe8b0d2022-07-01 07:36:59 +00001295 EXPECT_DEATH(video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast), "");
1296}
1297#endif
1298
Florent Castelli892acf02018-10-01 22:47:20 +02001299TEST_F(RtpSenderReceiverTest,
1300 VideoSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001301 video_rtp_sender_ =
1302 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +02001303
1304 RtpParameters params;
1305 RTCError result = video_rtp_sender_->SetParameters(params);
1306 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1307 DestroyVideoRtpSender();
1308}
1309
Florent Castellicebf50f2018-05-03 15:31:53 +02001310TEST_F(RtpSenderReceiverTest,
1311 VideoSenderMustCallGetParametersBeforeSetParameters) {
1312 CreateVideoRtpSender();
1313
1314 RtpParameters params;
1315 RTCError result = video_rtp_sender_->SetParameters(params);
1316 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1317
1318 DestroyVideoRtpSender();
1319}
1320
1321TEST_F(RtpSenderReceiverTest,
1322 VideoSenderSetParametersInvalidatesTransactionId) {
1323 CreateVideoRtpSender();
1324
1325 RtpParameters params = video_rtp_sender_->GetParameters();
1326 EXPECT_EQ(1u, params.encodings.size());
1327 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1328 RTCError result = video_rtp_sender_->SetParameters(params);
1329 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1330
1331 DestroyVideoRtpSender();
1332}
1333
Florent Castelliacabb362022-10-18 17:05:16 +02001334TEST_F(RtpSenderReceiverTest,
1335 VideoSenderSetParametersAsyncInvalidatesTransactionId) {
1336 CreateVideoRtpSender();
1337
1338 RtpParameters params = video_rtp_sender_->GetParameters();
1339 EXPECT_EQ(1u, params.encodings.size());
1340 absl::optional<webrtc::RTCError> result;
1341 video_rtp_sender_->SetParametersAsync(
1342 params, [&result](webrtc::RTCError error) { result = error; });
1343 run_loop_.Flush();
1344 EXPECT_TRUE(result->ok());
1345 video_rtp_sender_->SetParametersAsync(
1346 params, [&result](webrtc::RTCError error) { result = error; });
1347 run_loop_.Flush();
1348 EXPECT_EQ(RTCErrorType::INVALID_STATE, result->type());
1349
1350 DestroyVideoRtpSender();
1351}
1352
Florent Castellicebf50f2018-05-03 15:31:53 +02001353TEST_F(RtpSenderReceiverTest, VideoSenderDetectTransactionIdModification) {
1354 CreateVideoRtpSender();
1355
1356 RtpParameters params = video_rtp_sender_->GetParameters();
1357 params.transaction_id = "";
1358 RTCError result = video_rtp_sender_->SetParameters(params);
1359 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1360
1361 DestroyVideoRtpSender();
1362}
1363
1364TEST_F(RtpSenderReceiverTest, VideoSenderCheckTransactionIdRefresh) {
1365 CreateVideoRtpSender();
1366
1367 RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001368 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 15:31:53 +02001369 auto saved_transaction_id = params.transaction_id;
1370 params = video_rtp_sender_->GetParameters();
1371 EXPECT_NE(saved_transaction_id, params.transaction_id);
1372
1373 DestroyVideoRtpSender();
1374}
1375
1376TEST_F(RtpSenderReceiverTest, VideoSenderSetParametersOldValueFail) {
1377 CreateVideoRtpSender();
1378
1379 RtpParameters params = video_rtp_sender_->GetParameters();
1380 RtpParameters second_params = video_rtp_sender_->GetParameters();
1381
1382 RTCError result = video_rtp_sender_->SetParameters(params);
1383 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1384
1385 DestroyVideoRtpSender();
1386}
1387
Seth Hampson2d2c8882018-05-16 16:02:32 -07001388TEST_F(RtpSenderReceiverTest, VideoSenderCantSetUnimplementedRtpParameters) {
1389 CreateVideoRtpSender();
1390 RtpParameters params = video_rtp_sender_->GetParameters();
1391 EXPECT_EQ(1u, params.encodings.size());
1392
Florent Castelli87b3c512018-07-18 16:00:28 +02001393 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 16:02:32 -07001394 params.mid = "dummy_mid";
1395 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1396 video_rtp_sender_->SetParameters(params).type());
1397 params = video_rtp_sender_->GetParameters();
1398
Seth Hampson2d2c8882018-05-16 16:02:32 -07001399 DestroyVideoRtpSender();
1400}
1401
Florent Castellic1a0bcb2019-01-29 14:26:48 +01001402TEST_F(RtpSenderReceiverTest, VideoSenderCanSetScaleResolutionDownBy) {
1403 CreateVideoRtpSender();
1404
1405 RtpParameters params = video_rtp_sender_->GetParameters();
1406 params.encodings[0].scale_resolution_down_by = 2;
1407
1408 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1409 params = video_rtp_sender_->GetParameters();
1410 EXPECT_EQ(2, params.encodings[0].scale_resolution_down_by);
1411
1412 DestroyVideoRtpSender();
1413}
1414
1415TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidScaleResolutionDownBy) {
1416 CreateVideoRtpSender();
1417
1418 RtpParameters params = video_rtp_sender_->GetParameters();
1419 params.encodings[0].scale_resolution_down_by = 0.5;
1420 RTCError result = video_rtp_sender_->SetParameters(params);
1421 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1422
1423 DestroyVideoRtpSender();
1424}
1425
Ă…sa Perssonfb195962021-08-16 16:41:56 +02001426TEST_F(RtpSenderReceiverTest, VideoSenderCanSetNumTemporalLayers) {
1427 CreateVideoRtpSender();
1428
1429 RtpParameters params = video_rtp_sender_->GetParameters();
1430 params.encodings[0].num_temporal_layers = 2;
1431
1432 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1433 params = video_rtp_sender_->GetParameters();
1434 EXPECT_EQ(2, params.encodings[0].num_temporal_layers);
1435
1436 DestroyVideoRtpSender();
1437}
1438
1439TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidNumTemporalLayers) {
1440 CreateVideoRtpSender();
1441
1442 RtpParameters params = video_rtp_sender_->GetParameters();
1443 params.encodings[0].num_temporal_layers = webrtc::kMaxTemporalStreams + 1;
1444 RTCError result = video_rtp_sender_->SetParameters(params);
1445 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1446
1447 DestroyVideoRtpSender();
1448}
1449
Florent Castelli907dc802019-12-06 15:03:19 +01001450TEST_F(RtpSenderReceiverTest, VideoSenderCanSetMaxFramerate) {
1451 CreateVideoRtpSender();
1452
1453 RtpParameters params = video_rtp_sender_->GetParameters();
1454 params.encodings[0].max_framerate = 20;
1455
1456 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1457 params = video_rtp_sender_->GetParameters();
1458 EXPECT_EQ(20., params.encodings[0].max_framerate);
1459
1460 DestroyVideoRtpSender();
1461}
1462
1463TEST_F(RtpSenderReceiverTest, VideoSenderCanSetMaxFramerateZero) {
1464 CreateVideoRtpSender();
1465
1466 RtpParameters params = video_rtp_sender_->GetParameters();
1467 params.encodings[0].max_framerate = 0.;
1468
1469 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1470 params = video_rtp_sender_->GetParameters();
1471 EXPECT_EQ(0., params.encodings[0].max_framerate);
1472
1473 DestroyVideoRtpSender();
1474}
1475
1476TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidMaxFramerate) {
1477 CreateVideoRtpSender();
1478
1479 RtpParameters params = video_rtp_sender_->GetParameters();
1480 params.encodings[0].max_framerate = -5.;
1481 RTCError result = video_rtp_sender_->SetParameters(params);
1482 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1483
1484 DestroyVideoRtpSender();
1485}
1486
Seth Hampson2d2c8882018-05-16 16:02:32 -07001487// A video sender can have multiple simulcast layers, in which case it will
1488// contain multiple RtpEncodingParameters. This tests that if this is the case
1489// (simulcast), then we can't set the bitrate_priority, or max_bitrate_bps
1490// for any encodings besides at index 0, because these are both implemented
1491// "per-sender."
1492TEST_F(RtpSenderReceiverTest, VideoSenderCantSetPerSenderEncodingParameters) {
1493 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001494 CreateVideoRtpSenderWithSimulcast();
Seth Hampson2d2c8882018-05-16 16:02:32 -07001495 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001496 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Seth Hampson2d2c8882018-05-16 16:02:32 -07001497
1498 params.encodings[1].bitrate_priority = 2.0;
1499 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1500 video_rtp_sender_->SetParameters(params).type());
1501 params = video_rtp_sender_->GetParameters();
1502
Seth Hampson2d2c8882018-05-16 16:02:32 -07001503 DestroyVideoRtpSender();
1504}
1505
Florent Castelli892acf02018-10-01 22:47:20 +02001506TEST_F(RtpSenderReceiverTest, VideoSenderCantSetReadOnlyEncodingParameters) {
1507 // Add a simulcast specific send stream that contains 2 encoding parameters.
1508 CreateVideoRtpSenderWithSimulcast();
1509 RtpParameters params = video_rtp_sender_->GetParameters();
1510 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
1511
1512 for (size_t i = 0; i < params.encodings.size(); i++) {
1513 params.encodings[i].ssrc = 1337;
1514 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION,
1515 video_rtp_sender_->SetParameters(params).type());
1516 params = video_rtp_sender_->GetParameters();
1517 }
1518
1519 DestroyVideoRtpSender();
1520}
1521
Ă…sa Persson55659812018-06-18 17:51:32 +02001522TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrate) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001523 CreateVideoRtpSender();
1524
Harald Alvestrand485457f2022-05-23 08:46:57 +00001525 EXPECT_EQ(-1, video_media_channel()->max_bps());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001526 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001527 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001528 EXPECT_FALSE(params.encodings[0].min_bitrate_bps);
deadbeefe702b302017-02-04 12:09:01 -08001529 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Ă…sa Persson55659812018-06-18 17:51:32 +02001530 params.encodings[0].min_bitrate_bps = 100;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001531 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -08001532 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001533
1534 // Read back the parameters and verify they have been changed.
1535 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001536 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001537 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001538 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001539
1540 // Verify that the video channel received the new parameters.
Harald Alvestrand485457f2022-05-23 08:46:57 +00001541 params = video_media_channel()->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001542 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001543 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001544 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001545
1546 // Verify that the global bitrate limit has not been changed.
Harald Alvestrand485457f2022-05-23 08:46:57 +00001547 EXPECT_EQ(-1, video_media_channel()->max_bps());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001548
1549 DestroyVideoRtpSender();
1550}
1551
Ă…sa Persson55659812018-06-18 17:51:32 +02001552TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrateSimulcast) {
1553 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001554 CreateVideoRtpSenderWithSimulcast();
Ă…sa Persson55659812018-06-18 17:51:32 +02001555
1556 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001557 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001558 params.encodings[0].min_bitrate_bps = 100;
1559 params.encodings[0].max_bitrate_bps = 1000;
1560 params.encodings[1].min_bitrate_bps = 200;
1561 params.encodings[1].max_bitrate_bps = 2000;
1562 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1563
1564 // Verify that the video channel received the new parameters.
Harald Alvestrand485457f2022-05-23 08:46:57 +00001565 params = video_media_channel()->GetRtpSendParameters(kVideoSsrcSimulcast);
Florent Castelli892acf02018-10-01 22:47:20 +02001566 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001567 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
1568 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
1569 EXPECT_EQ(200, params.encodings[1].min_bitrate_bps);
1570 EXPECT_EQ(2000, params.encodings[1].max_bitrate_bps);
1571
1572 DestroyVideoRtpSender();
1573}
1574
Seth Hampson24722b32017-12-22 09:36:42 -08001575TEST_F(RtpSenderReceiverTest, SetVideoBitratePriority) {
1576 CreateVideoRtpSender();
1577
1578 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001579 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001580 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1581 params.encodings[0].bitrate_priority);
1582 double new_bitrate_priority = 2.0;
1583 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -08001584 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -08001585
1586 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001587 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001588 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1589
Harald Alvestrand485457f2022-05-23 08:46:57 +00001590 params = video_media_channel()->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001591 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001592 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1593
1594 DestroyVideoRtpSender();
1595}
1596
Florent Castelli38332cd2018-11-20 14:08:06 +01001597TEST_F(RtpSenderReceiverTest, VideoReceiverCanGetParametersWithSimulcast) {
1598 CreateVideoRtpReceiverWithSimulcast({}, 2);
1599
1600 RtpParameters params = video_rtp_receiver_->GetParameters();
1601 EXPECT_EQ(2u, params.encodings.size());
1602
1603 DestroyVideoRtpReceiver();
1604}
1605
Philipp Hanckeb83cd922022-11-09 11:06:38 +01001606TEST_F(RtpSenderReceiverTest, GenerateKeyFrameWithAudio) {
1607 CreateAudioRtpSender();
1608
1609 auto error = audio_rtp_sender_->GenerateKeyFrame({});
1610 EXPECT_FALSE(error.ok());
1611 EXPECT_EQ(error.type(), RTCErrorType::UNSUPPORTED_OPERATION);
1612
1613 DestroyAudioRtpSender();
1614}
1615
1616TEST_F(RtpSenderReceiverTest, GenerateKeyFrameWithVideo) {
1617 CreateVideoRtpSenderWithSimulcast({"1", "2", "3"});
1618
1619 auto error = video_rtp_sender_->GenerateKeyFrame({});
1620 EXPECT_TRUE(error.ok());
1621
1622 error = video_rtp_sender_->GenerateKeyFrame({"1"});
1623 EXPECT_TRUE(error.ok());
1624
1625 error = video_rtp_sender_->GenerateKeyFrame({""});
1626 EXPECT_FALSE(error.ok());
1627 EXPECT_EQ(error.type(), RTCErrorType::INVALID_PARAMETER);
1628
1629 error = video_rtp_sender_->GenerateKeyFrame({"no-such-rid"});
1630 EXPECT_FALSE(error.ok());
1631 EXPECT_EQ(error.type(), RTCErrorType::INVALID_PARAMETER);
1632
1633 DestroyVideoRtpSender();
1634}
1635
pbos5214a0a2016-12-16 15:39:11 -08001636// Test that makes sure that a video track content hint translates to the proper
1637// value for sources that are not screencast.
1638TEST_F(RtpSenderReceiverTest, PropagatesVideoTrackContentHint) {
1639 CreateVideoRtpSender();
1640
1641 video_track_->set_enabled(true);
1642
Artem Titov880fa812021-07-30 22:30:23 +02001643 // `video_track_` is not screencast by default.
Harald Alvestrand485457f2022-05-23 08:46:57 +00001644 EXPECT_EQ(false, video_media_channel()->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001645 // No content hint should be set by default.
1646 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1647 video_track_->content_hint());
1648 // Setting detailed should turn a non-screencast source into screencast mode.
1649 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Harald Alvestrand485457f2022-05-23 08:46:57 +00001650 EXPECT_EQ(true, video_media_channel()->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001651 // Removing the content hint should turn the track back into non-screencast
1652 // mode.
1653 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Harald Alvestrand485457f2022-05-23 08:46:57 +00001654 EXPECT_EQ(false, video_media_channel()->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001655 // Setting fluid should remain in non-screencast mode (its default).
1656 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Harald Alvestrand485457f2022-05-23 08:46:57 +00001657 EXPECT_EQ(false, video_media_channel()->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 08:53:10 +02001658 // Setting text should have the same effect as Detailed
1659 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
Harald Alvestrand485457f2022-05-23 08:46:57 +00001660 EXPECT_EQ(true, video_media_channel()->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001661
1662 DestroyVideoRtpSender();
1663}
1664
1665// Test that makes sure that a video track content hint translates to the proper
1666// value for screencast sources.
1667TEST_F(RtpSenderReceiverTest,
1668 PropagatesVideoTrackContentHintForScreencastSource) {
1669 CreateVideoRtpSender(true);
1670
1671 video_track_->set_enabled(true);
1672
Artem Titov880fa812021-07-30 22:30:23 +02001673 // `video_track_` with a screencast source should be screencast by default.
Harald Alvestrand485457f2022-05-23 08:46:57 +00001674 EXPECT_EQ(true, video_media_channel()->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001675 // No content hint should be set by default.
1676 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1677 video_track_->content_hint());
1678 // Setting fluid should turn a screencast source into non-screencast mode.
1679 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Harald Alvestrand485457f2022-05-23 08:46:57 +00001680 EXPECT_EQ(false, video_media_channel()->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001681 // Removing the content hint should turn the track back into screencast mode.
1682 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Harald Alvestrand485457f2022-05-23 08:46:57 +00001683 EXPECT_EQ(true, video_media_channel()->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001684 // Setting detailed should still remain in screencast mode (its default).
1685 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Harald Alvestrand485457f2022-05-23 08:46:57 +00001686 EXPECT_EQ(true, video_media_channel()->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 08:53:10 +02001687 // Setting text should have the same effect as Detailed
1688 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
Harald Alvestrand485457f2022-05-23 08:46:57 +00001689 EXPECT_EQ(true, video_media_channel()->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001690
1691 DestroyVideoRtpSender();
1692}
1693
1694// Test that makes sure any content hints that are set on a track before
1695// VideoRtpSender is ready to send are still applied when it gets ready to send.
1696TEST_F(RtpSenderReceiverTest,
1697 PropagatesVideoTrackContentHintSetBeforeEnabling) {
1698 AddVideoTrack();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001699 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001700 std::make_unique<MockSetStreamsObserver>();
pbos5214a0a2016-12-16 15:39:11 -08001701 // Setting detailed overrides the default non-screencast mode. This should be
1702 // applied even if the track is set on construction.
1703 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001704 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1705 set_streams_observer.get());
Niels Möllerafb246b2022-04-20 14:26:50 +02001706 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001707 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1708 video_rtp_sender_->SetStreams({local_stream_->id()});
Harald Alvestrandc0d44d92022-12-13 12:57:24 +00001709 video_rtp_sender_->SetMediaChannel(
1710 video_media_channel()->AsVideoSendChannel());
pbos5214a0a2016-12-16 15:39:11 -08001711 video_track_->set_enabled(true);
1712
1713 // Sender is not ready to send (no SSRC) so no option should have been set.
Harald Alvestrand485457f2022-05-23 08:46:57 +00001714 EXPECT_EQ(absl::nullopt, video_media_channel()->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001715
1716 // Verify that the content hint is accounted for when video_rtp_sender_ does
1717 // get enabled.
1718 video_rtp_sender_->SetSsrc(kVideoSsrc);
Harald Alvestrand485457f2022-05-23 08:46:57 +00001719 EXPECT_EQ(true, video_media_channel()->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001720
1721 // And removing the hint should go back to false (to verify that false was
1722 // default correctly).
1723 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Harald Alvestrand485457f2022-05-23 08:46:57 +00001724 EXPECT_EQ(false, video_media_channel()->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001725
1726 DestroyVideoRtpSender();
1727}
1728
deadbeef20cb0c12017-02-01 20:27:00 -08001729TEST_F(RtpSenderReceiverTest, AudioSenderHasDtmfSender) {
1730 CreateAudioRtpSender();
1731 EXPECT_NE(nullptr, audio_rtp_sender_->GetDtmfSender());
1732}
1733
1734TEST_F(RtpSenderReceiverTest, VideoSenderDoesNotHaveDtmfSender) {
1735 CreateVideoRtpSender();
1736 EXPECT_EQ(nullptr, video_rtp_sender_->GetDtmfSender());
1737}
1738
Artem Titov880fa812021-07-30 22:30:23 +02001739// Test that the DTMF sender is really using `voice_channel_`, and thus returns
1740// true/false from CanSendDtmf based on what `voice_channel_` returns.
deadbeef20cb0c12017-02-01 20:27:00 -08001741TEST_F(RtpSenderReceiverTest, CanInsertDtmf) {
1742 AddDtmfCodec();
1743 CreateAudioRtpSender();
1744 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1745 ASSERT_NE(nullptr, dtmf_sender);
1746 EXPECT_TRUE(dtmf_sender->CanInsertDtmf());
1747}
1748
1749TEST_F(RtpSenderReceiverTest, CanNotInsertDtmf) {
1750 CreateAudioRtpSender();
1751 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1752 ASSERT_NE(nullptr, dtmf_sender);
1753 // DTMF codec has not been added, as it was in the above test.
1754 EXPECT_FALSE(dtmf_sender->CanInsertDtmf());
1755}
1756
1757TEST_F(RtpSenderReceiverTest, InsertDtmf) {
1758 AddDtmfCodec();
1759 CreateAudioRtpSender();
1760 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1761 ASSERT_NE(nullptr, dtmf_sender);
1762
Harald Alvestrand485457f2022-05-23 08:46:57 +00001763 EXPECT_EQ(0U, voice_media_channel()->dtmf_info_queue().size());
deadbeef20cb0c12017-02-01 20:27:00 -08001764
1765 // Insert DTMF
1766 const int expected_duration = 90;
1767 dtmf_sender->InsertDtmf("012", expected_duration, 100);
1768
1769 // Verify
Harald Alvestrand485457f2022-05-23 08:46:57 +00001770 ASSERT_EQ_WAIT(3U, voice_media_channel()->dtmf_info_queue().size(),
deadbeef20cb0c12017-02-01 20:27:00 -08001771 kDefaultTimeout);
1772 const uint32_t send_ssrc =
Harald Alvestrand485457f2022-05-23 08:46:57 +00001773 voice_media_channel()->send_streams()[0].first_ssrc();
1774 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel()->dtmf_info_queue()[0],
deadbeef20cb0c12017-02-01 20:27:00 -08001775 send_ssrc, 0, expected_duration));
Harald Alvestrand485457f2022-05-23 08:46:57 +00001776 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel()->dtmf_info_queue()[1],
deadbeef20cb0c12017-02-01 20:27:00 -08001777 send_ssrc, 1, expected_duration));
Harald Alvestrand485457f2022-05-23 08:46:57 +00001778 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel()->dtmf_info_queue()[2],
deadbeef20cb0c12017-02-01 20:27:00 -08001779 send_ssrc, 2, expected_duration));
1780}
1781
Benjamin Wright84583f62018-10-04 14:22:34 -07001782// Validate that the default FrameEncryptor setting is nullptr.
1783TEST_F(RtpSenderReceiverTest, AudioSenderCanSetFrameEncryptor) {
1784 CreateAudioRtpSender();
1785 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1786 new FakeFrameEncryptor());
1787 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1788 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1789 EXPECT_EQ(fake_frame_encryptor.get(),
1790 audio_rtp_sender_->GetFrameEncryptor().get());
1791}
1792
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001793// Validate that setting a FrameEncryptor after the send stream is stopped does
1794// nothing.
1795TEST_F(RtpSenderReceiverTest, AudioSenderCannotSetFrameEncryptorAfterStop) {
1796 CreateAudioRtpSender();
1797 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1798 new FakeFrameEncryptor());
1799 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1800 audio_rtp_sender_->Stop();
1801 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1802 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1803}
1804
Benjamin Wright84583f62018-10-04 14:22:34 -07001805// Validate that the default FrameEncryptor setting is nullptr.
1806TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetFrameDecryptor) {
1807 CreateAudioRtpReceiver();
1808 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
Tomas Gunnarssonb3517fe2022-03-18 19:32:38 +01001809 rtc::make_ref_counted<FakeFrameDecryptor>());
Benjamin Wright84583f62018-10-04 14:22:34 -07001810 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
1811 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1812 EXPECT_EQ(fake_frame_decryptor.get(),
1813 audio_rtp_receiver_->GetFrameDecryptor().get());
Tommi4ccdf932021-05-17 14:50:10 +02001814 DestroyAudioRtpReceiver();
Benjamin Wright84583f62018-10-04 14:22:34 -07001815}
1816
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001817// Validate that the default FrameEncryptor setting is nullptr.
1818TEST_F(RtpSenderReceiverTest, AudioReceiverCannotSetFrameDecryptorAfterStop) {
1819 CreateAudioRtpReceiver();
1820 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
Tomas Gunnarssonb3517fe2022-03-18 19:32:38 +01001821 rtc::make_ref_counted<FakeFrameDecryptor>());
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001822 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
Tommi6589def2022-02-17 23:36:47 +01001823 audio_rtp_receiver_->SetMediaChannel(nullptr);
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001824 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1825 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
Tommi4ccdf932021-05-17 14:50:10 +02001826 DestroyAudioRtpReceiver();
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001827}
1828
1829// Validate that the default FrameEncryptor setting is nullptr.
1830TEST_F(RtpSenderReceiverTest, VideoSenderCanSetFrameEncryptor) {
1831 CreateVideoRtpSender();
1832 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1833 new FakeFrameEncryptor());
1834 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1835 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1836 EXPECT_EQ(fake_frame_encryptor.get(),
1837 video_rtp_sender_->GetFrameEncryptor().get());
1838}
1839
1840// Validate that setting a FrameEncryptor after the send stream is stopped does
1841// nothing.
1842TEST_F(RtpSenderReceiverTest, VideoSenderCannotSetFrameEncryptorAfterStop) {
1843 CreateVideoRtpSender();
1844 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1845 new FakeFrameEncryptor());
1846 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1847 video_rtp_sender_->Stop();
1848 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1849 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1850}
1851
1852// Validate that the default FrameEncryptor setting is nullptr.
1853TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetFrameDecryptor) {
1854 CreateVideoRtpReceiver();
1855 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
Tomas Gunnarssonb3517fe2022-03-18 19:32:38 +01001856 rtc::make_ref_counted<FakeFrameDecryptor>());
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001857 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
1858 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1859 EXPECT_EQ(fake_frame_decryptor.get(),
1860 video_rtp_receiver_->GetFrameDecryptor().get());
Tommi4ccdf932021-05-17 14:50:10 +02001861 DestroyVideoRtpReceiver();
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001862}
1863
1864// Validate that the default FrameEncryptor setting is nullptr.
1865TEST_F(RtpSenderReceiverTest, VideoReceiverCannotSetFrameDecryptorAfterStop) {
1866 CreateVideoRtpReceiver();
1867 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
Tomas Gunnarssonb3517fe2022-03-18 19:32:38 +01001868 rtc::make_ref_counted<FakeFrameDecryptor>());
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001869 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
Tommi6589def2022-02-17 23:36:47 +01001870 video_rtp_receiver_->SetMediaChannel(nullptr);
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001871 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1872 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
Tommi4ccdf932021-05-17 14:50:10 +02001873 DestroyVideoRtpReceiver();
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001874}
1875
Amit Hilbuch619b2942019-02-26 15:55:19 -08001876// Checks that calling the internal methods for get/set parameters do not
1877// invalidate any parameters retreived by clients.
1878TEST_F(RtpSenderReceiverTest,
1879 InternalParameterMethodsDoNotInvalidateTransaction) {
1880 CreateVideoRtpSender();
1881 RtpParameters parameters = video_rtp_sender_->GetParameters();
1882 RtpParameters new_parameters = video_rtp_sender_->GetParametersInternal();
1883 new_parameters.encodings[0].active = false;
Florent Castelliacabb362022-10-18 17:05:16 +02001884 video_rtp_sender_->SetParametersInternal(new_parameters, nullptr, true);
Amit Hilbuch619b2942019-02-26 15:55:19 -08001885 new_parameters.encodings[0].active = true;
Florent Castelliacabb362022-10-18 17:05:16 +02001886 video_rtp_sender_->SetParametersInternal(new_parameters, nullptr, true);
Amit Hilbuch619b2942019-02-26 15:55:19 -08001887 parameters.encodings[0].active = false;
1888 EXPECT_TRUE(video_rtp_sender_->SetParameters(parameters).ok());
1889}
1890
Amit Hilbuch2297d332019-02-19 12:49:22 -08001891// Helper method for syntactic sugar for accepting a vector with '{}' notation.
1892std::pair<RidList, RidList> CreatePairOfRidVectors(
1893 const std::vector<std::string>& first,
1894 const std::vector<std::string>& second) {
1895 return std::make_pair(first, second);
1896}
1897
1898// These parameters are used to test disabling simulcast layers.
1899const std::pair<RidList, RidList> kDisableSimulcastLayersParameters[] = {
1900 // Tests removing the first layer. This is a special case because
1901 // the first layer's SSRC is also the 'primary' SSRC used to associate the
1902 // parameters to the media channel.
1903 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"1"}),
1904 // Tests removing some layers.
1905 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"2", "4"}),
1906 // Tests simulcast rejected scenario all layers except first are rejected.
1907 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"2", "3", "4"}),
1908 // Tests removing all layers.
1909 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"1", "2", "3", "4"}),
1910};
1911
1912// Runs test for disabling layers on a sender without a media engine set.
1913TEST_P(RtpSenderReceiverTest, DisableSimulcastLayersWithoutMediaEngine) {
1914 auto parameter = GetParam();
1915 RunDisableSimulcastLayersWithoutMediaEngineTest(parameter.first,
1916 parameter.second);
1917}
1918
1919// Runs test for disabling layers on a sender with a media engine set.
1920TEST_P(RtpSenderReceiverTest, DisableSimulcastLayersWithMediaEngine) {
1921 auto parameter = GetParam();
1922 RunDisableSimulcastLayersWithMediaEngineTest(parameter.first,
1923 parameter.second);
1924}
1925
1926INSTANTIATE_TEST_SUITE_P(
1927 DisableSimulcastLayersInSender,
1928 RtpSenderReceiverTest,
1929 ::testing::ValuesIn(kDisableSimulcastLayersParameters));
1930
deadbeef70ab1a12015-09-28 16:53:55 -07001931} // namespace webrtc