blob: c0b09e39c3df63a87e71322372d3ee50c1f389f4 [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/channel_manager.h"
56#include "pc/dtls_srtp_transport.h"
57#include "pc/local_audio_source.h"
58#include "pc/media_stream.h"
Steve Anton10542f22019-01-11 09:11:00 -080059#include "pc/rtp_sender.h"
60#include "pc/rtp_transport_internal.h"
61#include "pc/test/fake_video_track_source.h"
Ruslan Burakov501bfba2019-02-11 10:29:19 +010062#include "pc/video_rtp_receiver.h"
Steve Anton10542f22019-01-11 09:11:00 -080063#include "pc/video_track.h"
Yves Gerey3e707812018-11-28 16:47:49 +010064#include "rtc_base/checks.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020065#include "rtc_base/gunit.h"
Harald Alvestrandc24a2182022-02-23 13:44:59 +000066#include "rtc_base/location.h"
67#include "rtc_base/ref_counted_object.h"
Yves Gerey3e707812018-11-28 16:47:49 +010068#include "rtc_base/third_party/sigslot/sigslot.h"
69#include "rtc_base/thread.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020070#include "test/gmock.h"
71#include "test/gtest.h"
Tommi4ccdf932021-05-17 14:50:10 +020072#include "test/run_loop.h"
deadbeef70ab1a12015-09-28 16:53:55 -070073
74using ::testing::_;
Amit Hilbuch2297d332019-02-19 12:49:22 -080075using ::testing::ContainerEq;
deadbeef70ab1a12015-09-28 16:53:55 -070076using ::testing::Exactly;
deadbeef5dd42fd2016-05-02 16:20:01 -070077using ::testing::InvokeWithoutArgs;
skvladdc1c62c2016-03-16 19:07:43 -070078using ::testing::Return;
Amit Hilbuch2297d332019-02-19 12:49:22 -080079using RidList = std::vector<std::string>;
deadbeef70ab1a12015-09-28 16:53:55 -070080
deadbeef20cb0c12017-02-01 20:27:00 -080081namespace {
82
Seth Hampson845e8782018-03-02 11:34:10 -080083static const char kStreamId1[] = "local_stream_1";
deadbeef70ab1a12015-09-28 16:53:55 -070084static const char kVideoTrackId[] = "video_1";
85static const char kAudioTrackId[] = "audio_1";
Peter Boström0c4e06b2015-10-07 12:23:21 +020086static const uint32_t kVideoSsrc = 98;
deadbeeffac06552015-11-25 11:26:01 -080087static const uint32_t kVideoSsrc2 = 100;
Peter Boström0c4e06b2015-10-07 12:23:21 +020088static const uint32_t kAudioSsrc = 99;
deadbeeffac06552015-11-25 11:26:01 -080089static const uint32_t kAudioSsrc2 = 101;
Florent Castelli892acf02018-10-01 22:47:20 +020090static const uint32_t kVideoSsrcSimulcast = 102;
91static const uint32_t kVideoSimulcastLayerCount = 2;
deadbeef20cb0c12017-02-01 20:27:00 -080092static const int kDefaultTimeout = 10000; // 10 seconds.
Guido Urdaneta1ff16c82019-05-20 19:31:53 +020093
94class MockSetStreamsObserver
95 : public webrtc::RtpSenderBase::SetStreamsObserver {
96 public:
Danil Chapovalov3a353122020-05-15 11:16:53 +020097 MOCK_METHOD(void, OnSetStreams, (), (override));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +020098};
99
deadbeef20cb0c12017-02-01 20:27:00 -0800100} // namespace
deadbeef70ab1a12015-09-28 16:53:55 -0700101
102namespace webrtc {
103
Amit Hilbuch2297d332019-02-19 12:49:22 -0800104class RtpSenderReceiverTest
Mirko Bonadei6a489f22019-04-09 15:11:12 +0200105 : public ::testing::Test,
106 public ::testing::WithParamInterface<std::pair<RidList, RidList>>,
Amit Hilbuch2297d332019-02-19 12:49:22 -0800107 public sigslot::has_slots<> {
tkchin3784b4a2016-06-24 19:31:47 -0700108 public:
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700109 RtpSenderReceiverTest()
Steve Anton47136dd2018-01-12 10:49:35 -0800110 : network_thread_(rtc::Thread::Current()),
111 worker_thread_(rtc::Thread::Current()),
Jonas Orelanda3aa9bd2019-04-17 07:38:40 +0200112 video_bitrate_allocator_factory_(
113 webrtc::CreateBuiltinVideoBitrateAllocatorFactory()),
Steve Anton47136dd2018-01-12 10:49:35 -0800114 // Create fake media engine/etc. so we can create channels to use to
115 // test RtpSenders/RtpReceivers.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700116 media_engine_(new cricket::FakeMediaEngine()),
Tomas Gunnarssone984aa22021-04-19 09:21:06 +0200117 fake_call_(worker_thread_, network_thread_),
Seth Hampson845e8782018-03-02 11:34:10 -0800118 local_stream_(MediaStream::Create(kStreamId1)) {
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200119 worker_thread_->Invoke<void>(RTC_FROM_HERE, [&]() {
120 channel_manager_ = cricket::ChannelManager::Create(
Harald Alvestrand7af57c62021-04-16 11:12:14 +0000121 absl::WrapUnique(media_engine_), false, worker_thread_,
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200122 network_thread_);
123 });
124
deadbeef7af91dd2016-12-13 11:29:11 -0800125 bool srtp_required = true;
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200126 rtp_dtls_transport_ = std::make_unique<cricket::FakeDtlsTransport>(
Zhi Huange830e682018-03-30 10:48:35 -0700127 "fake_dtls_transport", cricket::ICE_CANDIDATE_COMPONENT_RTP);
128 rtp_transport_ = CreateDtlsSrtpTransport();
129
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200130 voice_channel_ = channel_manager_->CreateVoiceChannel(
Tomas Gunnarsson5411b172022-01-24 08:45:26 +0100131 &fake_call_, cricket::MediaConfig(), cricket::CN_AUDIO, srtp_required,
132 webrtc::CryptoOptions(), cricket::AudioOptions());
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200133 video_channel_ = channel_manager_->CreateVideoChannel(
Tomas Gunnarsson5411b172022-01-24 08:45:26 +0100134 &fake_call_, cricket::MediaConfig(), cricket::CN_VIDEO, srtp_required,
135 webrtc::CryptoOptions(), cricket::VideoOptions(),
Niels Möller2a707032020-06-16 16:39:13 +0200136 video_bitrate_allocator_factory_.get());
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +0100137
138 voice_channel_->SetRtpTransport(rtp_transport_.get());
139 video_channel_->SetRtpTransport(rtp_transport_.get());
140
deadbeef20cb0c12017-02-01 20:27:00 -0800141 voice_channel_->Enable(true);
142 video_channel_->Enable(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700143 voice_media_channel_ = media_engine_->GetVoiceChannel(0);
144 video_media_channel_ = media_engine_->GetVideoChannel(0);
145 RTC_CHECK(voice_channel_);
146 RTC_CHECK(video_channel_);
147 RTC_CHECK(voice_media_channel_);
148 RTC_CHECK(video_media_channel_);
149
150 // Create streams for predefined SSRCs. Streams need to exist in order
151 // for the senders and receievers to apply parameters to them.
152 // Normally these would be created by SetLocalDescription and
153 // SetRemoteDescription.
154 voice_media_channel_->AddSendStream(
155 cricket::StreamParams::CreateLegacy(kAudioSsrc));
156 voice_media_channel_->AddRecvStream(
157 cricket::StreamParams::CreateLegacy(kAudioSsrc));
158 voice_media_channel_->AddSendStream(
159 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
160 voice_media_channel_->AddRecvStream(
161 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
162 video_media_channel_->AddSendStream(
163 cricket::StreamParams::CreateLegacy(kVideoSsrc));
164 video_media_channel_->AddRecvStream(
165 cricket::StreamParams::CreateLegacy(kVideoSsrc));
166 video_media_channel_->AddSendStream(
167 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
168 video_media_channel_->AddRecvStream(
169 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
tkchin3784b4a2016-06-24 19:31:47 -0700170 }
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700171
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200172 ~RtpSenderReceiverTest() {
173 audio_rtp_sender_ = nullptr;
174 video_rtp_sender_ = nullptr;
175 audio_rtp_receiver_ = nullptr;
176 video_rtp_receiver_ = nullptr;
177 local_stream_ = nullptr;
178 video_track_ = nullptr;
179 audio_track_ = nullptr;
Tomas Gunnarsson2e85b5f2022-01-15 14:04:27 +0100180
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +0100181 voice_channel_->SetRtpTransport(nullptr);
182 video_channel_->SetRtpTransport(nullptr);
183
Tomas Gunnarsson5411b172022-01-24 08:45:26 +0100184 channel_manager_->DestroyChannel(voice_channel_);
185 channel_manager_->DestroyChannel(video_channel_);
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200186 }
187
Zhi Huange830e682018-03-30 10:48:35 -0700188 std::unique_ptr<webrtc::RtpTransportInternal> CreateDtlsSrtpTransport() {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200189 auto dtls_srtp_transport = std::make_unique<webrtc::DtlsSrtpTransport>(
Karl Wiberg918f50c2018-07-05 11:40:33 +0200190 /*rtcp_mux_required=*/true);
Zhi Huange830e682018-03-30 10:48:35 -0700191 dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport_.get(),
192 /*rtcp_dtls_transport=*/nullptr);
193 return dtls_srtp_transport;
194 }
195
deadbeef20cb0c12017-02-01 20:27:00 -0800196 // Needed to use DTMF sender.
197 void AddDtmfCodec() {
198 cricket::AudioSendParameters params;
199 const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000,
200 0, 1);
201 params.codecs.push_back(kTelephoneEventCodec);
202 voice_media_channel_->SetSendParameters(params);
203 }
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700204
pbos5214a0a2016-12-16 15:39:11 -0800205 void AddVideoTrack() { AddVideoTrack(false); }
206
207 void AddVideoTrack(bool is_screencast) {
perkja3ede6c2016-03-08 01:27:48 +0100208 rtc::scoped_refptr<VideoTrackSourceInterface> source(
pbos5214a0a2016-12-16 15:39:11 -0800209 FakeVideoTrackSource::Create(is_screencast));
perkj773be362017-07-31 23:22:01 -0700210 video_track_ =
211 VideoTrack::Create(kVideoTrackId, source, rtc::Thread::Current());
deadbeefe814a0d2017-02-25 18:15:09 -0800212 EXPECT_TRUE(local_stream_->AddTrack(video_track_));
deadbeef70ab1a12015-09-28 16:53:55 -0700213 }
214
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700215 void CreateAudioRtpSender() { CreateAudioRtpSender(nullptr); }
216
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +0100217 void CreateAudioRtpSender(
218 const rtc::scoped_refptr<LocalAudioSource>& source) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700219 audio_track_ = AudioTrack::Create(kAudioTrackId, source);
deadbeefe814a0d2017-02-25 18:15:09 -0800220 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200221 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200222 std::make_unique<MockSetStreamsObserver>();
Steve Anton47136dd2018-01-12 10:49:35 -0800223 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200224 AudioRtpSender::Create(worker_thread_, audio_track_->id(), nullptr,
225 set_streams_observer.get());
Steve Anton111fdfd2018-06-25 13:03:36 -0700226 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200227 EXPECT_CALL(*set_streams_observer, OnSetStreams());
228 audio_rtp_sender_->SetStreams({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800229 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
deadbeeffac06552015-11-25 11:26:01 -0800230 audio_rtp_sender_->SetSsrc(kAudioSsrc);
deadbeef20cb0c12017-02-01 20:27:00 -0800231 audio_rtp_sender_->GetOnDestroyedSignal()->connect(
232 this, &RtpSenderReceiverTest::OnAudioSenderDestroyed);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700233 VerifyVoiceChannelInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700234 }
235
Steve Anton02ee47c2018-01-10 16:26:06 -0800236 void CreateAudioRtpSenderWithNoTrack() {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800237 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200238 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800239 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
Steve Anton02ee47c2018-01-10 16:26:06 -0800240 }
241
deadbeef20cb0c12017-02-01 20:27:00 -0800242 void OnAudioSenderDestroyed() { audio_sender_destroyed_signal_fired_ = true; }
243
Seth Hampson2d2c8882018-05-16 16:02:32 -0700244 void CreateVideoRtpSender(uint32_t ssrc) {
245 CreateVideoRtpSender(false, ssrc);
246 }
247
pbos5214a0a2016-12-16 15:39:11 -0800248 void CreateVideoRtpSender() { CreateVideoRtpSender(false); }
249
Amit Hilbuch2297d332019-02-19 12:49:22 -0800250 cricket::StreamParams CreateSimulcastStreamParams(int num_layers) {
Florent Castelli892acf02018-10-01 22:47:20 +0200251 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +0100252 ssrcs.reserve(num_layers);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800253 for (int i = 0; i < num_layers; ++i) {
Florent Castelli892acf02018-10-01 22:47:20 +0200254 ssrcs.push_back(kVideoSsrcSimulcast + i);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800255 }
256 return cricket::CreateSimStreamParams("cname", ssrcs);
257 }
258
259 uint32_t CreateVideoRtpSender(const cricket::StreamParams& stream_params) {
Florent Castelli892acf02018-10-01 22:47:20 +0200260 video_media_channel_->AddSendStream(stream_params);
261 uint32_t primary_ssrc = stream_params.first_ssrc();
262 CreateVideoRtpSender(primary_ssrc);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800263 return primary_ssrc;
264 }
265
266 uint32_t CreateVideoRtpSenderWithSimulcast(
267 int num_layers = kVideoSimulcastLayerCount) {
268 return CreateVideoRtpSender(CreateSimulcastStreamParams(num_layers));
269 }
270
271 uint32_t CreateVideoRtpSenderWithSimulcast(
272 const std::vector<std::string>& rids) {
273 cricket::StreamParams stream_params =
274 CreateSimulcastStreamParams(rids.size());
275 std::vector<cricket::RidDescription> rid_descriptions;
276 absl::c_transform(
277 rids, std::back_inserter(rid_descriptions), [](const std::string& rid) {
278 return cricket::RidDescription(rid, cricket::RidDirection::kSend);
279 });
280 stream_params.set_rids(rid_descriptions);
281 return CreateVideoRtpSender(stream_params);
Florent Castelli892acf02018-10-01 22:47:20 +0200282 }
283
Seth Hampson2d2c8882018-05-16 16:02:32 -0700284 void CreateVideoRtpSender(bool is_screencast, uint32_t ssrc = kVideoSsrc) {
pbos5214a0a2016-12-16 15:39:11 -0800285 AddVideoTrack(is_screencast);
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200286 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200287 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200288 video_rtp_sender_ = VideoRtpSender::Create(
289 worker_thread_, video_track_->id(), set_streams_observer.get());
Steve Anton111fdfd2018-06-25 13:03:36 -0700290 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200291 EXPECT_CALL(*set_streams_observer, OnSetStreams());
292 video_rtp_sender_->SetStreams({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800293 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Seth Hampson2d2c8882018-05-16 16:02:32 -0700294 video_rtp_sender_->SetSsrc(ssrc);
295 VerifyVideoChannelInput(ssrc);
deadbeef70ab1a12015-09-28 16:53:55 -0700296 }
Steve Anton02ee47c2018-01-10 16:26:06 -0800297 void CreateVideoRtpSenderWithNoTrack() {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200298 video_rtp_sender_ =
299 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800300 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Steve Anton02ee47c2018-01-10 16:26:06 -0800301 }
302
deadbeef70ab1a12015-09-28 16:53:55 -0700303 void DestroyAudioRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700304 audio_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700305 VerifyVoiceChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700306 }
307
308 void DestroyVideoRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700309 video_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700310 VerifyVideoChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700311 }
312
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100313 void CreateAudioRtpReceiver(
314 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
Tommi4ccdf932021-05-17 14:50:10 +0200315 audio_rtp_receiver_ = rtc::make_ref_counted<AudioRtpReceiver>(
316 rtc::Thread::Current(), kAudioTrackId, streams,
317 /*is_unified_plan=*/true);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800318 audio_rtp_receiver_->SetMediaChannel(voice_media_channel_);
Steve Antond3679212018-01-17 17:41:02 -0800319 audio_rtp_receiver_->SetupMediaChannel(kAudioSsrc);
perkjd61bf802016-03-24 03:16:19 -0700320 audio_track_ = audio_rtp_receiver_->audio_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700321 VerifyVoiceChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700322 }
323
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100324 void CreateVideoRtpReceiver(
325 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
Tommi4ccdf932021-05-17 14:50:10 +0200326 video_rtp_receiver_ = rtc::make_ref_counted<VideoRtpReceiver>(
327 rtc::Thread::Current(), kVideoTrackId, streams);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800328 video_rtp_receiver_->SetMediaChannel(video_media_channel_);
Steve Antond3679212018-01-17 17:41:02 -0800329 video_rtp_receiver_->SetupMediaChannel(kVideoSsrc);
perkjf0dcfe22016-03-10 18:32:00 +0100330 video_track_ = video_rtp_receiver_->video_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700331 VerifyVideoChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700332 }
333
Florent Castelli38332cd2018-11-20 14:08:06 +0100334 void CreateVideoRtpReceiverWithSimulcast(
335 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {},
336 int num_layers = kVideoSimulcastLayerCount) {
337 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +0100338 ssrcs.reserve(num_layers);
Florent Castelli38332cd2018-11-20 14:08:06 +0100339 for (int i = 0; i < num_layers; ++i)
340 ssrcs.push_back(kVideoSsrcSimulcast + i);
341 cricket::StreamParams stream_params =
342 cricket::CreateSimStreamParams("cname", ssrcs);
343 video_media_channel_->AddRecvStream(stream_params);
344 uint32_t primary_ssrc = stream_params.first_ssrc();
345
Tommi4ccdf932021-05-17 14:50:10 +0200346 video_rtp_receiver_ = rtc::make_ref_counted<VideoRtpReceiver>(
347 rtc::Thread::Current(), kVideoTrackId, streams);
Florent Castelli38332cd2018-11-20 14:08:06 +0100348 video_rtp_receiver_->SetMediaChannel(video_media_channel_);
349 video_rtp_receiver_->SetupMediaChannel(primary_ssrc);
350 video_track_ = video_rtp_receiver_->video_track();
351 }
352
deadbeef70ab1a12015-09-28 16:53:55 -0700353 void DestroyAudioRtpReceiver() {
Tommi4ccdf932021-05-17 14:50:10 +0200354 if (!audio_rtp_receiver_)
355 return;
Tommi6589def2022-02-17 23:36:47 +0100356 audio_rtp_receiver_->SetMediaChannel(nullptr);
deadbeef70ab1a12015-09-28 16:53:55 -0700357 audio_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700358 VerifyVoiceChannelNoOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700359 }
360
361 void DestroyVideoRtpReceiver() {
Tommi4ccdf932021-05-17 14:50:10 +0200362 if (!video_rtp_receiver_)
363 return;
364 video_rtp_receiver_->Stop();
Tommi6589def2022-02-17 23:36:47 +0100365 video_rtp_receiver_->SetMediaChannel(nullptr);
deadbeef70ab1a12015-09-28 16:53:55 -0700366 video_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700367 VerifyVideoChannelNoOutput();
368 }
369
370 void VerifyVoiceChannelInput() { VerifyVoiceChannelInput(kAudioSsrc); }
371
372 void VerifyVoiceChannelInput(uint32_t ssrc) {
373 // Verify that the media channel has an audio source, and the stream isn't
374 // muted.
375 EXPECT_TRUE(voice_media_channel_->HasSource(ssrc));
376 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(ssrc));
377 }
378
379 void VerifyVideoChannelInput() { VerifyVideoChannelInput(kVideoSsrc); }
380
381 void VerifyVideoChannelInput(uint32_t ssrc) {
382 // Verify that the media channel has a video source,
383 EXPECT_TRUE(video_media_channel_->HasSource(ssrc));
384 }
385
386 void VerifyVoiceChannelNoInput() { VerifyVoiceChannelNoInput(kAudioSsrc); }
387
388 void VerifyVoiceChannelNoInput(uint32_t ssrc) {
389 // Verify that the media channel's source is reset.
390 EXPECT_FALSE(voice_media_channel_->HasSource(ssrc));
391 }
392
393 void VerifyVideoChannelNoInput() { VerifyVideoChannelNoInput(kVideoSsrc); }
394
395 void VerifyVideoChannelNoInput(uint32_t ssrc) {
396 // Verify that the media channel's source is reset.
397 EXPECT_FALSE(video_media_channel_->HasSource(ssrc));
398 }
399
400 void VerifyVoiceChannelOutput() {
401 // Verify that the volume is initialized to 1.
402 double volume;
403 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
404 EXPECT_EQ(1, volume);
405 }
406
407 void VerifyVideoChannelOutput() {
408 // Verify that the media channel has a sink.
409 EXPECT_TRUE(video_media_channel_->HasSink(kVideoSsrc));
410 }
411
412 void VerifyVoiceChannelNoOutput() {
413 // Verify that the volume is reset to 0.
414 double volume;
415 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
416 EXPECT_EQ(0, volume);
417 }
418
419 void VerifyVideoChannelNoOutput() {
420 // Verify that the media channel's sink is reset.
421 EXPECT_FALSE(video_media_channel_->HasSink(kVideoSsrc));
deadbeef70ab1a12015-09-28 16:53:55 -0700422 }
423
Amit Hilbuch2297d332019-02-19 12:49:22 -0800424 // Verifies that the encoding layers contain the specified RIDs.
425 bool VerifyEncodingLayers(const VideoRtpSender& sender,
426 const std::vector<std::string>& rids) {
427 bool has_failure = HasFailure();
428 RtpParameters parameters = sender.GetParameters();
429 std::vector<std::string> encoding_rids;
430 absl::c_transform(
431 parameters.encodings, std::back_inserter(encoding_rids),
432 [](const RtpEncodingParameters& encoding) { return encoding.rid; });
433 EXPECT_THAT(rids, ContainerEq(encoding_rids));
434 return has_failure || !HasFailure();
435 }
436
437 // Runs a test for disabling the encoding layers on the specified sender.
438 void RunDisableEncodingLayersTest(
439 const std::vector<std::string>& all_layers,
440 const std::vector<std::string>& disabled_layers,
441 VideoRtpSender* sender) {
442 std::vector<std::string> expected;
443 absl::c_copy_if(all_layers, std::back_inserter(expected),
444 [&disabled_layers](const std::string& rid) {
445 return !absl::c_linear_search(disabled_layers, rid);
446 });
447
448 EXPECT_TRUE(VerifyEncodingLayers(*sender, all_layers));
449 sender->DisableEncodingLayers(disabled_layers);
450 EXPECT_TRUE(VerifyEncodingLayers(*sender, expected));
451 }
452
453 // Runs a test for setting an encoding layer as inactive.
454 // This test assumes that some layers have already been disabled.
455 void RunSetLastLayerAsInactiveTest(VideoRtpSender* sender) {
456 auto parameters = sender->GetParameters();
457 if (parameters.encodings.size() == 0) {
458 return;
459 }
460
461 RtpEncodingParameters& encoding = parameters.encodings.back();
462 auto rid = encoding.rid;
463 EXPECT_TRUE(encoding.active);
464 encoding.active = false;
465 auto error = sender->SetParameters(parameters);
466 ASSERT_TRUE(error.ok());
467 parameters = sender->GetParameters();
468 RtpEncodingParameters& result_encoding = parameters.encodings.back();
469 EXPECT_EQ(rid, result_encoding.rid);
470 EXPECT_FALSE(result_encoding.active);
471 }
472
473 // Runs a test for disabling the encoding layers on a sender without a media
474 // channel.
475 void RunDisableSimulcastLayersWithoutMediaEngineTest(
476 const std::vector<std::string>& all_layers,
477 const std::vector<std::string>& disabled_layers) {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200478 auto sender = VideoRtpSender::Create(rtc::Thread::Current(), "1", nullptr);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800479 RtpParameters parameters;
480 parameters.encodings.resize(all_layers.size());
481 for (size_t i = 0; i < all_layers.size(); ++i) {
482 parameters.encodings[i].rid = all_layers[i];
483 }
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800484 sender->set_init_send_encodings(parameters.encodings);
485 RunDisableEncodingLayersTest(all_layers, disabled_layers, sender.get());
486 RunSetLastLayerAsInactiveTest(sender.get());
Amit Hilbuch2297d332019-02-19 12:49:22 -0800487 }
488
489 // Runs a test for disabling the encoding layers on a sender with a media
490 // channel.
491 void RunDisableSimulcastLayersWithMediaEngineTest(
492 const std::vector<std::string>& all_layers,
493 const std::vector<std::string>& disabled_layers) {
494 uint32_t ssrc = CreateVideoRtpSenderWithSimulcast(all_layers);
495 RunDisableEncodingLayersTest(all_layers, disabled_layers,
496 video_rtp_sender_.get());
497
498 auto channel_parameters = video_media_channel_->GetRtpSendParameters(ssrc);
499 ASSERT_EQ(channel_parameters.encodings.size(), all_layers.size());
500 for (size_t i = 0; i < all_layers.size(); ++i) {
501 EXPECT_EQ(all_layers[i], channel_parameters.encodings[i].rid);
502 bool is_active = !absl::c_linear_search(disabled_layers, all_layers[i]);
503 EXPECT_EQ(is_active, channel_parameters.encodings[i].active);
504 }
505
506 RunSetLastLayerAsInactiveTest(video_rtp_sender_.get());
507 }
508
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200509 // Check that minimum Jitter Buffer delay is propagated to the underlying
Artem Titov880fa812021-07-30 22:30:23 +0200510 // `media_channel`.
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200511 void VerifyRtpReceiverDelayBehaviour(cricket::Delayable* media_channel,
512 RtpReceiverInterface* receiver,
513 uint32_t ssrc) {
514 receiver->SetJitterBufferMinimumDelay(/*delay_seconds=*/0.5);
515 absl::optional<int> delay_ms =
516 media_channel->GetBaseMinimumPlayoutDelayMs(ssrc); // In milliseconds.
517 EXPECT_DOUBLE_EQ(0.5, delay_ms.value_or(0) / 1000.0);
518 }
519
deadbeef70ab1a12015-09-28 16:53:55 -0700520 protected:
Tommi4ccdf932021-05-17 14:50:10 +0200521 test::RunLoop run_loop_;
Steve Anton47136dd2018-01-12 10:49:35 -0800522 rtc::Thread* const network_thread_;
523 rtc::Thread* const worker_thread_;
Danil Chapovalov83bbe912019-08-07 12:24:53 +0200524 webrtc::RtcEventLogNull event_log_;
Artem Titov880fa812021-07-30 22:30:23 +0200525 // The `rtp_dtls_transport_` and `rtp_transport_` should be destroyed after
526 // the `channel_manager`.
Zhi Huange830e682018-03-30 10:48:35 -0700527 std::unique_ptr<cricket::DtlsTransportInternal> rtp_dtls_transport_;
528 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport_;
Jonas Orelanda3aa9bd2019-04-17 07:38:40 +0200529 std::unique_ptr<webrtc::VideoBitrateAllocatorFactory>
530 video_bitrate_allocator_factory_;
Artem Titov880fa812021-07-30 22:30:23 +0200531 // `media_engine_` is actually owned by `channel_manager_`.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700532 cricket::FakeMediaEngine* media_engine_;
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200533 std::unique_ptr<cricket::ChannelManager> channel_manager_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700534 cricket::FakeCall fake_call_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700535 cricket::VoiceChannel* voice_channel_;
536 cricket::VideoChannel* video_channel_;
537 cricket::FakeVoiceMediaChannel* voice_media_channel_;
538 cricket::FakeVideoMediaChannel* video_media_channel_;
deadbeef70ab1a12015-09-28 16:53:55 -0700539 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
540 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
541 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
542 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
deadbeefe814a0d2017-02-25 18:15:09 -0800543 rtc::scoped_refptr<MediaStreamInterface> local_stream_;
deadbeef70ab1a12015-09-28 16:53:55 -0700544 rtc::scoped_refptr<VideoTrackInterface> video_track_;
545 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
deadbeef20cb0c12017-02-01 20:27:00 -0800546 bool audio_sender_destroyed_signal_fired_ = false;
deadbeef70ab1a12015-09-28 16:53:55 -0700547};
548
Artem Titov880fa812021-07-30 22:30:23 +0200549// Test that `voice_channel_` is updated when an audio track is associated
deadbeef70ab1a12015-09-28 16:53:55 -0700550// and disassociated with an AudioRtpSender.
551TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
552 CreateAudioRtpSender();
553 DestroyAudioRtpSender();
554}
555
Artem Titov880fa812021-07-30 22:30:23 +0200556// Test that `video_channel_` is updated when a video track is associated and
deadbeef70ab1a12015-09-28 16:53:55 -0700557// disassociated with a VideoRtpSender.
558TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
559 CreateVideoRtpSender();
560 DestroyVideoRtpSender();
561}
562
Artem Titov880fa812021-07-30 22:30:23 +0200563// Test that `voice_channel_` is updated when a remote audio track is
deadbeef70ab1a12015-09-28 16:53:55 -0700564// associated and disassociated with an AudioRtpReceiver.
565TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
566 CreateAudioRtpReceiver();
567 DestroyAudioRtpReceiver();
568}
569
Artem Titov880fa812021-07-30 22:30:23 +0200570// Test that `video_channel_` is updated when a remote video track is
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700571// associated and disassociated with a VideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700572TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
573 CreateVideoRtpReceiver();
574 DestroyVideoRtpReceiver();
575}
576
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100577TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiverWithStreams) {
578 CreateAudioRtpReceiver({local_stream_});
579 DestroyAudioRtpReceiver();
580}
581
582TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiverWithStreams) {
583 CreateVideoRtpReceiver({local_stream_});
584 DestroyVideoRtpReceiver();
585}
586
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700587// Test that the AudioRtpSender applies options from the local audio source.
588TEST_F(RtpSenderReceiverTest, LocalAudioSourceOptionsApplied) {
589 cricket::AudioOptions options;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100590 options.echo_cancellation = true;
deadbeef757146b2017-02-10 21:26:48 -0800591 auto source = LocalAudioSource::Create(&options);
Niels Möllere7cc8832022-01-04 15:20:03 +0100592 CreateAudioRtpSender(source);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700593
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100594 EXPECT_EQ(true, voice_media_channel_->options().echo_cancellation);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700595
596 DestroyAudioRtpSender();
597}
598
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700599// Test that the stream is muted when the track is disabled, and unmuted when
600// the track is enabled.
601TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) {
602 CreateAudioRtpSender();
603
604 audio_track_->set_enabled(false);
605 EXPECT_TRUE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
606
607 audio_track_->set_enabled(true);
608 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
609
610 DestroyAudioRtpSender();
611}
612
613// Test that the volume is set to 0 when the track is disabled, and back to
614// 1 when the track is enabled.
deadbeef70ab1a12015-09-28 16:53:55 -0700615TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
616 CreateAudioRtpReceiver();
617
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700618 double volume;
619 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
620 EXPECT_EQ(1, volume);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700621
Tommi4ccdf932021-05-17 14:50:10 +0200622 // Handling of enable/disable is applied asynchronously.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700623 audio_track_->set_enabled(false);
Tommi4ccdf932021-05-17 14:50:10 +0200624 run_loop_.Flush();
625
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700626 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
627 EXPECT_EQ(0, volume);
628
deadbeef70ab1a12015-09-28 16:53:55 -0700629 audio_track_->set_enabled(true);
Tommi4ccdf932021-05-17 14:50:10 +0200630 run_loop_.Flush();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700631 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
632 EXPECT_EQ(1, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700633
634 DestroyAudioRtpReceiver();
635}
636
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700637// Currently no action is taken when a remote video track is disabled or
638// enabled, so there's nothing to test here, other than what is normally
639// verified in DestroyVideoRtpSender.
deadbeef70ab1a12015-09-28 16:53:55 -0700640TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
641 CreateVideoRtpSender();
642
deadbeef70ab1a12015-09-28 16:53:55 -0700643 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700644 video_track_->set_enabled(true);
645
646 DestroyVideoRtpSender();
647}
648
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700649// Test that the state of the video track created by the VideoRtpReceiver is
650// updated when the receiver is destroyed.
perkjf0dcfe22016-03-10 18:32:00 +0100651TEST_F(RtpSenderReceiverTest, RemoteVideoTrackState) {
652 CreateVideoRtpReceiver();
653
654 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track_->state());
655 EXPECT_EQ(webrtc::MediaSourceInterface::kLive,
656 video_track_->GetSource()->state());
657
658 DestroyVideoRtpReceiver();
659
660 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track_->state());
661 EXPECT_EQ(webrtc::MediaSourceInterface::kEnded,
662 video_track_->GetSource()->state());
Tommi4ccdf932021-05-17 14:50:10 +0200663 DestroyVideoRtpReceiver();
perkjf0dcfe22016-03-10 18:32:00 +0100664}
665
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700666// Currently no action is taken when a remote video track is disabled or
667// enabled, so there's nothing to test here, other than what is normally
668// verified in DestroyVideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700669TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
670 CreateVideoRtpReceiver();
671
672 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700673 video_track_->set_enabled(true);
674
675 DestroyVideoRtpReceiver();
676}
677
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700678// Test that the AudioRtpReceiver applies volume changes from the track source
679// to the media channel.
deadbeef70ab1a12015-09-28 16:53:55 -0700680TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
681 CreateAudioRtpReceiver();
682
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700683 double volume;
684 audio_track_->GetSource()->SetVolume(0.5);
Tommi4ccdf932021-05-17 14:50:10 +0200685 run_loop_.Flush();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700686 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
687 EXPECT_EQ(0.5, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700688
689 // Disable the audio track, this should prevent setting the volume.
deadbeef70ab1a12015-09-28 16:53:55 -0700690 audio_track_->set_enabled(false);
Tommi4ccdf932021-05-17 14:50:10 +0200691 RTC_DCHECK_EQ(worker_thread_, run_loop_.task_queue());
692 run_loop_.Flush();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700693 audio_track_->GetSource()->SetVolume(0.8);
694 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
695 EXPECT_EQ(0, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700696
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700697 // When the track is enabled, the previously set volume should take effect.
deadbeef70ab1a12015-09-28 16:53:55 -0700698 audio_track_->set_enabled(true);
Tommi4ccdf932021-05-17 14:50:10 +0200699 run_loop_.Flush();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700700 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
701 EXPECT_EQ(0.8, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700702
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700703 // Try changing volume one more time.
704 audio_track_->GetSource()->SetVolume(0.9);
Tommi4ccdf932021-05-17 14:50:10 +0200705 run_loop_.Flush();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700706 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
707 EXPECT_EQ(0.9, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700708
709 DestroyAudioRtpReceiver();
710}
711
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200712TEST_F(RtpSenderReceiverTest, AudioRtpReceiverDelay) {
713 CreateAudioRtpReceiver();
714 VerifyRtpReceiverDelayBehaviour(voice_media_channel_,
715 audio_rtp_receiver_.get(), kAudioSsrc);
Tommi4ccdf932021-05-17 14:50:10 +0200716 DestroyAudioRtpReceiver();
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200717}
718
719TEST_F(RtpSenderReceiverTest, VideoRtpReceiverDelay) {
720 CreateVideoRtpReceiver();
721 VerifyRtpReceiverDelayBehaviour(video_media_channel_,
722 video_rtp_receiver_.get(), kVideoSsrc);
Tommi4ccdf932021-05-17 14:50:10 +0200723 DestroyVideoRtpReceiver();
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200724}
725
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700726// Test that the media channel isn't enabled for sending if the audio sender
727// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800728TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800729 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800730 rtc::scoped_refptr<AudioTrackInterface> track =
731 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700732
733 // Track but no SSRC.
734 EXPECT_TRUE(audio_rtp_sender_->SetTrack(track));
735 VerifyVoiceChannelNoInput();
736
737 // SSRC but no track.
738 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
739 audio_rtp_sender_->SetSsrc(kAudioSsrc);
740 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800741}
742
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700743// Test that the media channel isn't enabled for sending if the video sender
744// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800745TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800746 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700747
748 // Track but no SSRC.
749 EXPECT_TRUE(video_rtp_sender_->SetTrack(video_track_));
750 VerifyVideoChannelNoInput();
751
752 // SSRC but no track.
753 EXPECT_TRUE(video_rtp_sender_->SetTrack(nullptr));
754 video_rtp_sender_->SetSsrc(kVideoSsrc);
755 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800756}
757
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700758// Test that the media channel is enabled for sending when the audio sender
759// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800760TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800761 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800762 rtc::scoped_refptr<AudioTrackInterface> track =
763 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700764 audio_rtp_sender_->SetSsrc(kAudioSsrc);
765 audio_rtp_sender_->SetTrack(track);
766 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800767
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700768 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800769}
770
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700771// Test that the media channel is enabled for sending when the audio sender
772// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800773TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800774 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800775 rtc::scoped_refptr<AudioTrackInterface> track =
776 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700777 audio_rtp_sender_->SetTrack(track);
778 audio_rtp_sender_->SetSsrc(kAudioSsrc);
779 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800780
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700781 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800782}
783
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700784// Test that the media channel is enabled for sending when the video sender
785// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800786TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
nisseaf510af2016-03-21 08:20:42 -0700787 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800788 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700789 video_rtp_sender_->SetSsrc(kVideoSsrc);
790 video_rtp_sender_->SetTrack(video_track_);
791 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800792
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700793 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800794}
795
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700796// Test that the media channel is enabled for sending when the video sender
797// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800798TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
nisseaf510af2016-03-21 08:20:42 -0700799 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800800 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700801 video_rtp_sender_->SetTrack(video_track_);
802 video_rtp_sender_->SetSsrc(kVideoSsrc);
803 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800804
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700805 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800806}
807
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700808// Test that the media channel stops sending when the audio sender's SSRC is set
809// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800810TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700811 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800812
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700813 audio_rtp_sender_->SetSsrc(0);
814 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800815}
816
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700817// Test that the media channel stops sending when the video sender's SSRC is set
818// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800819TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700820 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800821
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700822 audio_rtp_sender_->SetSsrc(0);
823 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800824}
825
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700826// Test that the media channel stops sending when the audio sender's track is
827// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800828TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700829 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800830
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700831 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
832 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800833}
834
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700835// Test that the media channel stops sending when the video sender's track is
836// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800837TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700838 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800839
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700840 video_rtp_sender_->SetSsrc(0);
841 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800842}
843
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700844// Test that when the audio sender's SSRC is changed, the media channel stops
845// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800846TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700847 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800848
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700849 audio_rtp_sender_->SetSsrc(kAudioSsrc2);
850 VerifyVoiceChannelNoInput(kAudioSsrc);
851 VerifyVoiceChannelInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800852
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700853 audio_rtp_sender_ = nullptr;
854 VerifyVoiceChannelNoInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800855}
856
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700857// Test that when the audio sender's SSRC is changed, the media channel stops
858// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800859TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700860 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800861
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700862 video_rtp_sender_->SetSsrc(kVideoSsrc2);
863 VerifyVideoChannelNoInput(kVideoSsrc);
864 VerifyVideoChannelInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800865
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700866 video_rtp_sender_ = nullptr;
867 VerifyVideoChannelNoInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800868}
869
skvladdc1c62c2016-03-16 19:07:43 -0700870TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) {
871 CreateAudioRtpSender();
872
skvladdc1c62c2016-03-16 19:07:43 -0700873 RtpParameters params = audio_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700874 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -0800875 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -0700876
877 DestroyAudioRtpSender();
878}
879
Florent Castelli892acf02018-10-01 22:47:20 +0200880TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParametersBeforeNegotiation) {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800881 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200882 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +0200883
884 RtpParameters params = audio_rtp_sender_->GetParameters();
885 ASSERT_EQ(1u, params.encodings.size());
886 params.encodings[0].max_bitrate_bps = 90000;
887 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
888
889 params = audio_rtp_sender_->GetParameters();
890 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
891 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
892
893 DestroyAudioRtpSender();
894}
895
896TEST_F(RtpSenderReceiverTest, AudioSenderInitParametersMovedAfterNegotiation) {
897 audio_track_ = AudioTrack::Create(kAudioTrackId, nullptr);
898 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
899
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200900 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200901 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200902 audio_rtp_sender_ = AudioRtpSender::Create(
903 worker_thread_, audio_track_->id(), nullptr, set_streams_observer.get());
Florent Castelli892acf02018-10-01 22:47:20 +0200904 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200905 EXPECT_CALL(*set_streams_observer, OnSetStreams());
906 audio_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli892acf02018-10-01 22:47:20 +0200907
908 std::vector<RtpEncodingParameters> init_encodings(1);
909 init_encodings[0].max_bitrate_bps = 60000;
910 audio_rtp_sender_->set_init_send_encodings(init_encodings);
911
912 RtpParameters params = audio_rtp_sender_->GetParameters();
913 ASSERT_EQ(1u, params.encodings.size());
914 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
915
916 // Simulate the setLocalDescription call
917 std::vector<uint32_t> ssrcs(1, 1);
918 cricket::StreamParams stream_params =
919 cricket::CreateSimStreamParams("cname", ssrcs);
920 voice_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800921 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +0200922 audio_rtp_sender_->SetSsrc(1);
923
924 params = audio_rtp_sender_->GetParameters();
925 ASSERT_EQ(1u, params.encodings.size());
926 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
927
928 DestroyAudioRtpSender();
929}
930
931TEST_F(RtpSenderReceiverTest,
932 AudioSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800933 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200934 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +0200935
936 RtpParameters params;
937 RTCError result = audio_rtp_sender_->SetParameters(params);
938 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
939 DestroyAudioRtpSender();
940}
941
Florent Castellicebf50f2018-05-03 15:31:53 +0200942TEST_F(RtpSenderReceiverTest,
943 AudioSenderMustCallGetParametersBeforeSetParameters) {
944 CreateAudioRtpSender();
945
946 RtpParameters params;
947 RTCError result = audio_rtp_sender_->SetParameters(params);
948 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
949
950 DestroyAudioRtpSender();
951}
952
953TEST_F(RtpSenderReceiverTest,
954 AudioSenderSetParametersInvalidatesTransactionId) {
955 CreateAudioRtpSender();
956
957 RtpParameters params = audio_rtp_sender_->GetParameters();
958 EXPECT_EQ(1u, params.encodings.size());
959 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
960 RTCError result = audio_rtp_sender_->SetParameters(params);
961 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
962
963 DestroyAudioRtpSender();
964}
965
966TEST_F(RtpSenderReceiverTest, AudioSenderDetectTransactionIdModification) {
967 CreateAudioRtpSender();
968
969 RtpParameters params = audio_rtp_sender_->GetParameters();
970 params.transaction_id = "";
971 RTCError result = audio_rtp_sender_->SetParameters(params);
972 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
973
974 DestroyAudioRtpSender();
975}
976
977TEST_F(RtpSenderReceiverTest, AudioSenderCheckTransactionIdRefresh) {
978 CreateAudioRtpSender();
979
980 RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200981 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 15:31:53 +0200982 auto saved_transaction_id = params.transaction_id;
983 params = audio_rtp_sender_->GetParameters();
984 EXPECT_NE(saved_transaction_id, params.transaction_id);
985
986 DestroyAudioRtpSender();
987}
988
989TEST_F(RtpSenderReceiverTest, AudioSenderSetParametersOldValueFail) {
990 CreateAudioRtpSender();
991
992 RtpParameters params = audio_rtp_sender_->GetParameters();
993 RtpParameters second_params = audio_rtp_sender_->GetParameters();
994
995 RTCError result = audio_rtp_sender_->SetParameters(params);
996 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
Seth Hampson2d2c8882018-05-16 16:02:32 -0700997 DestroyAudioRtpSender();
998}
999
1000TEST_F(RtpSenderReceiverTest, AudioSenderCantSetUnimplementedRtpParameters) {
1001 CreateAudioRtpSender();
1002 RtpParameters params = audio_rtp_sender_->GetParameters();
1003 EXPECT_EQ(1u, params.encodings.size());
1004
Florent Castelli87b3c512018-07-18 16:00:28 +02001005 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 16:02:32 -07001006 params.mid = "dummy_mid";
1007 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1008 audio_rtp_sender_->SetParameters(params).type());
1009 params = audio_rtp_sender_->GetParameters();
1010
Seth Hampson2d2c8882018-05-16 16:02:32 -07001011 DestroyAudioRtpSender();
1012}
1013
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001014TEST_F(RtpSenderReceiverTest, SetAudioMaxSendBitrate) {
1015 CreateAudioRtpSender();
1016
1017 EXPECT_EQ(-1, voice_media_channel_->max_bps());
1018 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001019 EXPECT_EQ(1U, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -08001020 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001021 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -08001022 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001023
1024 // Read back the parameters and verify they have been changed.
1025 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001026 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001027 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001028
1029 // Verify that the audio channel received the new parameters.
1030 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001031 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001032 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001033
1034 // Verify that the global bitrate limit has not been changed.
1035 EXPECT_EQ(-1, voice_media_channel_->max_bps());
1036
1037 DestroyAudioRtpSender();
1038}
1039
Seth Hampson24722b32017-12-22 09:36:42 -08001040TEST_F(RtpSenderReceiverTest, SetAudioBitratePriority) {
1041 CreateAudioRtpSender();
1042
1043 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001044 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001045 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1046 params.encodings[0].bitrate_priority);
1047 double new_bitrate_priority = 2.0;
1048 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -08001049 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -08001050
1051 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001052 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001053 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1054
1055 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001056 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001057 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1058
1059 DestroyAudioRtpSender();
1060}
1061
skvladdc1c62c2016-03-16 19:07:43 -07001062TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) {
1063 CreateVideoRtpSender();
1064
skvladdc1c62c2016-03-16 19:07:43 -07001065 RtpParameters params = video_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001066 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -08001067 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -07001068
1069 DestroyVideoRtpSender();
1070}
1071
Florent Castelli892acf02018-10-01 22:47:20 +02001072TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParametersBeforeNegotiation) {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001073 video_rtp_sender_ =
1074 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +02001075
1076 RtpParameters params = video_rtp_sender_->GetParameters();
1077 ASSERT_EQ(1u, params.encodings.size());
1078 params.encodings[0].max_bitrate_bps = 90000;
1079 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1080
1081 params = video_rtp_sender_->GetParameters();
1082 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1083 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
1084
1085 DestroyVideoRtpSender();
1086}
1087
1088TEST_F(RtpSenderReceiverTest, VideoSenderInitParametersMovedAfterNegotiation) {
1089 AddVideoTrack(false);
1090
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001091 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001092 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001093 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1094 set_streams_observer.get());
Florent Castelli892acf02018-10-01 22:47:20 +02001095 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001096 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1097 video_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli892acf02018-10-01 22:47:20 +02001098
1099 std::vector<RtpEncodingParameters> init_encodings(2);
1100 init_encodings[0].max_bitrate_bps = 60000;
1101 init_encodings[1].max_bitrate_bps = 900000;
1102 video_rtp_sender_->set_init_send_encodings(init_encodings);
1103
1104 RtpParameters params = video_rtp_sender_->GetParameters();
1105 ASSERT_EQ(2u, params.encodings.size());
1106 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1107 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
1108
1109 // Simulate the setLocalDescription call
1110 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +01001111 ssrcs.reserve(2);
Florent Castelli892acf02018-10-01 22:47:20 +02001112 for (int i = 0; i < 2; ++i)
1113 ssrcs.push_back(kVideoSsrcSimulcast + i);
1114 cricket::StreamParams stream_params =
1115 cricket::CreateSimStreamParams("cname", ssrcs);
1116 video_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -08001117 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +02001118 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
1119
1120 params = video_rtp_sender_->GetParameters();
1121 ASSERT_EQ(2u, params.encodings.size());
1122 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1123 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
1124
1125 DestroyVideoRtpSender();
1126}
1127
1128TEST_F(RtpSenderReceiverTest,
1129 VideoSenderInitParametersMovedAfterManualSimulcastAndNegotiation) {
1130 AddVideoTrack(false);
1131
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001132 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001133 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001134 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1135 set_streams_observer.get());
Florent Castelli892acf02018-10-01 22:47:20 +02001136 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001137 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1138 video_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli892acf02018-10-01 22:47:20 +02001139
1140 std::vector<RtpEncodingParameters> init_encodings(1);
1141 init_encodings[0].max_bitrate_bps = 60000;
1142 video_rtp_sender_->set_init_send_encodings(init_encodings);
1143
1144 RtpParameters params = video_rtp_sender_->GetParameters();
1145 ASSERT_EQ(1u, params.encodings.size());
1146 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1147
1148 // Simulate the setLocalDescription call as if the user used SDP munging
1149 // to enable simulcast
1150 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +01001151 ssrcs.reserve(2);
Florent Castelli892acf02018-10-01 22:47:20 +02001152 for (int i = 0; i < 2; ++i)
1153 ssrcs.push_back(kVideoSsrcSimulcast + i);
1154 cricket::StreamParams stream_params =
1155 cricket::CreateSimStreamParams("cname", ssrcs);
1156 video_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -08001157 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +02001158 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
1159
1160 params = video_rtp_sender_->GetParameters();
1161 ASSERT_EQ(2u, params.encodings.size());
1162 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1163
1164 DestroyVideoRtpSender();
1165}
1166
1167TEST_F(RtpSenderReceiverTest,
1168 VideoSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001169 video_rtp_sender_ =
1170 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +02001171
1172 RtpParameters params;
1173 RTCError result = video_rtp_sender_->SetParameters(params);
1174 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1175 DestroyVideoRtpSender();
1176}
1177
Florent Castellicebf50f2018-05-03 15:31:53 +02001178TEST_F(RtpSenderReceiverTest,
1179 VideoSenderMustCallGetParametersBeforeSetParameters) {
1180 CreateVideoRtpSender();
1181
1182 RtpParameters params;
1183 RTCError result = video_rtp_sender_->SetParameters(params);
1184 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1185
1186 DestroyVideoRtpSender();
1187}
1188
1189TEST_F(RtpSenderReceiverTest,
1190 VideoSenderSetParametersInvalidatesTransactionId) {
1191 CreateVideoRtpSender();
1192
1193 RtpParameters params = video_rtp_sender_->GetParameters();
1194 EXPECT_EQ(1u, params.encodings.size());
1195 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1196 RTCError result = video_rtp_sender_->SetParameters(params);
1197 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1198
1199 DestroyVideoRtpSender();
1200}
1201
1202TEST_F(RtpSenderReceiverTest, VideoSenderDetectTransactionIdModification) {
1203 CreateVideoRtpSender();
1204
1205 RtpParameters params = video_rtp_sender_->GetParameters();
1206 params.transaction_id = "";
1207 RTCError result = video_rtp_sender_->SetParameters(params);
1208 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1209
1210 DestroyVideoRtpSender();
1211}
1212
1213TEST_F(RtpSenderReceiverTest, VideoSenderCheckTransactionIdRefresh) {
1214 CreateVideoRtpSender();
1215
1216 RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001217 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 15:31:53 +02001218 auto saved_transaction_id = params.transaction_id;
1219 params = video_rtp_sender_->GetParameters();
1220 EXPECT_NE(saved_transaction_id, params.transaction_id);
1221
1222 DestroyVideoRtpSender();
1223}
1224
1225TEST_F(RtpSenderReceiverTest, VideoSenderSetParametersOldValueFail) {
1226 CreateVideoRtpSender();
1227
1228 RtpParameters params = video_rtp_sender_->GetParameters();
1229 RtpParameters second_params = video_rtp_sender_->GetParameters();
1230
1231 RTCError result = video_rtp_sender_->SetParameters(params);
1232 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1233
1234 DestroyVideoRtpSender();
1235}
1236
Seth Hampson2d2c8882018-05-16 16:02:32 -07001237TEST_F(RtpSenderReceiverTest, VideoSenderCantSetUnimplementedRtpParameters) {
1238 CreateVideoRtpSender();
1239 RtpParameters params = video_rtp_sender_->GetParameters();
1240 EXPECT_EQ(1u, params.encodings.size());
1241
Florent Castelli87b3c512018-07-18 16:00:28 +02001242 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 16:02:32 -07001243 params.mid = "dummy_mid";
1244 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1245 video_rtp_sender_->SetParameters(params).type());
1246 params = video_rtp_sender_->GetParameters();
1247
Seth Hampson2d2c8882018-05-16 16:02:32 -07001248 DestroyVideoRtpSender();
1249}
1250
Florent Castellic1a0bcb2019-01-29 14:26:48 +01001251TEST_F(RtpSenderReceiverTest, VideoSenderCanSetScaleResolutionDownBy) {
1252 CreateVideoRtpSender();
1253
1254 RtpParameters params = video_rtp_sender_->GetParameters();
1255 params.encodings[0].scale_resolution_down_by = 2;
1256
1257 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1258 params = video_rtp_sender_->GetParameters();
1259 EXPECT_EQ(2, params.encodings[0].scale_resolution_down_by);
1260
1261 DestroyVideoRtpSender();
1262}
1263
1264TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidScaleResolutionDownBy) {
1265 CreateVideoRtpSender();
1266
1267 RtpParameters params = video_rtp_sender_->GetParameters();
1268 params.encodings[0].scale_resolution_down_by = 0.5;
1269 RTCError result = video_rtp_sender_->SetParameters(params);
1270 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1271
1272 DestroyVideoRtpSender();
1273}
1274
Ă…sa Perssonfb195962021-08-16 16:41:56 +02001275TEST_F(RtpSenderReceiverTest, VideoSenderCanSetNumTemporalLayers) {
1276 CreateVideoRtpSender();
1277
1278 RtpParameters params = video_rtp_sender_->GetParameters();
1279 params.encodings[0].num_temporal_layers = 2;
1280
1281 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1282 params = video_rtp_sender_->GetParameters();
1283 EXPECT_EQ(2, params.encodings[0].num_temporal_layers);
1284
1285 DestroyVideoRtpSender();
1286}
1287
1288TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidNumTemporalLayers) {
1289 CreateVideoRtpSender();
1290
1291 RtpParameters params = video_rtp_sender_->GetParameters();
1292 params.encodings[0].num_temporal_layers = webrtc::kMaxTemporalStreams + 1;
1293 RTCError result = video_rtp_sender_->SetParameters(params);
1294 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1295
1296 DestroyVideoRtpSender();
1297}
1298
Florent Castelli907dc802019-12-06 15:03:19 +01001299TEST_F(RtpSenderReceiverTest, VideoSenderCanSetMaxFramerate) {
1300 CreateVideoRtpSender();
1301
1302 RtpParameters params = video_rtp_sender_->GetParameters();
1303 params.encodings[0].max_framerate = 20;
1304
1305 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1306 params = video_rtp_sender_->GetParameters();
1307 EXPECT_EQ(20., params.encodings[0].max_framerate);
1308
1309 DestroyVideoRtpSender();
1310}
1311
1312TEST_F(RtpSenderReceiverTest, VideoSenderCanSetMaxFramerateZero) {
1313 CreateVideoRtpSender();
1314
1315 RtpParameters params = video_rtp_sender_->GetParameters();
1316 params.encodings[0].max_framerate = 0.;
1317
1318 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1319 params = video_rtp_sender_->GetParameters();
1320 EXPECT_EQ(0., params.encodings[0].max_framerate);
1321
1322 DestroyVideoRtpSender();
1323}
1324
1325TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidMaxFramerate) {
1326 CreateVideoRtpSender();
1327
1328 RtpParameters params = video_rtp_sender_->GetParameters();
1329 params.encodings[0].max_framerate = -5.;
1330 RTCError result = video_rtp_sender_->SetParameters(params);
1331 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1332
1333 DestroyVideoRtpSender();
1334}
1335
Seth Hampson2d2c8882018-05-16 16:02:32 -07001336// A video sender can have multiple simulcast layers, in which case it will
1337// contain multiple RtpEncodingParameters. This tests that if this is the case
1338// (simulcast), then we can't set the bitrate_priority, or max_bitrate_bps
1339// for any encodings besides at index 0, because these are both implemented
1340// "per-sender."
1341TEST_F(RtpSenderReceiverTest, VideoSenderCantSetPerSenderEncodingParameters) {
1342 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001343 CreateVideoRtpSenderWithSimulcast();
Seth Hampson2d2c8882018-05-16 16:02:32 -07001344 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001345 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Seth Hampson2d2c8882018-05-16 16:02:32 -07001346
1347 params.encodings[1].bitrate_priority = 2.0;
1348 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1349 video_rtp_sender_->SetParameters(params).type());
1350 params = video_rtp_sender_->GetParameters();
1351
Seth Hampson2d2c8882018-05-16 16:02:32 -07001352 DestroyVideoRtpSender();
1353}
1354
Florent Castelli892acf02018-10-01 22:47:20 +02001355TEST_F(RtpSenderReceiverTest, VideoSenderCantSetReadOnlyEncodingParameters) {
1356 // Add a simulcast specific send stream that contains 2 encoding parameters.
1357 CreateVideoRtpSenderWithSimulcast();
1358 RtpParameters params = video_rtp_sender_->GetParameters();
1359 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
1360
1361 for (size_t i = 0; i < params.encodings.size(); i++) {
1362 params.encodings[i].ssrc = 1337;
1363 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION,
1364 video_rtp_sender_->SetParameters(params).type());
1365 params = video_rtp_sender_->GetParameters();
1366 }
1367
1368 DestroyVideoRtpSender();
1369}
1370
Ă…sa Persson55659812018-06-18 17:51:32 +02001371TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrate) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001372 CreateVideoRtpSender();
1373
1374 EXPECT_EQ(-1, video_media_channel_->max_bps());
1375 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001376 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001377 EXPECT_FALSE(params.encodings[0].min_bitrate_bps);
deadbeefe702b302017-02-04 12:09:01 -08001378 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Ă…sa Persson55659812018-06-18 17:51:32 +02001379 params.encodings[0].min_bitrate_bps = 100;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001380 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -08001381 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001382
1383 // Read back the parameters and verify they have been changed.
1384 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001385 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001386 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001387 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001388
1389 // Verify that the video channel received the new parameters.
1390 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001391 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001392 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001393 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001394
1395 // Verify that the global bitrate limit has not been changed.
1396 EXPECT_EQ(-1, video_media_channel_->max_bps());
1397
1398 DestroyVideoRtpSender();
1399}
1400
Ă…sa Persson55659812018-06-18 17:51:32 +02001401TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrateSimulcast) {
1402 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001403 CreateVideoRtpSenderWithSimulcast();
Ă…sa Persson55659812018-06-18 17:51:32 +02001404
1405 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001406 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001407 params.encodings[0].min_bitrate_bps = 100;
1408 params.encodings[0].max_bitrate_bps = 1000;
1409 params.encodings[1].min_bitrate_bps = 200;
1410 params.encodings[1].max_bitrate_bps = 2000;
1411 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1412
1413 // Verify that the video channel received the new parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001414 params = video_media_channel_->GetRtpSendParameters(kVideoSsrcSimulcast);
1415 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001416 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
1417 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
1418 EXPECT_EQ(200, params.encodings[1].min_bitrate_bps);
1419 EXPECT_EQ(2000, params.encodings[1].max_bitrate_bps);
1420
1421 DestroyVideoRtpSender();
1422}
1423
Seth Hampson24722b32017-12-22 09:36:42 -08001424TEST_F(RtpSenderReceiverTest, SetVideoBitratePriority) {
1425 CreateVideoRtpSender();
1426
1427 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001428 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001429 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1430 params.encodings[0].bitrate_priority);
1431 double new_bitrate_priority = 2.0;
1432 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -08001433 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -08001434
1435 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001436 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001437 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1438
1439 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001440 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001441 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1442
1443 DestroyVideoRtpSender();
1444}
1445
Florent Castelli38332cd2018-11-20 14:08:06 +01001446TEST_F(RtpSenderReceiverTest, VideoReceiverCanGetParametersWithSimulcast) {
1447 CreateVideoRtpReceiverWithSimulcast({}, 2);
1448
1449 RtpParameters params = video_rtp_receiver_->GetParameters();
1450 EXPECT_EQ(2u, params.encodings.size());
1451
1452 DestroyVideoRtpReceiver();
1453}
1454
pbos5214a0a2016-12-16 15:39:11 -08001455// Test that makes sure that a video track content hint translates to the proper
1456// value for sources that are not screencast.
1457TEST_F(RtpSenderReceiverTest, PropagatesVideoTrackContentHint) {
1458 CreateVideoRtpSender();
1459
1460 video_track_->set_enabled(true);
1461
Artem Titov880fa812021-07-30 22:30:23 +02001462 // `video_track_` is not screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001463 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001464 // No content hint should be set by default.
1465 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1466 video_track_->content_hint());
1467 // Setting detailed should turn a non-screencast source into screencast mode.
1468 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001469 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001470 // Removing the content hint should turn the track back into non-screencast
1471 // mode.
1472 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001473 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001474 // Setting fluid should remain in non-screencast mode (its default).
1475 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001476 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 08:53:10 +02001477 // Setting text should have the same effect as Detailed
1478 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
1479 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001480
1481 DestroyVideoRtpSender();
1482}
1483
1484// Test that makes sure that a video track content hint translates to the proper
1485// value for screencast sources.
1486TEST_F(RtpSenderReceiverTest,
1487 PropagatesVideoTrackContentHintForScreencastSource) {
1488 CreateVideoRtpSender(true);
1489
1490 video_track_->set_enabled(true);
1491
Artem Titov880fa812021-07-30 22:30:23 +02001492 // `video_track_` with a screencast source should be screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001493 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001494 // No content hint should be set by default.
1495 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1496 video_track_->content_hint());
1497 // Setting fluid should turn a screencast source into non-screencast mode.
1498 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001499 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001500 // Removing the content hint should turn the track back into screencast mode.
1501 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001502 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001503 // Setting detailed should still remain in screencast mode (its default).
1504 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001505 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 08:53:10 +02001506 // Setting text should have the same effect as Detailed
1507 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
1508 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001509
1510 DestroyVideoRtpSender();
1511}
1512
1513// Test that makes sure any content hints that are set on a track before
1514// VideoRtpSender is ready to send are still applied when it gets ready to send.
1515TEST_F(RtpSenderReceiverTest,
1516 PropagatesVideoTrackContentHintSetBeforeEnabling) {
1517 AddVideoTrack();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001518 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001519 std::make_unique<MockSetStreamsObserver>();
pbos5214a0a2016-12-16 15:39:11 -08001520 // Setting detailed overrides the default non-screencast mode. This should be
1521 // applied even if the track is set on construction.
1522 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001523 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1524 set_streams_observer.get());
Steve Anton111fdfd2018-06-25 13:03:36 -07001525 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001526 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1527 video_rtp_sender_->SetStreams({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -08001528 video_rtp_sender_->SetMediaChannel(video_media_channel_);
pbos5214a0a2016-12-16 15:39:11 -08001529 video_track_->set_enabled(true);
1530
1531 // Sender is not ready to send (no SSRC) so no option should have been set.
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001532 EXPECT_EQ(absl::nullopt, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001533
1534 // Verify that the content hint is accounted for when video_rtp_sender_ does
1535 // get enabled.
1536 video_rtp_sender_->SetSsrc(kVideoSsrc);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001537 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001538
1539 // And removing the hint should go back to false (to verify that false was
1540 // default correctly).
1541 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001542 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001543
1544 DestroyVideoRtpSender();
1545}
1546
deadbeef20cb0c12017-02-01 20:27:00 -08001547TEST_F(RtpSenderReceiverTest, AudioSenderHasDtmfSender) {
1548 CreateAudioRtpSender();
1549 EXPECT_NE(nullptr, audio_rtp_sender_->GetDtmfSender());
1550}
1551
1552TEST_F(RtpSenderReceiverTest, VideoSenderDoesNotHaveDtmfSender) {
1553 CreateVideoRtpSender();
1554 EXPECT_EQ(nullptr, video_rtp_sender_->GetDtmfSender());
1555}
1556
Artem Titov880fa812021-07-30 22:30:23 +02001557// Test that the DTMF sender is really using `voice_channel_`, and thus returns
1558// true/false from CanSendDtmf based on what `voice_channel_` returns.
deadbeef20cb0c12017-02-01 20:27:00 -08001559TEST_F(RtpSenderReceiverTest, CanInsertDtmf) {
1560 AddDtmfCodec();
1561 CreateAudioRtpSender();
1562 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1563 ASSERT_NE(nullptr, dtmf_sender);
1564 EXPECT_TRUE(dtmf_sender->CanInsertDtmf());
1565}
1566
1567TEST_F(RtpSenderReceiverTest, CanNotInsertDtmf) {
1568 CreateAudioRtpSender();
1569 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1570 ASSERT_NE(nullptr, dtmf_sender);
1571 // DTMF codec has not been added, as it was in the above test.
1572 EXPECT_FALSE(dtmf_sender->CanInsertDtmf());
1573}
1574
1575TEST_F(RtpSenderReceiverTest, InsertDtmf) {
1576 AddDtmfCodec();
1577 CreateAudioRtpSender();
1578 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1579 ASSERT_NE(nullptr, dtmf_sender);
1580
1581 EXPECT_EQ(0U, voice_media_channel_->dtmf_info_queue().size());
1582
1583 // Insert DTMF
1584 const int expected_duration = 90;
1585 dtmf_sender->InsertDtmf("012", expected_duration, 100);
1586
1587 // Verify
1588 ASSERT_EQ_WAIT(3U, voice_media_channel_->dtmf_info_queue().size(),
1589 kDefaultTimeout);
1590 const uint32_t send_ssrc =
1591 voice_media_channel_->send_streams()[0].first_ssrc();
1592 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[0],
1593 send_ssrc, 0, expected_duration));
1594 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[1],
1595 send_ssrc, 1, expected_duration));
1596 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[2],
1597 send_ssrc, 2, expected_duration));
1598}
1599
1600// Make sure the signal from "GetOnDestroyedSignal()" fires when the sender is
1601// destroyed, which is needed for the DTMF sender.
1602TEST_F(RtpSenderReceiverTest, TestOnDestroyedSignal) {
1603 CreateAudioRtpSender();
1604 EXPECT_FALSE(audio_sender_destroyed_signal_fired_);
1605 audio_rtp_sender_ = nullptr;
1606 EXPECT_TRUE(audio_sender_destroyed_signal_fired_);
1607}
1608
Benjamin Wright84583f62018-10-04 14:22:34 -07001609// Validate that the default FrameEncryptor setting is nullptr.
1610TEST_F(RtpSenderReceiverTest, AudioSenderCanSetFrameEncryptor) {
1611 CreateAudioRtpSender();
1612 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1613 new FakeFrameEncryptor());
1614 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1615 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1616 EXPECT_EQ(fake_frame_encryptor.get(),
1617 audio_rtp_sender_->GetFrameEncryptor().get());
1618}
1619
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001620// Validate that setting a FrameEncryptor after the send stream is stopped does
1621// nothing.
1622TEST_F(RtpSenderReceiverTest, AudioSenderCannotSetFrameEncryptorAfterStop) {
1623 CreateAudioRtpSender();
1624 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1625 new FakeFrameEncryptor());
1626 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1627 audio_rtp_sender_->Stop();
1628 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1629 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1630}
1631
Benjamin Wright84583f62018-10-04 14:22:34 -07001632// Validate that the default FrameEncryptor setting is nullptr.
1633TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetFrameDecryptor) {
1634 CreateAudioRtpReceiver();
1635 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1636 new FakeFrameDecryptor());
1637 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
1638 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1639 EXPECT_EQ(fake_frame_decryptor.get(),
1640 audio_rtp_receiver_->GetFrameDecryptor().get());
Tommi4ccdf932021-05-17 14:50:10 +02001641 DestroyAudioRtpReceiver();
Benjamin Wright84583f62018-10-04 14:22:34 -07001642}
1643
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001644// Validate that the default FrameEncryptor setting is nullptr.
1645TEST_F(RtpSenderReceiverTest, AudioReceiverCannotSetFrameDecryptorAfterStop) {
1646 CreateAudioRtpReceiver();
1647 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1648 new FakeFrameDecryptor());
1649 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
Tommi6589def2022-02-17 23:36:47 +01001650 audio_rtp_receiver_->SetMediaChannel(nullptr);
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001651 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1652 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
Tommi4ccdf932021-05-17 14:50:10 +02001653 DestroyAudioRtpReceiver();
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001654}
1655
1656// Validate that the default FrameEncryptor setting is nullptr.
1657TEST_F(RtpSenderReceiverTest, VideoSenderCanSetFrameEncryptor) {
1658 CreateVideoRtpSender();
1659 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1660 new FakeFrameEncryptor());
1661 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1662 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1663 EXPECT_EQ(fake_frame_encryptor.get(),
1664 video_rtp_sender_->GetFrameEncryptor().get());
1665}
1666
1667// Validate that setting a FrameEncryptor after the send stream is stopped does
1668// nothing.
1669TEST_F(RtpSenderReceiverTest, VideoSenderCannotSetFrameEncryptorAfterStop) {
1670 CreateVideoRtpSender();
1671 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1672 new FakeFrameEncryptor());
1673 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1674 video_rtp_sender_->Stop();
1675 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1676 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1677}
1678
1679// Validate that the default FrameEncryptor setting is nullptr.
1680TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetFrameDecryptor) {
1681 CreateVideoRtpReceiver();
1682 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1683 new FakeFrameDecryptor());
1684 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
1685 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1686 EXPECT_EQ(fake_frame_decryptor.get(),
1687 video_rtp_receiver_->GetFrameDecryptor().get());
Tommi4ccdf932021-05-17 14:50:10 +02001688 DestroyVideoRtpReceiver();
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001689}
1690
1691// Validate that the default FrameEncryptor setting is nullptr.
1692TEST_F(RtpSenderReceiverTest, VideoReceiverCannotSetFrameDecryptorAfterStop) {
1693 CreateVideoRtpReceiver();
1694 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1695 new FakeFrameDecryptor());
1696 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
Tommi6589def2022-02-17 23:36:47 +01001697 video_rtp_receiver_->SetMediaChannel(nullptr);
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001698 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1699 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
Tommi4ccdf932021-05-17 14:50:10 +02001700 DestroyVideoRtpReceiver();
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001701}
1702
Amit Hilbuch619b2942019-02-26 15:55:19 -08001703// Checks that calling the internal methods for get/set parameters do not
1704// invalidate any parameters retreived by clients.
1705TEST_F(RtpSenderReceiverTest,
1706 InternalParameterMethodsDoNotInvalidateTransaction) {
1707 CreateVideoRtpSender();
1708 RtpParameters parameters = video_rtp_sender_->GetParameters();
1709 RtpParameters new_parameters = video_rtp_sender_->GetParametersInternal();
1710 new_parameters.encodings[0].active = false;
1711 video_rtp_sender_->SetParametersInternal(new_parameters);
1712 new_parameters.encodings[0].active = true;
1713 video_rtp_sender_->SetParametersInternal(new_parameters);
1714 parameters.encodings[0].active = false;
1715 EXPECT_TRUE(video_rtp_sender_->SetParameters(parameters).ok());
1716}
1717
Amit Hilbuch2297d332019-02-19 12:49:22 -08001718// Helper method for syntactic sugar for accepting a vector with '{}' notation.
1719std::pair<RidList, RidList> CreatePairOfRidVectors(
1720 const std::vector<std::string>& first,
1721 const std::vector<std::string>& second) {
1722 return std::make_pair(first, second);
1723}
1724
1725// These parameters are used to test disabling simulcast layers.
1726const std::pair<RidList, RidList> kDisableSimulcastLayersParameters[] = {
1727 // Tests removing the first layer. This is a special case because
1728 // the first layer's SSRC is also the 'primary' SSRC used to associate the
1729 // parameters to the media channel.
1730 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"1"}),
1731 // Tests removing some layers.
1732 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"2", "4"}),
1733 // Tests simulcast rejected scenario all layers except first are rejected.
1734 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"2", "3", "4"}),
1735 // Tests removing all layers.
1736 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"1", "2", "3", "4"}),
1737};
1738
1739// Runs test for disabling layers on a sender without a media engine set.
1740TEST_P(RtpSenderReceiverTest, DisableSimulcastLayersWithoutMediaEngine) {
1741 auto parameter = GetParam();
1742 RunDisableSimulcastLayersWithoutMediaEngineTest(parameter.first,
1743 parameter.second);
1744}
1745
1746// Runs test for disabling layers on a sender with a media engine set.
1747TEST_P(RtpSenderReceiverTest, DisableSimulcastLayersWithMediaEngine) {
1748 auto parameter = GetParam();
1749 RunDisableSimulcastLayersWithMediaEngineTest(parameter.first,
1750 parameter.second);
1751}
1752
1753INSTANTIATE_TEST_SUITE_P(
1754 DisableSimulcastLayersInSender,
1755 RtpSenderReceiverTest,
1756 ::testing::ValuesIn(kDisableSimulcastLayersParameters));
1757
deadbeef70ab1a12015-09-28 16:53:55 -07001758} // namespace webrtc