blob: 35a00502787ff6348cdaa15fd6f74f478d25aca3 [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>
kwibergd1fe2812016-04-27 06:47:29 -070014#include <memory>
deadbeef70ab1a12015-09-28 16:53:55 -070015#include <string>
Tommif888bb52015-12-12 01:37:01 +010016#include <utility>
Yves Gerey3e707812018-11-28 16:47:49 +010017#include <vector>
deadbeef70ab1a12015-09-28 16:53:55 -070018
Amit Hilbuch2297d332019-02-19 12:49:22 -080019#include "absl/algorithm/container.h"
Yves Gerey3e707812018-11-28 16:47:49 +010020#include "absl/memory/memory.h"
21#include "absl/types/optional.h"
22#include "api/audio_options.h"
Steve Anton10542f22019-01-11 09:11:00 -080023#include "api/crypto/crypto_options.h"
24#include "api/crypto/frame_decryptor_interface.h"
25#include "api/crypto/frame_encryptor_interface.h"
26#include "api/dtmf_sender_interface.h"
27#include "api/media_stream_interface.h"
28#include "api/rtc_error.h"
Danil Chapovalov83bbe912019-08-07 12:24:53 +020029#include "api/rtc_event_log/rtc_event_log.h"
Steve Anton10542f22019-01-11 09:11:00 -080030#include "api/rtp_parameters.h"
Mirko Bonadeid9708072019-01-25 20:26:48 +010031#include "api/scoped_refptr.h"
Benjamin Wright84583f62018-10-04 14:22:34 -070032#include "api/test/fake_frame_decryptor.h"
33#include "api/test/fake_frame_encryptor.h"
Jonas Orelanda3aa9bd2019-04-17 07:38:40 +020034#include "api/video/builtin_video_bitrate_allocator_factory.h"
Yves Gerey3e707812018-11-28 16:47:49 +010035#include "media/base/codec.h"
Steve Anton10542f22019-01-11 09:11:00 -080036#include "media/base/fake_media_engine.h"
37#include "media/base/media_channel.h"
38#include "media/base/media_config.h"
39#include "media/base/media_engine.h"
Steve Anton10542f22019-01-11 09:11:00 -080040#include "media/base/stream_params.h"
41#include "media/base/test_utils.h"
42#include "media/engine/fake_webrtc_call.h"
43#include "p2p/base/dtls_transport_internal.h"
44#include "p2p/base/fake_dtls_transport.h"
45#include "p2p/base/p2p_constants.h"
Ruslan Burakov501bfba2019-02-11 10:29:19 +010046#include "pc/audio_rtp_receiver.h"
Steve Anton10542f22019-01-11 09:11:00 -080047#include "pc/audio_track.h"
Yves Gerey3e707812018-11-28 16:47:49 +010048#include "pc/channel.h"
Steve Anton10542f22019-01-11 09:11:00 -080049#include "pc/channel_manager.h"
50#include "pc/dtls_srtp_transport.h"
51#include "pc/local_audio_source.h"
52#include "pc/media_stream.h"
Ruslan Burakov7ea46052019-02-16 02:07:05 +010053#include "pc/remote_audio_source.h"
Steve Anton10542f22019-01-11 09:11:00 -080054#include "pc/rtp_receiver.h"
55#include "pc/rtp_sender.h"
56#include "pc/rtp_transport_internal.h"
57#include "pc/test/fake_video_track_source.h"
Ruslan Burakov501bfba2019-02-11 10:29:19 +010058#include "pc/video_rtp_receiver.h"
Steve Anton10542f22019-01-11 09:11:00 -080059#include "pc/video_track.h"
Yves Gerey3e707812018-11-28 16:47:49 +010060#include "rtc_base/checks.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020061#include "rtc_base/gunit.h"
Yves Gerey3e707812018-11-28 16:47:49 +010062#include "rtc_base/third_party/sigslot/sigslot.h"
63#include "rtc_base/thread.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020064#include "test/gmock.h"
65#include "test/gtest.h"
Tommi4ccdf932021-05-17 14:50:10 +020066#include "test/run_loop.h"
deadbeef70ab1a12015-09-28 16:53:55 -070067
68using ::testing::_;
Amit Hilbuch2297d332019-02-19 12:49:22 -080069using ::testing::ContainerEq;
deadbeef70ab1a12015-09-28 16:53:55 -070070using ::testing::Exactly;
deadbeef5dd42fd2016-05-02 16:20:01 -070071using ::testing::InvokeWithoutArgs;
skvladdc1c62c2016-03-16 19:07:43 -070072using ::testing::Return;
Amit Hilbuch2297d332019-02-19 12:49:22 -080073using RidList = std::vector<std::string>;
deadbeef70ab1a12015-09-28 16:53:55 -070074
deadbeef20cb0c12017-02-01 20:27:00 -080075namespace {
76
Seth Hampson845e8782018-03-02 11:34:10 -080077static const char kStreamId1[] = "local_stream_1";
deadbeef70ab1a12015-09-28 16:53:55 -070078static const char kVideoTrackId[] = "video_1";
79static const char kAudioTrackId[] = "audio_1";
Peter Boström0c4e06b2015-10-07 12:23:21 +020080static const uint32_t kVideoSsrc = 98;
deadbeeffac06552015-11-25 11:26:01 -080081static const uint32_t kVideoSsrc2 = 100;
Peter Boström0c4e06b2015-10-07 12:23:21 +020082static const uint32_t kAudioSsrc = 99;
deadbeeffac06552015-11-25 11:26:01 -080083static const uint32_t kAudioSsrc2 = 101;
Florent Castelli892acf02018-10-01 22:47:20 +020084static const uint32_t kVideoSsrcSimulcast = 102;
85static const uint32_t kVideoSimulcastLayerCount = 2;
deadbeef20cb0c12017-02-01 20:27:00 -080086static const int kDefaultTimeout = 10000; // 10 seconds.
Guido Urdaneta1ff16c82019-05-20 19:31:53 +020087
88class MockSetStreamsObserver
89 : public webrtc::RtpSenderBase::SetStreamsObserver {
90 public:
Danil Chapovalov3a353122020-05-15 11:16:53 +020091 MOCK_METHOD(void, OnSetStreams, (), (override));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +020092};
93
deadbeef20cb0c12017-02-01 20:27:00 -080094} // namespace
deadbeef70ab1a12015-09-28 16:53:55 -070095
96namespace webrtc {
97
Amit Hilbuch2297d332019-02-19 12:49:22 -080098class RtpSenderReceiverTest
Mirko Bonadei6a489f22019-04-09 15:11:12 +020099 : public ::testing::Test,
100 public ::testing::WithParamInterface<std::pair<RidList, RidList>>,
Amit Hilbuch2297d332019-02-19 12:49:22 -0800101 public sigslot::has_slots<> {
tkchin3784b4a2016-06-24 19:31:47 -0700102 public:
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700103 RtpSenderReceiverTest()
Steve Anton47136dd2018-01-12 10:49:35 -0800104 : network_thread_(rtc::Thread::Current()),
105 worker_thread_(rtc::Thread::Current()),
Jonas Orelanda3aa9bd2019-04-17 07:38:40 +0200106 video_bitrate_allocator_factory_(
107 webrtc::CreateBuiltinVideoBitrateAllocatorFactory()),
Steve Anton47136dd2018-01-12 10:49:35 -0800108 // Create fake media engine/etc. so we can create channels to use to
109 // test RtpSenders/RtpReceivers.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700110 media_engine_(new cricket::FakeMediaEngine()),
Tomas Gunnarssone984aa22021-04-19 09:21:06 +0200111 fake_call_(worker_thread_, network_thread_),
Seth Hampson845e8782018-03-02 11:34:10 -0800112 local_stream_(MediaStream::Create(kStreamId1)) {
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200113 worker_thread_->Invoke<void>(RTC_FROM_HERE, [&]() {
114 channel_manager_ = cricket::ChannelManager::Create(
Harald Alvestrand7af57c62021-04-16 11:12:14 +0000115 absl::WrapUnique(media_engine_), false, worker_thread_,
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200116 network_thread_);
117 });
118
deadbeef7af91dd2016-12-13 11:29:11 -0800119 bool srtp_required = true;
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200120 rtp_dtls_transport_ = std::make_unique<cricket::FakeDtlsTransport>(
Zhi Huange830e682018-03-30 10:48:35 -0700121 "fake_dtls_transport", cricket::ICE_CANDIDATE_COMPONENT_RTP);
122 rtp_transport_ = CreateDtlsSrtpTransport();
123
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200124 voice_channel_ = channel_manager_->CreateVoiceChannel(
Zhi Huange830e682018-03-30 10:48:35 -0700125 &fake_call_, cricket::MediaConfig(), rtp_transport_.get(),
Niels Möller2a707032020-06-16 16:39:13 +0200126 rtc::Thread::Current(), cricket::CN_AUDIO, srtp_required,
127 webrtc::CryptoOptions(), &ssrc_generator_, cricket::AudioOptions());
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200128 video_channel_ = channel_manager_->CreateVideoChannel(
Zhi Huange830e682018-03-30 10:48:35 -0700129 &fake_call_, cricket::MediaConfig(), rtp_transport_.get(),
Niels Möller2a707032020-06-16 16:39:13 +0200130 rtc::Thread::Current(), cricket::CN_VIDEO, srtp_required,
131 webrtc::CryptoOptions(), &ssrc_generator_, cricket::VideoOptions(),
132 video_bitrate_allocator_factory_.get());
deadbeef20cb0c12017-02-01 20:27:00 -0800133 voice_channel_->Enable(true);
134 video_channel_->Enable(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700135 voice_media_channel_ = media_engine_->GetVoiceChannel(0);
136 video_media_channel_ = media_engine_->GetVideoChannel(0);
137 RTC_CHECK(voice_channel_);
138 RTC_CHECK(video_channel_);
139 RTC_CHECK(voice_media_channel_);
140 RTC_CHECK(video_media_channel_);
141
142 // Create streams for predefined SSRCs. Streams need to exist in order
143 // for the senders and receievers to apply parameters to them.
144 // Normally these would be created by SetLocalDescription and
145 // SetRemoteDescription.
146 voice_media_channel_->AddSendStream(
147 cricket::StreamParams::CreateLegacy(kAudioSsrc));
148 voice_media_channel_->AddRecvStream(
149 cricket::StreamParams::CreateLegacy(kAudioSsrc));
150 voice_media_channel_->AddSendStream(
151 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
152 voice_media_channel_->AddRecvStream(
153 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
154 video_media_channel_->AddSendStream(
155 cricket::StreamParams::CreateLegacy(kVideoSsrc));
156 video_media_channel_->AddRecvStream(
157 cricket::StreamParams::CreateLegacy(kVideoSsrc));
158 video_media_channel_->AddSendStream(
159 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
160 video_media_channel_->AddRecvStream(
161 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
tkchin3784b4a2016-06-24 19:31:47 -0700162 }
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700163
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200164 ~RtpSenderReceiverTest() {
165 audio_rtp_sender_ = nullptr;
166 video_rtp_sender_ = nullptr;
167 audio_rtp_receiver_ = nullptr;
168 video_rtp_receiver_ = nullptr;
169 local_stream_ = nullptr;
170 video_track_ = nullptr;
171 audio_track_ = nullptr;
172 worker_thread_->Invoke<void>(RTC_FROM_HERE,
173 [&]() { channel_manager_.reset(); });
174 }
175
Zhi Huange830e682018-03-30 10:48:35 -0700176 std::unique_ptr<webrtc::RtpTransportInternal> CreateDtlsSrtpTransport() {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200177 auto dtls_srtp_transport = std::make_unique<webrtc::DtlsSrtpTransport>(
Karl Wiberg918f50c2018-07-05 11:40:33 +0200178 /*rtcp_mux_required=*/true);
Zhi Huange830e682018-03-30 10:48:35 -0700179 dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport_.get(),
180 /*rtcp_dtls_transport=*/nullptr);
181 return dtls_srtp_transport;
182 }
183
deadbeef20cb0c12017-02-01 20:27:00 -0800184 // Needed to use DTMF sender.
185 void AddDtmfCodec() {
186 cricket::AudioSendParameters params;
187 const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000,
188 0, 1);
189 params.codecs.push_back(kTelephoneEventCodec);
190 voice_media_channel_->SetSendParameters(params);
191 }
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700192
pbos5214a0a2016-12-16 15:39:11 -0800193 void AddVideoTrack() { AddVideoTrack(false); }
194
195 void AddVideoTrack(bool is_screencast) {
perkja3ede6c2016-03-08 01:27:48 +0100196 rtc::scoped_refptr<VideoTrackSourceInterface> source(
pbos5214a0a2016-12-16 15:39:11 -0800197 FakeVideoTrackSource::Create(is_screencast));
perkj773be362017-07-31 23:22:01 -0700198 video_track_ =
199 VideoTrack::Create(kVideoTrackId, source, rtc::Thread::Current());
deadbeefe814a0d2017-02-25 18:15:09 -0800200 EXPECT_TRUE(local_stream_->AddTrack(video_track_));
deadbeef70ab1a12015-09-28 16:53:55 -0700201 }
202
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700203 void CreateAudioRtpSender() { CreateAudioRtpSender(nullptr); }
204
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +0100205 void CreateAudioRtpSender(
206 const rtc::scoped_refptr<LocalAudioSource>& source) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700207 audio_track_ = AudioTrack::Create(kAudioTrackId, source);
deadbeefe814a0d2017-02-25 18:15:09 -0800208 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200209 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200210 std::make_unique<MockSetStreamsObserver>();
Steve Anton47136dd2018-01-12 10:49:35 -0800211 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200212 AudioRtpSender::Create(worker_thread_, audio_track_->id(), nullptr,
213 set_streams_observer.get());
Steve Anton111fdfd2018-06-25 13:03:36 -0700214 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200215 EXPECT_CALL(*set_streams_observer, OnSetStreams());
216 audio_rtp_sender_->SetStreams({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800217 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
deadbeeffac06552015-11-25 11:26:01 -0800218 audio_rtp_sender_->SetSsrc(kAudioSsrc);
deadbeef20cb0c12017-02-01 20:27:00 -0800219 audio_rtp_sender_->GetOnDestroyedSignal()->connect(
220 this, &RtpSenderReceiverTest::OnAudioSenderDestroyed);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700221 VerifyVoiceChannelInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700222 }
223
Steve Anton02ee47c2018-01-10 16:26:06 -0800224 void CreateAudioRtpSenderWithNoTrack() {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800225 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200226 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800227 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
Steve Anton02ee47c2018-01-10 16:26:06 -0800228 }
229
deadbeef20cb0c12017-02-01 20:27:00 -0800230 void OnAudioSenderDestroyed() { audio_sender_destroyed_signal_fired_ = true; }
231
Seth Hampson2d2c8882018-05-16 16:02:32 -0700232 void CreateVideoRtpSender(uint32_t ssrc) {
233 CreateVideoRtpSender(false, ssrc);
234 }
235
pbos5214a0a2016-12-16 15:39:11 -0800236 void CreateVideoRtpSender() { CreateVideoRtpSender(false); }
237
Amit Hilbuch2297d332019-02-19 12:49:22 -0800238 cricket::StreamParams CreateSimulcastStreamParams(int num_layers) {
Florent Castelli892acf02018-10-01 22:47:20 +0200239 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +0100240 ssrcs.reserve(num_layers);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800241 for (int i = 0; i < num_layers; ++i) {
Florent Castelli892acf02018-10-01 22:47:20 +0200242 ssrcs.push_back(kVideoSsrcSimulcast + i);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800243 }
244 return cricket::CreateSimStreamParams("cname", ssrcs);
245 }
246
247 uint32_t CreateVideoRtpSender(const cricket::StreamParams& stream_params) {
Florent Castelli892acf02018-10-01 22:47:20 +0200248 video_media_channel_->AddSendStream(stream_params);
249 uint32_t primary_ssrc = stream_params.first_ssrc();
250 CreateVideoRtpSender(primary_ssrc);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800251 return primary_ssrc;
252 }
253
254 uint32_t CreateVideoRtpSenderWithSimulcast(
255 int num_layers = kVideoSimulcastLayerCount) {
256 return CreateVideoRtpSender(CreateSimulcastStreamParams(num_layers));
257 }
258
259 uint32_t CreateVideoRtpSenderWithSimulcast(
260 const std::vector<std::string>& rids) {
261 cricket::StreamParams stream_params =
262 CreateSimulcastStreamParams(rids.size());
263 std::vector<cricket::RidDescription> rid_descriptions;
264 absl::c_transform(
265 rids, std::back_inserter(rid_descriptions), [](const std::string& rid) {
266 return cricket::RidDescription(rid, cricket::RidDirection::kSend);
267 });
268 stream_params.set_rids(rid_descriptions);
269 return CreateVideoRtpSender(stream_params);
Florent Castelli892acf02018-10-01 22:47:20 +0200270 }
271
Seth Hampson2d2c8882018-05-16 16:02:32 -0700272 void CreateVideoRtpSender(bool is_screencast, uint32_t ssrc = kVideoSsrc) {
pbos5214a0a2016-12-16 15:39:11 -0800273 AddVideoTrack(is_screencast);
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200274 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200275 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200276 video_rtp_sender_ = VideoRtpSender::Create(
277 worker_thread_, video_track_->id(), set_streams_observer.get());
Steve Anton111fdfd2018-06-25 13:03:36 -0700278 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200279 EXPECT_CALL(*set_streams_observer, OnSetStreams());
280 video_rtp_sender_->SetStreams({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800281 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Seth Hampson2d2c8882018-05-16 16:02:32 -0700282 video_rtp_sender_->SetSsrc(ssrc);
283 VerifyVideoChannelInput(ssrc);
deadbeef70ab1a12015-09-28 16:53:55 -0700284 }
Steve Anton02ee47c2018-01-10 16:26:06 -0800285 void CreateVideoRtpSenderWithNoTrack() {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200286 video_rtp_sender_ =
287 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800288 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Steve Anton02ee47c2018-01-10 16:26:06 -0800289 }
290
deadbeef70ab1a12015-09-28 16:53:55 -0700291 void DestroyAudioRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700292 audio_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700293 VerifyVoiceChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700294 }
295
296 void DestroyVideoRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700297 video_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700298 VerifyVideoChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700299 }
300
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100301 void CreateAudioRtpReceiver(
302 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
Tommi4ccdf932021-05-17 14:50:10 +0200303 audio_rtp_receiver_ = rtc::make_ref_counted<AudioRtpReceiver>(
304 rtc::Thread::Current(), kAudioTrackId, streams,
305 /*is_unified_plan=*/true);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800306 audio_rtp_receiver_->SetMediaChannel(voice_media_channel_);
Steve Antond3679212018-01-17 17:41:02 -0800307 audio_rtp_receiver_->SetupMediaChannel(kAudioSsrc);
perkjd61bf802016-03-24 03:16:19 -0700308 audio_track_ = audio_rtp_receiver_->audio_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700309 VerifyVoiceChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700310 }
311
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100312 void CreateVideoRtpReceiver(
313 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
Tommi4ccdf932021-05-17 14:50:10 +0200314 video_rtp_receiver_ = rtc::make_ref_counted<VideoRtpReceiver>(
315 rtc::Thread::Current(), kVideoTrackId, streams);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800316 video_rtp_receiver_->SetMediaChannel(video_media_channel_);
Steve Antond3679212018-01-17 17:41:02 -0800317 video_rtp_receiver_->SetupMediaChannel(kVideoSsrc);
perkjf0dcfe22016-03-10 18:32:00 +0100318 video_track_ = video_rtp_receiver_->video_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700319 VerifyVideoChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700320 }
321
Florent Castelli38332cd2018-11-20 14:08:06 +0100322 void CreateVideoRtpReceiverWithSimulcast(
323 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {},
324 int num_layers = kVideoSimulcastLayerCount) {
325 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +0100326 ssrcs.reserve(num_layers);
Florent Castelli38332cd2018-11-20 14:08:06 +0100327 for (int i = 0; i < num_layers; ++i)
328 ssrcs.push_back(kVideoSsrcSimulcast + i);
329 cricket::StreamParams stream_params =
330 cricket::CreateSimStreamParams("cname", ssrcs);
331 video_media_channel_->AddRecvStream(stream_params);
332 uint32_t primary_ssrc = stream_params.first_ssrc();
333
Tommi4ccdf932021-05-17 14:50:10 +0200334 video_rtp_receiver_ = rtc::make_ref_counted<VideoRtpReceiver>(
335 rtc::Thread::Current(), kVideoTrackId, streams);
Florent Castelli38332cd2018-11-20 14:08:06 +0100336 video_rtp_receiver_->SetMediaChannel(video_media_channel_);
337 video_rtp_receiver_->SetupMediaChannel(primary_ssrc);
338 video_track_ = video_rtp_receiver_->video_track();
339 }
340
deadbeef70ab1a12015-09-28 16:53:55 -0700341 void DestroyAudioRtpReceiver() {
Tommi4ccdf932021-05-17 14:50:10 +0200342 if (!audio_rtp_receiver_)
343 return;
344 audio_rtp_receiver_->Stop();
deadbeef70ab1a12015-09-28 16:53:55 -0700345 audio_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700346 VerifyVoiceChannelNoOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700347 }
348
349 void DestroyVideoRtpReceiver() {
Tommi4ccdf932021-05-17 14:50:10 +0200350 if (!video_rtp_receiver_)
351 return;
352 video_rtp_receiver_->Stop();
deadbeef70ab1a12015-09-28 16:53:55 -0700353 video_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700354 VerifyVideoChannelNoOutput();
355 }
356
357 void VerifyVoiceChannelInput() { VerifyVoiceChannelInput(kAudioSsrc); }
358
359 void VerifyVoiceChannelInput(uint32_t ssrc) {
360 // Verify that the media channel has an audio source, and the stream isn't
361 // muted.
362 EXPECT_TRUE(voice_media_channel_->HasSource(ssrc));
363 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(ssrc));
364 }
365
366 void VerifyVideoChannelInput() { VerifyVideoChannelInput(kVideoSsrc); }
367
368 void VerifyVideoChannelInput(uint32_t ssrc) {
369 // Verify that the media channel has a video source,
370 EXPECT_TRUE(video_media_channel_->HasSource(ssrc));
371 }
372
373 void VerifyVoiceChannelNoInput() { VerifyVoiceChannelNoInput(kAudioSsrc); }
374
375 void VerifyVoiceChannelNoInput(uint32_t ssrc) {
376 // Verify that the media channel's source is reset.
377 EXPECT_FALSE(voice_media_channel_->HasSource(ssrc));
378 }
379
380 void VerifyVideoChannelNoInput() { VerifyVideoChannelNoInput(kVideoSsrc); }
381
382 void VerifyVideoChannelNoInput(uint32_t ssrc) {
383 // Verify that the media channel's source is reset.
384 EXPECT_FALSE(video_media_channel_->HasSource(ssrc));
385 }
386
387 void VerifyVoiceChannelOutput() {
388 // Verify that the volume is initialized to 1.
389 double volume;
390 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
391 EXPECT_EQ(1, volume);
392 }
393
394 void VerifyVideoChannelOutput() {
395 // Verify that the media channel has a sink.
396 EXPECT_TRUE(video_media_channel_->HasSink(kVideoSsrc));
397 }
398
399 void VerifyVoiceChannelNoOutput() {
400 // Verify that the volume is reset to 0.
401 double volume;
402 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
403 EXPECT_EQ(0, volume);
404 }
405
406 void VerifyVideoChannelNoOutput() {
407 // Verify that the media channel's sink is reset.
408 EXPECT_FALSE(video_media_channel_->HasSink(kVideoSsrc));
deadbeef70ab1a12015-09-28 16:53:55 -0700409 }
410
Amit Hilbuch2297d332019-02-19 12:49:22 -0800411 // Verifies that the encoding layers contain the specified RIDs.
412 bool VerifyEncodingLayers(const VideoRtpSender& sender,
413 const std::vector<std::string>& rids) {
414 bool has_failure = HasFailure();
415 RtpParameters parameters = sender.GetParameters();
416 std::vector<std::string> encoding_rids;
417 absl::c_transform(
418 parameters.encodings, std::back_inserter(encoding_rids),
419 [](const RtpEncodingParameters& encoding) { return encoding.rid; });
420 EXPECT_THAT(rids, ContainerEq(encoding_rids));
421 return has_failure || !HasFailure();
422 }
423
424 // Runs a test for disabling the encoding layers on the specified sender.
425 void RunDisableEncodingLayersTest(
426 const std::vector<std::string>& all_layers,
427 const std::vector<std::string>& disabled_layers,
428 VideoRtpSender* sender) {
429 std::vector<std::string> expected;
430 absl::c_copy_if(all_layers, std::back_inserter(expected),
431 [&disabled_layers](const std::string& rid) {
432 return !absl::c_linear_search(disabled_layers, rid);
433 });
434
435 EXPECT_TRUE(VerifyEncodingLayers(*sender, all_layers));
436 sender->DisableEncodingLayers(disabled_layers);
437 EXPECT_TRUE(VerifyEncodingLayers(*sender, expected));
438 }
439
440 // Runs a test for setting an encoding layer as inactive.
441 // This test assumes that some layers have already been disabled.
442 void RunSetLastLayerAsInactiveTest(VideoRtpSender* sender) {
443 auto parameters = sender->GetParameters();
444 if (parameters.encodings.size() == 0) {
445 return;
446 }
447
448 RtpEncodingParameters& encoding = parameters.encodings.back();
449 auto rid = encoding.rid;
450 EXPECT_TRUE(encoding.active);
451 encoding.active = false;
452 auto error = sender->SetParameters(parameters);
453 ASSERT_TRUE(error.ok());
454 parameters = sender->GetParameters();
455 RtpEncodingParameters& result_encoding = parameters.encodings.back();
456 EXPECT_EQ(rid, result_encoding.rid);
457 EXPECT_FALSE(result_encoding.active);
458 }
459
460 // Runs a test for disabling the encoding layers on a sender without a media
461 // channel.
462 void RunDisableSimulcastLayersWithoutMediaEngineTest(
463 const std::vector<std::string>& all_layers,
464 const std::vector<std::string>& disabled_layers) {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200465 auto sender = VideoRtpSender::Create(rtc::Thread::Current(), "1", nullptr);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800466 RtpParameters parameters;
467 parameters.encodings.resize(all_layers.size());
468 for (size_t i = 0; i < all_layers.size(); ++i) {
469 parameters.encodings[i].rid = all_layers[i];
470 }
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800471 sender->set_init_send_encodings(parameters.encodings);
472 RunDisableEncodingLayersTest(all_layers, disabled_layers, sender.get());
473 RunSetLastLayerAsInactiveTest(sender.get());
Amit Hilbuch2297d332019-02-19 12:49:22 -0800474 }
475
476 // Runs a test for disabling the encoding layers on a sender with a media
477 // channel.
478 void RunDisableSimulcastLayersWithMediaEngineTest(
479 const std::vector<std::string>& all_layers,
480 const std::vector<std::string>& disabled_layers) {
481 uint32_t ssrc = CreateVideoRtpSenderWithSimulcast(all_layers);
482 RunDisableEncodingLayersTest(all_layers, disabled_layers,
483 video_rtp_sender_.get());
484
485 auto channel_parameters = video_media_channel_->GetRtpSendParameters(ssrc);
486 ASSERT_EQ(channel_parameters.encodings.size(), all_layers.size());
487 for (size_t i = 0; i < all_layers.size(); ++i) {
488 EXPECT_EQ(all_layers[i], channel_parameters.encodings[i].rid);
489 bool is_active = !absl::c_linear_search(disabled_layers, all_layers[i]);
490 EXPECT_EQ(is_active, channel_parameters.encodings[i].active);
491 }
492
493 RunSetLastLayerAsInactiveTest(video_rtp_sender_.get());
494 }
495
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200496 // Check that minimum Jitter Buffer delay is propagated to the underlying
Artem Titov880fa812021-07-30 22:30:23 +0200497 // `media_channel`.
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200498 void VerifyRtpReceiverDelayBehaviour(cricket::Delayable* media_channel,
499 RtpReceiverInterface* receiver,
500 uint32_t ssrc) {
501 receiver->SetJitterBufferMinimumDelay(/*delay_seconds=*/0.5);
502 absl::optional<int> delay_ms =
503 media_channel->GetBaseMinimumPlayoutDelayMs(ssrc); // In milliseconds.
504 EXPECT_DOUBLE_EQ(0.5, delay_ms.value_or(0) / 1000.0);
505 }
506
deadbeef70ab1a12015-09-28 16:53:55 -0700507 protected:
Tommi4ccdf932021-05-17 14:50:10 +0200508 test::RunLoop run_loop_;
Steve Anton47136dd2018-01-12 10:49:35 -0800509 rtc::Thread* const network_thread_;
510 rtc::Thread* const worker_thread_;
Danil Chapovalov83bbe912019-08-07 12:24:53 +0200511 webrtc::RtcEventLogNull event_log_;
Artem Titov880fa812021-07-30 22:30:23 +0200512 // The `rtp_dtls_transport_` and `rtp_transport_` should be destroyed after
513 // the `channel_manager`.
Zhi Huange830e682018-03-30 10:48:35 -0700514 std::unique_ptr<cricket::DtlsTransportInternal> rtp_dtls_transport_;
515 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport_;
Jonas Orelanda3aa9bd2019-04-17 07:38:40 +0200516 std::unique_ptr<webrtc::VideoBitrateAllocatorFactory>
517 video_bitrate_allocator_factory_;
Artem Titov880fa812021-07-30 22:30:23 +0200518 // `media_engine_` is actually owned by `channel_manager_`.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700519 cricket::FakeMediaEngine* media_engine_;
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200520 std::unique_ptr<cricket::ChannelManager> channel_manager_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700521 cricket::FakeCall fake_call_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700522 cricket::VoiceChannel* voice_channel_;
523 cricket::VideoChannel* video_channel_;
524 cricket::FakeVoiceMediaChannel* voice_media_channel_;
525 cricket::FakeVideoMediaChannel* video_media_channel_;
deadbeef70ab1a12015-09-28 16:53:55 -0700526 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
527 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
528 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
529 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
deadbeefe814a0d2017-02-25 18:15:09 -0800530 rtc::scoped_refptr<MediaStreamInterface> local_stream_;
deadbeef70ab1a12015-09-28 16:53:55 -0700531 rtc::scoped_refptr<VideoTrackInterface> video_track_;
532 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
deadbeef20cb0c12017-02-01 20:27:00 -0800533 bool audio_sender_destroyed_signal_fired_ = false;
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800534 rtc::UniqueRandomIdGenerator ssrc_generator_;
deadbeef70ab1a12015-09-28 16:53:55 -0700535};
536
Artem Titov880fa812021-07-30 22:30:23 +0200537// Test that `voice_channel_` is updated when an audio track is associated
deadbeef70ab1a12015-09-28 16:53:55 -0700538// and disassociated with an AudioRtpSender.
539TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
540 CreateAudioRtpSender();
541 DestroyAudioRtpSender();
542}
543
Artem Titov880fa812021-07-30 22:30:23 +0200544// Test that `video_channel_` is updated when a video track is associated and
deadbeef70ab1a12015-09-28 16:53:55 -0700545// disassociated with a VideoRtpSender.
546TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
547 CreateVideoRtpSender();
548 DestroyVideoRtpSender();
549}
550
Artem Titov880fa812021-07-30 22:30:23 +0200551// Test that `voice_channel_` is updated when a remote audio track is
deadbeef70ab1a12015-09-28 16:53:55 -0700552// associated and disassociated with an AudioRtpReceiver.
553TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
554 CreateAudioRtpReceiver();
555 DestroyAudioRtpReceiver();
556}
557
Artem Titov880fa812021-07-30 22:30:23 +0200558// Test that `video_channel_` is updated when a remote video track is
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700559// associated and disassociated with a VideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700560TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
561 CreateVideoRtpReceiver();
562 DestroyVideoRtpReceiver();
563}
564
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100565TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiverWithStreams) {
566 CreateAudioRtpReceiver({local_stream_});
567 DestroyAudioRtpReceiver();
568}
569
570TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiverWithStreams) {
571 CreateVideoRtpReceiver({local_stream_});
572 DestroyVideoRtpReceiver();
573}
574
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700575// Test that the AudioRtpSender applies options from the local audio source.
576TEST_F(RtpSenderReceiverTest, LocalAudioSourceOptionsApplied) {
577 cricket::AudioOptions options;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100578 options.echo_cancellation = true;
deadbeef757146b2017-02-10 21:26:48 -0800579 auto source = LocalAudioSource::Create(&options);
Niels Möllere7cc8832022-01-04 15:20:03 +0100580 CreateAudioRtpSender(source);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700581
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100582 EXPECT_EQ(true, voice_media_channel_->options().echo_cancellation);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700583
584 DestroyAudioRtpSender();
585}
586
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700587// Test that the stream is muted when the track is disabled, and unmuted when
588// the track is enabled.
589TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) {
590 CreateAudioRtpSender();
591
592 audio_track_->set_enabled(false);
593 EXPECT_TRUE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
594
595 audio_track_->set_enabled(true);
596 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
597
598 DestroyAudioRtpSender();
599}
600
601// Test that the volume is set to 0 when the track is disabled, and back to
602// 1 when the track is enabled.
deadbeef70ab1a12015-09-28 16:53:55 -0700603TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
604 CreateAudioRtpReceiver();
605
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700606 double volume;
607 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
608 EXPECT_EQ(1, volume);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700609
Tommi4ccdf932021-05-17 14:50:10 +0200610 // Handling of enable/disable is applied asynchronously.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700611 audio_track_->set_enabled(false);
Tommi4ccdf932021-05-17 14:50:10 +0200612 run_loop_.Flush();
613
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700614 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
615 EXPECT_EQ(0, volume);
616
deadbeef70ab1a12015-09-28 16:53:55 -0700617 audio_track_->set_enabled(true);
Tommi4ccdf932021-05-17 14:50:10 +0200618 run_loop_.Flush();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700619 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
620 EXPECT_EQ(1, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700621
622 DestroyAudioRtpReceiver();
623}
624
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700625// Currently no action is taken when a remote video track is disabled or
626// enabled, so there's nothing to test here, other than what is normally
627// verified in DestroyVideoRtpSender.
deadbeef70ab1a12015-09-28 16:53:55 -0700628TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
629 CreateVideoRtpSender();
630
deadbeef70ab1a12015-09-28 16:53:55 -0700631 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700632 video_track_->set_enabled(true);
633
634 DestroyVideoRtpSender();
635}
636
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700637// Test that the state of the video track created by the VideoRtpReceiver is
638// updated when the receiver is destroyed.
perkjf0dcfe22016-03-10 18:32:00 +0100639TEST_F(RtpSenderReceiverTest, RemoteVideoTrackState) {
640 CreateVideoRtpReceiver();
641
642 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track_->state());
643 EXPECT_EQ(webrtc::MediaSourceInterface::kLive,
644 video_track_->GetSource()->state());
645
646 DestroyVideoRtpReceiver();
647
648 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track_->state());
649 EXPECT_EQ(webrtc::MediaSourceInterface::kEnded,
650 video_track_->GetSource()->state());
Tommi4ccdf932021-05-17 14:50:10 +0200651 DestroyVideoRtpReceiver();
perkjf0dcfe22016-03-10 18:32:00 +0100652}
653
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700654// Currently no action is taken when a remote video track is disabled or
655// enabled, so there's nothing to test here, other than what is normally
656// verified in DestroyVideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700657TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
658 CreateVideoRtpReceiver();
659
660 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700661 video_track_->set_enabled(true);
662
663 DestroyVideoRtpReceiver();
664}
665
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700666// Test that the AudioRtpReceiver applies volume changes from the track source
667// to the media channel.
deadbeef70ab1a12015-09-28 16:53:55 -0700668TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
669 CreateAudioRtpReceiver();
670
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700671 double volume;
672 audio_track_->GetSource()->SetVolume(0.5);
Tommi4ccdf932021-05-17 14:50:10 +0200673 run_loop_.Flush();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700674 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
675 EXPECT_EQ(0.5, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700676
677 // Disable the audio track, this should prevent setting the volume.
deadbeef70ab1a12015-09-28 16:53:55 -0700678 audio_track_->set_enabled(false);
Tommi4ccdf932021-05-17 14:50:10 +0200679 RTC_DCHECK_EQ(worker_thread_, run_loop_.task_queue());
680 run_loop_.Flush();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700681 audio_track_->GetSource()->SetVolume(0.8);
682 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
683 EXPECT_EQ(0, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700684
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700685 // When the track is enabled, the previously set volume should take effect.
deadbeef70ab1a12015-09-28 16:53:55 -0700686 audio_track_->set_enabled(true);
Tommi4ccdf932021-05-17 14:50:10 +0200687 run_loop_.Flush();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700688 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
689 EXPECT_EQ(0.8, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700690
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700691 // Try changing volume one more time.
692 audio_track_->GetSource()->SetVolume(0.9);
Tommi4ccdf932021-05-17 14:50:10 +0200693 run_loop_.Flush();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700694 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
695 EXPECT_EQ(0.9, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700696
697 DestroyAudioRtpReceiver();
698}
699
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200700TEST_F(RtpSenderReceiverTest, AudioRtpReceiverDelay) {
701 CreateAudioRtpReceiver();
702 VerifyRtpReceiverDelayBehaviour(voice_media_channel_,
703 audio_rtp_receiver_.get(), kAudioSsrc);
Tommi4ccdf932021-05-17 14:50:10 +0200704 DestroyAudioRtpReceiver();
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200705}
706
707TEST_F(RtpSenderReceiverTest, VideoRtpReceiverDelay) {
708 CreateVideoRtpReceiver();
709 VerifyRtpReceiverDelayBehaviour(video_media_channel_,
710 video_rtp_receiver_.get(), kVideoSsrc);
Tommi4ccdf932021-05-17 14:50:10 +0200711 DestroyVideoRtpReceiver();
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200712}
713
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700714// Test that the media channel isn't enabled for sending if the audio sender
715// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800716TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800717 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800718 rtc::scoped_refptr<AudioTrackInterface> track =
719 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700720
721 // Track but no SSRC.
722 EXPECT_TRUE(audio_rtp_sender_->SetTrack(track));
723 VerifyVoiceChannelNoInput();
724
725 // SSRC but no track.
726 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
727 audio_rtp_sender_->SetSsrc(kAudioSsrc);
728 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800729}
730
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700731// Test that the media channel isn't enabled for sending if the video sender
732// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800733TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800734 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700735
736 // Track but no SSRC.
737 EXPECT_TRUE(video_rtp_sender_->SetTrack(video_track_));
738 VerifyVideoChannelNoInput();
739
740 // SSRC but no track.
741 EXPECT_TRUE(video_rtp_sender_->SetTrack(nullptr));
742 video_rtp_sender_->SetSsrc(kVideoSsrc);
743 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800744}
745
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700746// Test that the media channel is enabled for sending when the audio sender
747// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800748TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800749 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800750 rtc::scoped_refptr<AudioTrackInterface> track =
751 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700752 audio_rtp_sender_->SetSsrc(kAudioSsrc);
753 audio_rtp_sender_->SetTrack(track);
754 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800755
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700756 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800757}
758
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700759// Test that the media channel is enabled for sending when the audio sender
760// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800761TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800762 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800763 rtc::scoped_refptr<AudioTrackInterface> track =
764 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700765 audio_rtp_sender_->SetTrack(track);
766 audio_rtp_sender_->SetSsrc(kAudioSsrc);
767 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800768
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700769 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800770}
771
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700772// Test that the media channel is enabled for sending when the video sender
773// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800774TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
nisseaf510af2016-03-21 08:20:42 -0700775 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800776 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700777 video_rtp_sender_->SetSsrc(kVideoSsrc);
778 video_rtp_sender_->SetTrack(video_track_);
779 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800780
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700781 DestroyVideoRtpSender();
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 last.
deadbeeffac06552015-11-25 11:26:01 -0800786TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
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_->SetTrack(video_track_);
790 video_rtp_sender_->SetSsrc(kVideoSsrc);
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 stops sending when the audio sender's SSRC is set
797// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800798TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700799 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800800
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700801 audio_rtp_sender_->SetSsrc(0);
802 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800803}
804
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700805// Test that the media channel stops sending when the video sender's SSRC is set
806// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800807TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700808 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800809
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700810 audio_rtp_sender_->SetSsrc(0);
811 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800812}
813
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700814// Test that the media channel stops sending when the audio sender's track is
815// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800816TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700817 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800818
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700819 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
820 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800821}
822
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700823// Test that the media channel stops sending when the video sender's track is
824// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800825TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700826 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800827
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700828 video_rtp_sender_->SetSsrc(0);
829 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800830}
831
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700832// Test that when the audio sender's SSRC is changed, the media channel stops
833// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800834TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700835 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800836
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700837 audio_rtp_sender_->SetSsrc(kAudioSsrc2);
838 VerifyVoiceChannelNoInput(kAudioSsrc);
839 VerifyVoiceChannelInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800840
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700841 audio_rtp_sender_ = nullptr;
842 VerifyVoiceChannelNoInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800843}
844
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700845// Test that when the audio sender's SSRC is changed, the media channel stops
846// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800847TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700848 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800849
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700850 video_rtp_sender_->SetSsrc(kVideoSsrc2);
851 VerifyVideoChannelNoInput(kVideoSsrc);
852 VerifyVideoChannelInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800853
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700854 video_rtp_sender_ = nullptr;
855 VerifyVideoChannelNoInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800856}
857
skvladdc1c62c2016-03-16 19:07:43 -0700858TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) {
859 CreateAudioRtpSender();
860
skvladdc1c62c2016-03-16 19:07:43 -0700861 RtpParameters params = audio_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700862 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -0800863 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -0700864
865 DestroyAudioRtpSender();
866}
867
Florent Castelli892acf02018-10-01 22:47:20 +0200868TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParametersBeforeNegotiation) {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800869 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200870 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +0200871
872 RtpParameters params = audio_rtp_sender_->GetParameters();
873 ASSERT_EQ(1u, params.encodings.size());
874 params.encodings[0].max_bitrate_bps = 90000;
875 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
876
877 params = audio_rtp_sender_->GetParameters();
878 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
879 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
880
881 DestroyAudioRtpSender();
882}
883
884TEST_F(RtpSenderReceiverTest, AudioSenderInitParametersMovedAfterNegotiation) {
885 audio_track_ = AudioTrack::Create(kAudioTrackId, nullptr);
886 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
887
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200888 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200889 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200890 audio_rtp_sender_ = AudioRtpSender::Create(
891 worker_thread_, audio_track_->id(), nullptr, set_streams_observer.get());
Florent Castelli892acf02018-10-01 22:47:20 +0200892 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200893 EXPECT_CALL(*set_streams_observer, OnSetStreams());
894 audio_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli892acf02018-10-01 22:47:20 +0200895
896 std::vector<RtpEncodingParameters> init_encodings(1);
897 init_encodings[0].max_bitrate_bps = 60000;
898 audio_rtp_sender_->set_init_send_encodings(init_encodings);
899
900 RtpParameters params = audio_rtp_sender_->GetParameters();
901 ASSERT_EQ(1u, params.encodings.size());
902 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
903
904 // Simulate the setLocalDescription call
905 std::vector<uint32_t> ssrcs(1, 1);
906 cricket::StreamParams stream_params =
907 cricket::CreateSimStreamParams("cname", ssrcs);
908 voice_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800909 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +0200910 audio_rtp_sender_->SetSsrc(1);
911
912 params = audio_rtp_sender_->GetParameters();
913 ASSERT_EQ(1u, params.encodings.size());
914 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
915
916 DestroyAudioRtpSender();
917}
918
919TEST_F(RtpSenderReceiverTest,
920 AudioSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800921 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200922 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +0200923
924 RtpParameters params;
925 RTCError result = audio_rtp_sender_->SetParameters(params);
926 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
927 DestroyAudioRtpSender();
928}
929
Florent Castellicebf50f2018-05-03 15:31:53 +0200930TEST_F(RtpSenderReceiverTest,
931 AudioSenderMustCallGetParametersBeforeSetParameters) {
932 CreateAudioRtpSender();
933
934 RtpParameters params;
935 RTCError result = audio_rtp_sender_->SetParameters(params);
936 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
937
938 DestroyAudioRtpSender();
939}
940
941TEST_F(RtpSenderReceiverTest,
942 AudioSenderSetParametersInvalidatesTransactionId) {
943 CreateAudioRtpSender();
944
945 RtpParameters params = audio_rtp_sender_->GetParameters();
946 EXPECT_EQ(1u, params.encodings.size());
947 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
948 RTCError result = audio_rtp_sender_->SetParameters(params);
949 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
950
951 DestroyAudioRtpSender();
952}
953
954TEST_F(RtpSenderReceiverTest, AudioSenderDetectTransactionIdModification) {
955 CreateAudioRtpSender();
956
957 RtpParameters params = audio_rtp_sender_->GetParameters();
958 params.transaction_id = "";
959 RTCError result = audio_rtp_sender_->SetParameters(params);
960 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
961
962 DestroyAudioRtpSender();
963}
964
965TEST_F(RtpSenderReceiverTest, AudioSenderCheckTransactionIdRefresh) {
966 CreateAudioRtpSender();
967
968 RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200969 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 15:31:53 +0200970 auto saved_transaction_id = params.transaction_id;
971 params = audio_rtp_sender_->GetParameters();
972 EXPECT_NE(saved_transaction_id, params.transaction_id);
973
974 DestroyAudioRtpSender();
975}
976
977TEST_F(RtpSenderReceiverTest, AudioSenderSetParametersOldValueFail) {
978 CreateAudioRtpSender();
979
980 RtpParameters params = audio_rtp_sender_->GetParameters();
981 RtpParameters second_params = audio_rtp_sender_->GetParameters();
982
983 RTCError result = audio_rtp_sender_->SetParameters(params);
984 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
Seth Hampson2d2c8882018-05-16 16:02:32 -0700985 DestroyAudioRtpSender();
986}
987
988TEST_F(RtpSenderReceiverTest, AudioSenderCantSetUnimplementedRtpParameters) {
989 CreateAudioRtpSender();
990 RtpParameters params = audio_rtp_sender_->GetParameters();
991 EXPECT_EQ(1u, params.encodings.size());
992
Florent Castelli87b3c512018-07-18 16:00:28 +0200993 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 16:02:32 -0700994 params.mid = "dummy_mid";
995 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
996 audio_rtp_sender_->SetParameters(params).type());
997 params = audio_rtp_sender_->GetParameters();
998
Seth Hampson2d2c8882018-05-16 16:02:32 -0700999 DestroyAudioRtpSender();
1000}
1001
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001002TEST_F(RtpSenderReceiverTest, SetAudioMaxSendBitrate) {
1003 CreateAudioRtpSender();
1004
1005 EXPECT_EQ(-1, voice_media_channel_->max_bps());
1006 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001007 EXPECT_EQ(1U, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -08001008 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001009 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -08001010 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001011
1012 // Read back the parameters and verify they have been changed.
1013 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001014 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001015 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001016
1017 // Verify that the audio channel received the new parameters.
1018 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001019 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001020 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001021
1022 // Verify that the global bitrate limit has not been changed.
1023 EXPECT_EQ(-1, voice_media_channel_->max_bps());
1024
1025 DestroyAudioRtpSender();
1026}
1027
Seth Hampson24722b32017-12-22 09:36:42 -08001028TEST_F(RtpSenderReceiverTest, SetAudioBitratePriority) {
1029 CreateAudioRtpSender();
1030
1031 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001032 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001033 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1034 params.encodings[0].bitrate_priority);
1035 double new_bitrate_priority = 2.0;
1036 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -08001037 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -08001038
1039 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001040 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001041 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1042
1043 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001044 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001045 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1046
1047 DestroyAudioRtpSender();
1048}
1049
skvladdc1c62c2016-03-16 19:07:43 -07001050TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) {
1051 CreateVideoRtpSender();
1052
skvladdc1c62c2016-03-16 19:07:43 -07001053 RtpParameters params = video_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001054 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -08001055 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -07001056
1057 DestroyVideoRtpSender();
1058}
1059
Florent Castelli892acf02018-10-01 22:47:20 +02001060TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParametersBeforeNegotiation) {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001061 video_rtp_sender_ =
1062 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +02001063
1064 RtpParameters params = video_rtp_sender_->GetParameters();
1065 ASSERT_EQ(1u, params.encodings.size());
1066 params.encodings[0].max_bitrate_bps = 90000;
1067 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1068
1069 params = video_rtp_sender_->GetParameters();
1070 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1071 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
1072
1073 DestroyVideoRtpSender();
1074}
1075
1076TEST_F(RtpSenderReceiverTest, VideoSenderInitParametersMovedAfterNegotiation) {
1077 AddVideoTrack(false);
1078
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001079 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001080 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001081 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1082 set_streams_observer.get());
Florent Castelli892acf02018-10-01 22:47:20 +02001083 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001084 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1085 video_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli892acf02018-10-01 22:47:20 +02001086
1087 std::vector<RtpEncodingParameters> init_encodings(2);
1088 init_encodings[0].max_bitrate_bps = 60000;
1089 init_encodings[1].max_bitrate_bps = 900000;
1090 video_rtp_sender_->set_init_send_encodings(init_encodings);
1091
1092 RtpParameters params = video_rtp_sender_->GetParameters();
1093 ASSERT_EQ(2u, params.encodings.size());
1094 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1095 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
1096
1097 // Simulate the setLocalDescription call
1098 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +01001099 ssrcs.reserve(2);
Florent Castelli892acf02018-10-01 22:47:20 +02001100 for (int i = 0; i < 2; ++i)
1101 ssrcs.push_back(kVideoSsrcSimulcast + i);
1102 cricket::StreamParams stream_params =
1103 cricket::CreateSimStreamParams("cname", ssrcs);
1104 video_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -08001105 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +02001106 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
1107
1108 params = video_rtp_sender_->GetParameters();
1109 ASSERT_EQ(2u, params.encodings.size());
1110 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1111 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
1112
1113 DestroyVideoRtpSender();
1114}
1115
1116TEST_F(RtpSenderReceiverTest,
1117 VideoSenderInitParametersMovedAfterManualSimulcastAndNegotiation) {
1118 AddVideoTrack(false);
1119
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001120 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001121 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001122 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1123 set_streams_observer.get());
Florent Castelli892acf02018-10-01 22:47:20 +02001124 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001125 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1126 video_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli892acf02018-10-01 22:47:20 +02001127
1128 std::vector<RtpEncodingParameters> init_encodings(1);
1129 init_encodings[0].max_bitrate_bps = 60000;
1130 video_rtp_sender_->set_init_send_encodings(init_encodings);
1131
1132 RtpParameters params = video_rtp_sender_->GetParameters();
1133 ASSERT_EQ(1u, params.encodings.size());
1134 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1135
1136 // Simulate the setLocalDescription call as if the user used SDP munging
1137 // to enable simulcast
1138 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +01001139 ssrcs.reserve(2);
Florent Castelli892acf02018-10-01 22:47:20 +02001140 for (int i = 0; i < 2; ++i)
1141 ssrcs.push_back(kVideoSsrcSimulcast + i);
1142 cricket::StreamParams stream_params =
1143 cricket::CreateSimStreamParams("cname", ssrcs);
1144 video_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -08001145 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +02001146 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
1147
1148 params = video_rtp_sender_->GetParameters();
1149 ASSERT_EQ(2u, params.encodings.size());
1150 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1151
1152 DestroyVideoRtpSender();
1153}
1154
1155TEST_F(RtpSenderReceiverTest,
1156 VideoSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001157 video_rtp_sender_ =
1158 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +02001159
1160 RtpParameters params;
1161 RTCError result = video_rtp_sender_->SetParameters(params);
1162 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1163 DestroyVideoRtpSender();
1164}
1165
Florent Castellicebf50f2018-05-03 15:31:53 +02001166TEST_F(RtpSenderReceiverTest,
1167 VideoSenderMustCallGetParametersBeforeSetParameters) {
1168 CreateVideoRtpSender();
1169
1170 RtpParameters params;
1171 RTCError result = video_rtp_sender_->SetParameters(params);
1172 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1173
1174 DestroyVideoRtpSender();
1175}
1176
1177TEST_F(RtpSenderReceiverTest,
1178 VideoSenderSetParametersInvalidatesTransactionId) {
1179 CreateVideoRtpSender();
1180
1181 RtpParameters params = video_rtp_sender_->GetParameters();
1182 EXPECT_EQ(1u, params.encodings.size());
1183 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1184 RTCError result = video_rtp_sender_->SetParameters(params);
1185 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1186
1187 DestroyVideoRtpSender();
1188}
1189
1190TEST_F(RtpSenderReceiverTest, VideoSenderDetectTransactionIdModification) {
1191 CreateVideoRtpSender();
1192
1193 RtpParameters params = video_rtp_sender_->GetParameters();
1194 params.transaction_id = "";
1195 RTCError result = video_rtp_sender_->SetParameters(params);
1196 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1197
1198 DestroyVideoRtpSender();
1199}
1200
1201TEST_F(RtpSenderReceiverTest, VideoSenderCheckTransactionIdRefresh) {
1202 CreateVideoRtpSender();
1203
1204 RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001205 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 15:31:53 +02001206 auto saved_transaction_id = params.transaction_id;
1207 params = video_rtp_sender_->GetParameters();
1208 EXPECT_NE(saved_transaction_id, params.transaction_id);
1209
1210 DestroyVideoRtpSender();
1211}
1212
1213TEST_F(RtpSenderReceiverTest, VideoSenderSetParametersOldValueFail) {
1214 CreateVideoRtpSender();
1215
1216 RtpParameters params = video_rtp_sender_->GetParameters();
1217 RtpParameters second_params = video_rtp_sender_->GetParameters();
1218
1219 RTCError result = video_rtp_sender_->SetParameters(params);
1220 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1221
1222 DestroyVideoRtpSender();
1223}
1224
Seth Hampson2d2c8882018-05-16 16:02:32 -07001225TEST_F(RtpSenderReceiverTest, VideoSenderCantSetUnimplementedRtpParameters) {
1226 CreateVideoRtpSender();
1227 RtpParameters params = video_rtp_sender_->GetParameters();
1228 EXPECT_EQ(1u, params.encodings.size());
1229
Florent Castelli87b3c512018-07-18 16:00:28 +02001230 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 16:02:32 -07001231 params.mid = "dummy_mid";
1232 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1233 video_rtp_sender_->SetParameters(params).type());
1234 params = video_rtp_sender_->GetParameters();
1235
Seth Hampson2d2c8882018-05-16 16:02:32 -07001236 DestroyVideoRtpSender();
1237}
1238
Florent Castellic1a0bcb2019-01-29 14:26:48 +01001239TEST_F(RtpSenderReceiverTest, VideoSenderCanSetScaleResolutionDownBy) {
1240 CreateVideoRtpSender();
1241
1242 RtpParameters params = video_rtp_sender_->GetParameters();
1243 params.encodings[0].scale_resolution_down_by = 2;
1244
1245 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1246 params = video_rtp_sender_->GetParameters();
1247 EXPECT_EQ(2, params.encodings[0].scale_resolution_down_by);
1248
1249 DestroyVideoRtpSender();
1250}
1251
1252TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidScaleResolutionDownBy) {
1253 CreateVideoRtpSender();
1254
1255 RtpParameters params = video_rtp_sender_->GetParameters();
1256 params.encodings[0].scale_resolution_down_by = 0.5;
1257 RTCError result = video_rtp_sender_->SetParameters(params);
1258 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1259
1260 DestroyVideoRtpSender();
1261}
1262
Ă…sa Perssonfb195962021-08-16 16:41:56 +02001263TEST_F(RtpSenderReceiverTest, VideoSenderCanSetNumTemporalLayers) {
1264 CreateVideoRtpSender();
1265
1266 RtpParameters params = video_rtp_sender_->GetParameters();
1267 params.encodings[0].num_temporal_layers = 2;
1268
1269 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1270 params = video_rtp_sender_->GetParameters();
1271 EXPECT_EQ(2, params.encodings[0].num_temporal_layers);
1272
1273 DestroyVideoRtpSender();
1274}
1275
1276TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidNumTemporalLayers) {
1277 CreateVideoRtpSender();
1278
1279 RtpParameters params = video_rtp_sender_->GetParameters();
1280 params.encodings[0].num_temporal_layers = webrtc::kMaxTemporalStreams + 1;
1281 RTCError result = video_rtp_sender_->SetParameters(params);
1282 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1283
1284 DestroyVideoRtpSender();
1285}
1286
Florent Castelli907dc802019-12-06 15:03:19 +01001287TEST_F(RtpSenderReceiverTest, VideoSenderCanSetMaxFramerate) {
1288 CreateVideoRtpSender();
1289
1290 RtpParameters params = video_rtp_sender_->GetParameters();
1291 params.encodings[0].max_framerate = 20;
1292
1293 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1294 params = video_rtp_sender_->GetParameters();
1295 EXPECT_EQ(20., params.encodings[0].max_framerate);
1296
1297 DestroyVideoRtpSender();
1298}
1299
1300TEST_F(RtpSenderReceiverTest, VideoSenderCanSetMaxFramerateZero) {
1301 CreateVideoRtpSender();
1302
1303 RtpParameters params = video_rtp_sender_->GetParameters();
1304 params.encodings[0].max_framerate = 0.;
1305
1306 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1307 params = video_rtp_sender_->GetParameters();
1308 EXPECT_EQ(0., params.encodings[0].max_framerate);
1309
1310 DestroyVideoRtpSender();
1311}
1312
1313TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidMaxFramerate) {
1314 CreateVideoRtpSender();
1315
1316 RtpParameters params = video_rtp_sender_->GetParameters();
1317 params.encodings[0].max_framerate = -5.;
1318 RTCError result = video_rtp_sender_->SetParameters(params);
1319 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1320
1321 DestroyVideoRtpSender();
1322}
1323
Seth Hampson2d2c8882018-05-16 16:02:32 -07001324// A video sender can have multiple simulcast layers, in which case it will
1325// contain multiple RtpEncodingParameters. This tests that if this is the case
1326// (simulcast), then we can't set the bitrate_priority, or max_bitrate_bps
1327// for any encodings besides at index 0, because these are both implemented
1328// "per-sender."
1329TEST_F(RtpSenderReceiverTest, VideoSenderCantSetPerSenderEncodingParameters) {
1330 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001331 CreateVideoRtpSenderWithSimulcast();
Seth Hampson2d2c8882018-05-16 16:02:32 -07001332 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001333 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Seth Hampson2d2c8882018-05-16 16:02:32 -07001334
1335 params.encodings[1].bitrate_priority = 2.0;
1336 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1337 video_rtp_sender_->SetParameters(params).type());
1338 params = video_rtp_sender_->GetParameters();
1339
Seth Hampson2d2c8882018-05-16 16:02:32 -07001340 DestroyVideoRtpSender();
1341}
1342
Florent Castelli892acf02018-10-01 22:47:20 +02001343TEST_F(RtpSenderReceiverTest, VideoSenderCantSetReadOnlyEncodingParameters) {
1344 // Add a simulcast specific send stream that contains 2 encoding parameters.
1345 CreateVideoRtpSenderWithSimulcast();
1346 RtpParameters params = video_rtp_sender_->GetParameters();
1347 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
1348
1349 for (size_t i = 0; i < params.encodings.size(); i++) {
1350 params.encodings[i].ssrc = 1337;
1351 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION,
1352 video_rtp_sender_->SetParameters(params).type());
1353 params = video_rtp_sender_->GetParameters();
1354 }
1355
1356 DestroyVideoRtpSender();
1357}
1358
Ă…sa Persson55659812018-06-18 17:51:32 +02001359TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrate) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001360 CreateVideoRtpSender();
1361
1362 EXPECT_EQ(-1, video_media_channel_->max_bps());
1363 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001364 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001365 EXPECT_FALSE(params.encodings[0].min_bitrate_bps);
deadbeefe702b302017-02-04 12:09:01 -08001366 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Ă…sa Persson55659812018-06-18 17:51:32 +02001367 params.encodings[0].min_bitrate_bps = 100;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001368 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -08001369 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001370
1371 // Read back the parameters and verify they have been changed.
1372 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001373 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001374 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001375 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001376
1377 // Verify that the video channel received the new parameters.
1378 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001379 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001380 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001381 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001382
1383 // Verify that the global bitrate limit has not been changed.
1384 EXPECT_EQ(-1, video_media_channel_->max_bps());
1385
1386 DestroyVideoRtpSender();
1387}
1388
Ă…sa Persson55659812018-06-18 17:51:32 +02001389TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrateSimulcast) {
1390 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001391 CreateVideoRtpSenderWithSimulcast();
Ă…sa Persson55659812018-06-18 17:51:32 +02001392
1393 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001394 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001395 params.encodings[0].min_bitrate_bps = 100;
1396 params.encodings[0].max_bitrate_bps = 1000;
1397 params.encodings[1].min_bitrate_bps = 200;
1398 params.encodings[1].max_bitrate_bps = 2000;
1399 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1400
1401 // Verify that the video channel received the new parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001402 params = video_media_channel_->GetRtpSendParameters(kVideoSsrcSimulcast);
1403 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001404 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
1405 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
1406 EXPECT_EQ(200, params.encodings[1].min_bitrate_bps);
1407 EXPECT_EQ(2000, params.encodings[1].max_bitrate_bps);
1408
1409 DestroyVideoRtpSender();
1410}
1411
Seth Hampson24722b32017-12-22 09:36:42 -08001412TEST_F(RtpSenderReceiverTest, SetVideoBitratePriority) {
1413 CreateVideoRtpSender();
1414
1415 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001416 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001417 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1418 params.encodings[0].bitrate_priority);
1419 double new_bitrate_priority = 2.0;
1420 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -08001421 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -08001422
1423 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001424 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001425 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1426
1427 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001428 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001429 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1430
1431 DestroyVideoRtpSender();
1432}
1433
Florent Castelli38332cd2018-11-20 14:08:06 +01001434TEST_F(RtpSenderReceiverTest, VideoReceiverCanGetParametersWithSimulcast) {
1435 CreateVideoRtpReceiverWithSimulcast({}, 2);
1436
1437 RtpParameters params = video_rtp_receiver_->GetParameters();
1438 EXPECT_EQ(2u, params.encodings.size());
1439
1440 DestroyVideoRtpReceiver();
1441}
1442
pbos5214a0a2016-12-16 15:39:11 -08001443// Test that makes sure that a video track content hint translates to the proper
1444// value for sources that are not screencast.
1445TEST_F(RtpSenderReceiverTest, PropagatesVideoTrackContentHint) {
1446 CreateVideoRtpSender();
1447
1448 video_track_->set_enabled(true);
1449
Artem Titov880fa812021-07-30 22:30:23 +02001450 // `video_track_` is not screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001451 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001452 // No content hint should be set by default.
1453 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1454 video_track_->content_hint());
1455 // Setting detailed should turn a non-screencast source into screencast mode.
1456 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001457 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001458 // Removing the content hint should turn the track back into non-screencast
1459 // mode.
1460 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001461 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001462 // Setting fluid should remain in non-screencast mode (its default).
1463 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001464 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 08:53:10 +02001465 // Setting text should have the same effect as Detailed
1466 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
1467 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001468
1469 DestroyVideoRtpSender();
1470}
1471
1472// Test that makes sure that a video track content hint translates to the proper
1473// value for screencast sources.
1474TEST_F(RtpSenderReceiverTest,
1475 PropagatesVideoTrackContentHintForScreencastSource) {
1476 CreateVideoRtpSender(true);
1477
1478 video_track_->set_enabled(true);
1479
Artem Titov880fa812021-07-30 22:30:23 +02001480 // `video_track_` with a screencast source should be screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001481 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001482 // No content hint should be set by default.
1483 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1484 video_track_->content_hint());
1485 // Setting fluid should turn a screencast source into non-screencast mode.
1486 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001487 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001488 // Removing the content hint should turn the track back into screencast mode.
1489 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001490 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001491 // Setting detailed should still remain in screencast mode (its default).
1492 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001493 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 08:53:10 +02001494 // Setting text should have the same effect as Detailed
1495 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
1496 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001497
1498 DestroyVideoRtpSender();
1499}
1500
1501// Test that makes sure any content hints that are set on a track before
1502// VideoRtpSender is ready to send are still applied when it gets ready to send.
1503TEST_F(RtpSenderReceiverTest,
1504 PropagatesVideoTrackContentHintSetBeforeEnabling) {
1505 AddVideoTrack();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001506 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001507 std::make_unique<MockSetStreamsObserver>();
pbos5214a0a2016-12-16 15:39:11 -08001508 // Setting detailed overrides the default non-screencast mode. This should be
1509 // applied even if the track is set on construction.
1510 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001511 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1512 set_streams_observer.get());
Steve Anton111fdfd2018-06-25 13:03:36 -07001513 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001514 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1515 video_rtp_sender_->SetStreams({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -08001516 video_rtp_sender_->SetMediaChannel(video_media_channel_);
pbos5214a0a2016-12-16 15:39:11 -08001517 video_track_->set_enabled(true);
1518
1519 // Sender is not ready to send (no SSRC) so no option should have been set.
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001520 EXPECT_EQ(absl::nullopt, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001521
1522 // Verify that the content hint is accounted for when video_rtp_sender_ does
1523 // get enabled.
1524 video_rtp_sender_->SetSsrc(kVideoSsrc);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001525 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001526
1527 // And removing the hint should go back to false (to verify that false was
1528 // default correctly).
1529 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001530 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001531
1532 DestroyVideoRtpSender();
1533}
1534
deadbeef20cb0c12017-02-01 20:27:00 -08001535TEST_F(RtpSenderReceiverTest, AudioSenderHasDtmfSender) {
1536 CreateAudioRtpSender();
1537 EXPECT_NE(nullptr, audio_rtp_sender_->GetDtmfSender());
1538}
1539
1540TEST_F(RtpSenderReceiverTest, VideoSenderDoesNotHaveDtmfSender) {
1541 CreateVideoRtpSender();
1542 EXPECT_EQ(nullptr, video_rtp_sender_->GetDtmfSender());
1543}
1544
Artem Titov880fa812021-07-30 22:30:23 +02001545// Test that the DTMF sender is really using `voice_channel_`, and thus returns
1546// true/false from CanSendDtmf based on what `voice_channel_` returns.
deadbeef20cb0c12017-02-01 20:27:00 -08001547TEST_F(RtpSenderReceiverTest, CanInsertDtmf) {
1548 AddDtmfCodec();
1549 CreateAudioRtpSender();
1550 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1551 ASSERT_NE(nullptr, dtmf_sender);
1552 EXPECT_TRUE(dtmf_sender->CanInsertDtmf());
1553}
1554
1555TEST_F(RtpSenderReceiverTest, CanNotInsertDtmf) {
1556 CreateAudioRtpSender();
1557 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1558 ASSERT_NE(nullptr, dtmf_sender);
1559 // DTMF codec has not been added, as it was in the above test.
1560 EXPECT_FALSE(dtmf_sender->CanInsertDtmf());
1561}
1562
1563TEST_F(RtpSenderReceiverTest, InsertDtmf) {
1564 AddDtmfCodec();
1565 CreateAudioRtpSender();
1566 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1567 ASSERT_NE(nullptr, dtmf_sender);
1568
1569 EXPECT_EQ(0U, voice_media_channel_->dtmf_info_queue().size());
1570
1571 // Insert DTMF
1572 const int expected_duration = 90;
1573 dtmf_sender->InsertDtmf("012", expected_duration, 100);
1574
1575 // Verify
1576 ASSERT_EQ_WAIT(3U, voice_media_channel_->dtmf_info_queue().size(),
1577 kDefaultTimeout);
1578 const uint32_t send_ssrc =
1579 voice_media_channel_->send_streams()[0].first_ssrc();
1580 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[0],
1581 send_ssrc, 0, expected_duration));
1582 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[1],
1583 send_ssrc, 1, expected_duration));
1584 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[2],
1585 send_ssrc, 2, expected_duration));
1586}
1587
1588// Make sure the signal from "GetOnDestroyedSignal()" fires when the sender is
1589// destroyed, which is needed for the DTMF sender.
1590TEST_F(RtpSenderReceiverTest, TestOnDestroyedSignal) {
1591 CreateAudioRtpSender();
1592 EXPECT_FALSE(audio_sender_destroyed_signal_fired_);
1593 audio_rtp_sender_ = nullptr;
1594 EXPECT_TRUE(audio_sender_destroyed_signal_fired_);
1595}
1596
Benjamin Wright84583f62018-10-04 14:22:34 -07001597// Validate that the default FrameEncryptor setting is nullptr.
1598TEST_F(RtpSenderReceiverTest, AudioSenderCanSetFrameEncryptor) {
1599 CreateAudioRtpSender();
1600 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1601 new FakeFrameEncryptor());
1602 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1603 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1604 EXPECT_EQ(fake_frame_encryptor.get(),
1605 audio_rtp_sender_->GetFrameEncryptor().get());
1606}
1607
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001608// Validate that setting a FrameEncryptor after the send stream is stopped does
1609// nothing.
1610TEST_F(RtpSenderReceiverTest, AudioSenderCannotSetFrameEncryptorAfterStop) {
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_->Stop();
1616 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1617 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1618}
1619
Benjamin Wright84583f62018-10-04 14:22:34 -07001620// Validate that the default FrameEncryptor setting is nullptr.
1621TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetFrameDecryptor) {
1622 CreateAudioRtpReceiver();
1623 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1624 new FakeFrameDecryptor());
1625 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
1626 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1627 EXPECT_EQ(fake_frame_decryptor.get(),
1628 audio_rtp_receiver_->GetFrameDecryptor().get());
Tommi4ccdf932021-05-17 14:50:10 +02001629 DestroyAudioRtpReceiver();
Benjamin Wright84583f62018-10-04 14:22:34 -07001630}
1631
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001632// Validate that the default FrameEncryptor setting is nullptr.
1633TEST_F(RtpSenderReceiverTest, AudioReceiverCannotSetFrameDecryptorAfterStop) {
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_->Stop();
1639 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1640 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
Tommi4ccdf932021-05-17 14:50:10 +02001641 DestroyAudioRtpReceiver();
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001642}
1643
1644// Validate that the default FrameEncryptor setting is nullptr.
1645TEST_F(RtpSenderReceiverTest, VideoSenderCanSetFrameEncryptor) {
1646 CreateVideoRtpSender();
1647 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1648 new FakeFrameEncryptor());
1649 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1650 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1651 EXPECT_EQ(fake_frame_encryptor.get(),
1652 video_rtp_sender_->GetFrameEncryptor().get());
1653}
1654
1655// Validate that setting a FrameEncryptor after the send stream is stopped does
1656// nothing.
1657TEST_F(RtpSenderReceiverTest, VideoSenderCannotSetFrameEncryptorAfterStop) {
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_->Stop();
1663 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1664 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1665}
1666
1667// Validate that the default FrameEncryptor setting is nullptr.
1668TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetFrameDecryptor) {
1669 CreateVideoRtpReceiver();
1670 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1671 new FakeFrameDecryptor());
1672 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
1673 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1674 EXPECT_EQ(fake_frame_decryptor.get(),
1675 video_rtp_receiver_->GetFrameDecryptor().get());
Tommi4ccdf932021-05-17 14:50:10 +02001676 DestroyVideoRtpReceiver();
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001677}
1678
1679// Validate that the default FrameEncryptor setting is nullptr.
1680TEST_F(RtpSenderReceiverTest, VideoReceiverCannotSetFrameDecryptorAfterStop) {
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_->Stop();
1686 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1687 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
Tommi4ccdf932021-05-17 14:50:10 +02001688 DestroyVideoRtpReceiver();
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001689}
1690
Amit Hilbuch619b2942019-02-26 15:55:19 -08001691// Checks that calling the internal methods for get/set parameters do not
1692// invalidate any parameters retreived by clients.
1693TEST_F(RtpSenderReceiverTest,
1694 InternalParameterMethodsDoNotInvalidateTransaction) {
1695 CreateVideoRtpSender();
1696 RtpParameters parameters = video_rtp_sender_->GetParameters();
1697 RtpParameters new_parameters = video_rtp_sender_->GetParametersInternal();
1698 new_parameters.encodings[0].active = false;
1699 video_rtp_sender_->SetParametersInternal(new_parameters);
1700 new_parameters.encodings[0].active = true;
1701 video_rtp_sender_->SetParametersInternal(new_parameters);
1702 parameters.encodings[0].active = false;
1703 EXPECT_TRUE(video_rtp_sender_->SetParameters(parameters).ok());
1704}
1705
Amit Hilbuch2297d332019-02-19 12:49:22 -08001706// Helper method for syntactic sugar for accepting a vector with '{}' notation.
1707std::pair<RidList, RidList> CreatePairOfRidVectors(
1708 const std::vector<std::string>& first,
1709 const std::vector<std::string>& second) {
1710 return std::make_pair(first, second);
1711}
1712
1713// These parameters are used to test disabling simulcast layers.
1714const std::pair<RidList, RidList> kDisableSimulcastLayersParameters[] = {
1715 // Tests removing the first layer. This is a special case because
1716 // the first layer's SSRC is also the 'primary' SSRC used to associate the
1717 // parameters to the media channel.
1718 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"1"}),
1719 // Tests removing some layers.
1720 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"2", "4"}),
1721 // Tests simulcast rejected scenario all layers except first are rejected.
1722 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"2", "3", "4"}),
1723 // Tests removing all layers.
1724 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"1", "2", "3", "4"}),
1725};
1726
1727// Runs test for disabling layers on a sender without a media engine set.
1728TEST_P(RtpSenderReceiverTest, DisableSimulcastLayersWithoutMediaEngine) {
1729 auto parameter = GetParam();
1730 RunDisableSimulcastLayersWithoutMediaEngineTest(parameter.first,
1731 parameter.second);
1732}
1733
1734// Runs test for disabling layers on a sender with a media engine set.
1735TEST_P(RtpSenderReceiverTest, DisableSimulcastLayersWithMediaEngine) {
1736 auto parameter = GetParam();
1737 RunDisableSimulcastLayersWithMediaEngineTest(parameter.first,
1738 parameter.second);
1739}
1740
1741INSTANTIATE_TEST_SUITE_P(
1742 DisableSimulcastLayersInSender,
1743 RtpSenderReceiverTest,
1744 ::testing::ValuesIn(kDisableSimulcastLayersParameters));
1745
deadbeef70ab1a12015-09-28 16:53:55 -07001746} // namespace webrtc