blob: d947b8b3e97595db6f1f0f879faee6c1de7d58c4 [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(
Tomas Gunnarsson5411b172022-01-24 08:45:26 +0100125 &fake_call_, cricket::MediaConfig(), cricket::CN_AUDIO, srtp_required,
126 webrtc::CryptoOptions(), cricket::AudioOptions());
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200127 video_channel_ = channel_manager_->CreateVideoChannel(
Tomas Gunnarsson5411b172022-01-24 08:45:26 +0100128 &fake_call_, cricket::MediaConfig(), cricket::CN_VIDEO, srtp_required,
129 webrtc::CryptoOptions(), cricket::VideoOptions(),
Niels Möller2a707032020-06-16 16:39:13 +0200130 video_bitrate_allocator_factory_.get());
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +0100131
132 voice_channel_->SetRtpTransport(rtp_transport_.get());
133 video_channel_->SetRtpTransport(rtp_transport_.get());
134
deadbeef20cb0c12017-02-01 20:27:00 -0800135 voice_channel_->Enable(true);
136 video_channel_->Enable(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700137 voice_media_channel_ = media_engine_->GetVoiceChannel(0);
138 video_media_channel_ = media_engine_->GetVideoChannel(0);
139 RTC_CHECK(voice_channel_);
140 RTC_CHECK(video_channel_);
141 RTC_CHECK(voice_media_channel_);
142 RTC_CHECK(video_media_channel_);
143
144 // Create streams for predefined SSRCs. Streams need to exist in order
145 // for the senders and receievers to apply parameters to them.
146 // Normally these would be created by SetLocalDescription and
147 // SetRemoteDescription.
148 voice_media_channel_->AddSendStream(
149 cricket::StreamParams::CreateLegacy(kAudioSsrc));
150 voice_media_channel_->AddRecvStream(
151 cricket::StreamParams::CreateLegacy(kAudioSsrc));
152 voice_media_channel_->AddSendStream(
153 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
154 voice_media_channel_->AddRecvStream(
155 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
156 video_media_channel_->AddSendStream(
157 cricket::StreamParams::CreateLegacy(kVideoSsrc));
158 video_media_channel_->AddRecvStream(
159 cricket::StreamParams::CreateLegacy(kVideoSsrc));
160 video_media_channel_->AddSendStream(
161 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
162 video_media_channel_->AddRecvStream(
163 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
tkchin3784b4a2016-06-24 19:31:47 -0700164 }
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700165
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200166 ~RtpSenderReceiverTest() {
167 audio_rtp_sender_ = nullptr;
168 video_rtp_sender_ = nullptr;
169 audio_rtp_receiver_ = nullptr;
170 video_rtp_receiver_ = nullptr;
171 local_stream_ = nullptr;
172 video_track_ = nullptr;
173 audio_track_ = nullptr;
Tomas Gunnarsson2e85b5f2022-01-15 14:04:27 +0100174
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +0100175 voice_channel_->SetRtpTransport(nullptr);
176 video_channel_->SetRtpTransport(nullptr);
177
Tomas Gunnarsson5411b172022-01-24 08:45:26 +0100178 channel_manager_->DestroyChannel(voice_channel_);
179 channel_manager_->DestroyChannel(video_channel_);
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200180 }
181
Zhi Huange830e682018-03-30 10:48:35 -0700182 std::unique_ptr<webrtc::RtpTransportInternal> CreateDtlsSrtpTransport() {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200183 auto dtls_srtp_transport = std::make_unique<webrtc::DtlsSrtpTransport>(
Karl Wiberg918f50c2018-07-05 11:40:33 +0200184 /*rtcp_mux_required=*/true);
Zhi Huange830e682018-03-30 10:48:35 -0700185 dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport_.get(),
186 /*rtcp_dtls_transport=*/nullptr);
187 return dtls_srtp_transport;
188 }
189
deadbeef20cb0c12017-02-01 20:27:00 -0800190 // Needed to use DTMF sender.
191 void AddDtmfCodec() {
192 cricket::AudioSendParameters params;
193 const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000,
194 0, 1);
195 params.codecs.push_back(kTelephoneEventCodec);
196 voice_media_channel_->SetSendParameters(params);
197 }
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700198
pbos5214a0a2016-12-16 15:39:11 -0800199 void AddVideoTrack() { AddVideoTrack(false); }
200
201 void AddVideoTrack(bool is_screencast) {
perkja3ede6c2016-03-08 01:27:48 +0100202 rtc::scoped_refptr<VideoTrackSourceInterface> source(
pbos5214a0a2016-12-16 15:39:11 -0800203 FakeVideoTrackSource::Create(is_screencast));
perkj773be362017-07-31 23:22:01 -0700204 video_track_ =
205 VideoTrack::Create(kVideoTrackId, source, rtc::Thread::Current());
deadbeefe814a0d2017-02-25 18:15:09 -0800206 EXPECT_TRUE(local_stream_->AddTrack(video_track_));
deadbeef70ab1a12015-09-28 16:53:55 -0700207 }
208
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700209 void CreateAudioRtpSender() { CreateAudioRtpSender(nullptr); }
210
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +0100211 void CreateAudioRtpSender(
212 const rtc::scoped_refptr<LocalAudioSource>& source) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700213 audio_track_ = AudioTrack::Create(kAudioTrackId, source);
deadbeefe814a0d2017-02-25 18:15:09 -0800214 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200215 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200216 std::make_unique<MockSetStreamsObserver>();
Steve Anton47136dd2018-01-12 10:49:35 -0800217 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200218 AudioRtpSender::Create(worker_thread_, audio_track_->id(), nullptr,
219 set_streams_observer.get());
Steve Anton111fdfd2018-06-25 13:03:36 -0700220 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200221 EXPECT_CALL(*set_streams_observer, OnSetStreams());
222 audio_rtp_sender_->SetStreams({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800223 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
deadbeeffac06552015-11-25 11:26:01 -0800224 audio_rtp_sender_->SetSsrc(kAudioSsrc);
deadbeef20cb0c12017-02-01 20:27:00 -0800225 audio_rtp_sender_->GetOnDestroyedSignal()->connect(
226 this, &RtpSenderReceiverTest::OnAudioSenderDestroyed);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700227 VerifyVoiceChannelInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700228 }
229
Steve Anton02ee47c2018-01-10 16:26:06 -0800230 void CreateAudioRtpSenderWithNoTrack() {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800231 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200232 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800233 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
Steve Anton02ee47c2018-01-10 16:26:06 -0800234 }
235
deadbeef20cb0c12017-02-01 20:27:00 -0800236 void OnAudioSenderDestroyed() { audio_sender_destroyed_signal_fired_ = true; }
237
Seth Hampson2d2c8882018-05-16 16:02:32 -0700238 void CreateVideoRtpSender(uint32_t ssrc) {
239 CreateVideoRtpSender(false, ssrc);
240 }
241
pbos5214a0a2016-12-16 15:39:11 -0800242 void CreateVideoRtpSender() { CreateVideoRtpSender(false); }
243
Amit Hilbuch2297d332019-02-19 12:49:22 -0800244 cricket::StreamParams CreateSimulcastStreamParams(int num_layers) {
Florent Castelli892acf02018-10-01 22:47:20 +0200245 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +0100246 ssrcs.reserve(num_layers);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800247 for (int i = 0; i < num_layers; ++i) {
Florent Castelli892acf02018-10-01 22:47:20 +0200248 ssrcs.push_back(kVideoSsrcSimulcast + i);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800249 }
250 return cricket::CreateSimStreamParams("cname", ssrcs);
251 }
252
253 uint32_t CreateVideoRtpSender(const cricket::StreamParams& stream_params) {
Florent Castelli892acf02018-10-01 22:47:20 +0200254 video_media_channel_->AddSendStream(stream_params);
255 uint32_t primary_ssrc = stream_params.first_ssrc();
256 CreateVideoRtpSender(primary_ssrc);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800257 return primary_ssrc;
258 }
259
260 uint32_t CreateVideoRtpSenderWithSimulcast(
261 int num_layers = kVideoSimulcastLayerCount) {
262 return CreateVideoRtpSender(CreateSimulcastStreamParams(num_layers));
263 }
264
265 uint32_t CreateVideoRtpSenderWithSimulcast(
266 const std::vector<std::string>& rids) {
267 cricket::StreamParams stream_params =
268 CreateSimulcastStreamParams(rids.size());
269 std::vector<cricket::RidDescription> rid_descriptions;
270 absl::c_transform(
271 rids, std::back_inserter(rid_descriptions), [](const std::string& rid) {
272 return cricket::RidDescription(rid, cricket::RidDirection::kSend);
273 });
274 stream_params.set_rids(rid_descriptions);
275 return CreateVideoRtpSender(stream_params);
Florent Castelli892acf02018-10-01 22:47:20 +0200276 }
277
Seth Hampson2d2c8882018-05-16 16:02:32 -0700278 void CreateVideoRtpSender(bool is_screencast, uint32_t ssrc = kVideoSsrc) {
pbos5214a0a2016-12-16 15:39:11 -0800279 AddVideoTrack(is_screencast);
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200280 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200281 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200282 video_rtp_sender_ = VideoRtpSender::Create(
283 worker_thread_, video_track_->id(), set_streams_observer.get());
Steve Anton111fdfd2018-06-25 13:03:36 -0700284 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200285 EXPECT_CALL(*set_streams_observer, OnSetStreams());
286 video_rtp_sender_->SetStreams({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800287 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Seth Hampson2d2c8882018-05-16 16:02:32 -0700288 video_rtp_sender_->SetSsrc(ssrc);
289 VerifyVideoChannelInput(ssrc);
deadbeef70ab1a12015-09-28 16:53:55 -0700290 }
Steve Anton02ee47c2018-01-10 16:26:06 -0800291 void CreateVideoRtpSenderWithNoTrack() {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200292 video_rtp_sender_ =
293 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800294 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Steve Anton02ee47c2018-01-10 16:26:06 -0800295 }
296
deadbeef70ab1a12015-09-28 16:53:55 -0700297 void DestroyAudioRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700298 audio_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700299 VerifyVoiceChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700300 }
301
302 void DestroyVideoRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700303 video_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700304 VerifyVideoChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700305 }
306
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100307 void CreateAudioRtpReceiver(
308 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
Tommi4ccdf932021-05-17 14:50:10 +0200309 audio_rtp_receiver_ = rtc::make_ref_counted<AudioRtpReceiver>(
310 rtc::Thread::Current(), kAudioTrackId, streams,
311 /*is_unified_plan=*/true);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800312 audio_rtp_receiver_->SetMediaChannel(voice_media_channel_);
Steve Antond3679212018-01-17 17:41:02 -0800313 audio_rtp_receiver_->SetupMediaChannel(kAudioSsrc);
perkjd61bf802016-03-24 03:16:19 -0700314 audio_track_ = audio_rtp_receiver_->audio_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700315 VerifyVoiceChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700316 }
317
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100318 void CreateVideoRtpReceiver(
319 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
Tommi4ccdf932021-05-17 14:50:10 +0200320 video_rtp_receiver_ = rtc::make_ref_counted<VideoRtpReceiver>(
321 rtc::Thread::Current(), kVideoTrackId, streams);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800322 video_rtp_receiver_->SetMediaChannel(video_media_channel_);
Steve Antond3679212018-01-17 17:41:02 -0800323 video_rtp_receiver_->SetupMediaChannel(kVideoSsrc);
perkjf0dcfe22016-03-10 18:32:00 +0100324 video_track_ = video_rtp_receiver_->video_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700325 VerifyVideoChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700326 }
327
Florent Castelli38332cd2018-11-20 14:08:06 +0100328 void CreateVideoRtpReceiverWithSimulcast(
329 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {},
330 int num_layers = kVideoSimulcastLayerCount) {
331 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +0100332 ssrcs.reserve(num_layers);
Florent Castelli38332cd2018-11-20 14:08:06 +0100333 for (int i = 0; i < num_layers; ++i)
334 ssrcs.push_back(kVideoSsrcSimulcast + i);
335 cricket::StreamParams stream_params =
336 cricket::CreateSimStreamParams("cname", ssrcs);
337 video_media_channel_->AddRecvStream(stream_params);
338 uint32_t primary_ssrc = stream_params.first_ssrc();
339
Tommi4ccdf932021-05-17 14:50:10 +0200340 video_rtp_receiver_ = rtc::make_ref_counted<VideoRtpReceiver>(
341 rtc::Thread::Current(), kVideoTrackId, streams);
Florent Castelli38332cd2018-11-20 14:08:06 +0100342 video_rtp_receiver_->SetMediaChannel(video_media_channel_);
343 video_rtp_receiver_->SetupMediaChannel(primary_ssrc);
344 video_track_ = video_rtp_receiver_->video_track();
345 }
346
deadbeef70ab1a12015-09-28 16:53:55 -0700347 void DestroyAudioRtpReceiver() {
Tommi4ccdf932021-05-17 14:50:10 +0200348 if (!audio_rtp_receiver_)
349 return;
Tommi6589def2022-02-17 23:36:47 +0100350 audio_rtp_receiver_->SetMediaChannel(nullptr);
deadbeef70ab1a12015-09-28 16:53:55 -0700351 audio_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700352 VerifyVoiceChannelNoOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700353 }
354
355 void DestroyVideoRtpReceiver() {
Tommi4ccdf932021-05-17 14:50:10 +0200356 if (!video_rtp_receiver_)
357 return;
358 video_rtp_receiver_->Stop();
Tommi6589def2022-02-17 23:36:47 +0100359 video_rtp_receiver_->SetMediaChannel(nullptr);
deadbeef70ab1a12015-09-28 16:53:55 -0700360 video_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700361 VerifyVideoChannelNoOutput();
362 }
363
364 void VerifyVoiceChannelInput() { VerifyVoiceChannelInput(kAudioSsrc); }
365
366 void VerifyVoiceChannelInput(uint32_t ssrc) {
367 // Verify that the media channel has an audio source, and the stream isn't
368 // muted.
369 EXPECT_TRUE(voice_media_channel_->HasSource(ssrc));
370 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(ssrc));
371 }
372
373 void VerifyVideoChannelInput() { VerifyVideoChannelInput(kVideoSsrc); }
374
375 void VerifyVideoChannelInput(uint32_t ssrc) {
376 // Verify that the media channel has a video source,
377 EXPECT_TRUE(video_media_channel_->HasSource(ssrc));
378 }
379
380 void VerifyVoiceChannelNoInput() { VerifyVoiceChannelNoInput(kAudioSsrc); }
381
382 void VerifyVoiceChannelNoInput(uint32_t ssrc) {
383 // Verify that the media channel's source is reset.
384 EXPECT_FALSE(voice_media_channel_->HasSource(ssrc));
385 }
386
387 void VerifyVideoChannelNoInput() { VerifyVideoChannelNoInput(kVideoSsrc); }
388
389 void VerifyVideoChannelNoInput(uint32_t ssrc) {
390 // Verify that the media channel's source is reset.
391 EXPECT_FALSE(video_media_channel_->HasSource(ssrc));
392 }
393
394 void VerifyVoiceChannelOutput() {
395 // Verify that the volume is initialized to 1.
396 double volume;
397 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
398 EXPECT_EQ(1, volume);
399 }
400
401 void VerifyVideoChannelOutput() {
402 // Verify that the media channel has a sink.
403 EXPECT_TRUE(video_media_channel_->HasSink(kVideoSsrc));
404 }
405
406 void VerifyVoiceChannelNoOutput() {
407 // Verify that the volume is reset to 0.
408 double volume;
409 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
410 EXPECT_EQ(0, volume);
411 }
412
413 void VerifyVideoChannelNoOutput() {
414 // Verify that the media channel's sink is reset.
415 EXPECT_FALSE(video_media_channel_->HasSink(kVideoSsrc));
deadbeef70ab1a12015-09-28 16:53:55 -0700416 }
417
Amit Hilbuch2297d332019-02-19 12:49:22 -0800418 // Verifies that the encoding layers contain the specified RIDs.
419 bool VerifyEncodingLayers(const VideoRtpSender& sender,
420 const std::vector<std::string>& rids) {
421 bool has_failure = HasFailure();
422 RtpParameters parameters = sender.GetParameters();
423 std::vector<std::string> encoding_rids;
424 absl::c_transform(
425 parameters.encodings, std::back_inserter(encoding_rids),
426 [](const RtpEncodingParameters& encoding) { return encoding.rid; });
427 EXPECT_THAT(rids, ContainerEq(encoding_rids));
428 return has_failure || !HasFailure();
429 }
430
431 // Runs a test for disabling the encoding layers on the specified sender.
432 void RunDisableEncodingLayersTest(
433 const std::vector<std::string>& all_layers,
434 const std::vector<std::string>& disabled_layers,
435 VideoRtpSender* sender) {
436 std::vector<std::string> expected;
437 absl::c_copy_if(all_layers, std::back_inserter(expected),
438 [&disabled_layers](const std::string& rid) {
439 return !absl::c_linear_search(disabled_layers, rid);
440 });
441
442 EXPECT_TRUE(VerifyEncodingLayers(*sender, all_layers));
443 sender->DisableEncodingLayers(disabled_layers);
444 EXPECT_TRUE(VerifyEncodingLayers(*sender, expected));
445 }
446
447 // Runs a test for setting an encoding layer as inactive.
448 // This test assumes that some layers have already been disabled.
449 void RunSetLastLayerAsInactiveTest(VideoRtpSender* sender) {
450 auto parameters = sender->GetParameters();
451 if (parameters.encodings.size() == 0) {
452 return;
453 }
454
455 RtpEncodingParameters& encoding = parameters.encodings.back();
456 auto rid = encoding.rid;
457 EXPECT_TRUE(encoding.active);
458 encoding.active = false;
459 auto error = sender->SetParameters(parameters);
460 ASSERT_TRUE(error.ok());
461 parameters = sender->GetParameters();
462 RtpEncodingParameters& result_encoding = parameters.encodings.back();
463 EXPECT_EQ(rid, result_encoding.rid);
464 EXPECT_FALSE(result_encoding.active);
465 }
466
467 // Runs a test for disabling the encoding layers on a sender without a media
468 // channel.
469 void RunDisableSimulcastLayersWithoutMediaEngineTest(
470 const std::vector<std::string>& all_layers,
471 const std::vector<std::string>& disabled_layers) {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200472 auto sender = VideoRtpSender::Create(rtc::Thread::Current(), "1", nullptr);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800473 RtpParameters parameters;
474 parameters.encodings.resize(all_layers.size());
475 for (size_t i = 0; i < all_layers.size(); ++i) {
476 parameters.encodings[i].rid = all_layers[i];
477 }
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800478 sender->set_init_send_encodings(parameters.encodings);
479 RunDisableEncodingLayersTest(all_layers, disabled_layers, sender.get());
480 RunSetLastLayerAsInactiveTest(sender.get());
Amit Hilbuch2297d332019-02-19 12:49:22 -0800481 }
482
483 // Runs a test for disabling the encoding layers on a sender with a media
484 // channel.
485 void RunDisableSimulcastLayersWithMediaEngineTest(
486 const std::vector<std::string>& all_layers,
487 const std::vector<std::string>& disabled_layers) {
488 uint32_t ssrc = CreateVideoRtpSenderWithSimulcast(all_layers);
489 RunDisableEncodingLayersTest(all_layers, disabled_layers,
490 video_rtp_sender_.get());
491
492 auto channel_parameters = video_media_channel_->GetRtpSendParameters(ssrc);
493 ASSERT_EQ(channel_parameters.encodings.size(), all_layers.size());
494 for (size_t i = 0; i < all_layers.size(); ++i) {
495 EXPECT_EQ(all_layers[i], channel_parameters.encodings[i].rid);
496 bool is_active = !absl::c_linear_search(disabled_layers, all_layers[i]);
497 EXPECT_EQ(is_active, channel_parameters.encodings[i].active);
498 }
499
500 RunSetLastLayerAsInactiveTest(video_rtp_sender_.get());
501 }
502
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200503 // Check that minimum Jitter Buffer delay is propagated to the underlying
Artem Titov880fa812021-07-30 22:30:23 +0200504 // `media_channel`.
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200505 void VerifyRtpReceiverDelayBehaviour(cricket::Delayable* media_channel,
506 RtpReceiverInterface* receiver,
507 uint32_t ssrc) {
508 receiver->SetJitterBufferMinimumDelay(/*delay_seconds=*/0.5);
509 absl::optional<int> delay_ms =
510 media_channel->GetBaseMinimumPlayoutDelayMs(ssrc); // In milliseconds.
511 EXPECT_DOUBLE_EQ(0.5, delay_ms.value_or(0) / 1000.0);
512 }
513
deadbeef70ab1a12015-09-28 16:53:55 -0700514 protected:
Tommi4ccdf932021-05-17 14:50:10 +0200515 test::RunLoop run_loop_;
Steve Anton47136dd2018-01-12 10:49:35 -0800516 rtc::Thread* const network_thread_;
517 rtc::Thread* const worker_thread_;
Danil Chapovalov83bbe912019-08-07 12:24:53 +0200518 webrtc::RtcEventLogNull event_log_;
Artem Titov880fa812021-07-30 22:30:23 +0200519 // The `rtp_dtls_transport_` and `rtp_transport_` should be destroyed after
520 // the `channel_manager`.
Zhi Huange830e682018-03-30 10:48:35 -0700521 std::unique_ptr<cricket::DtlsTransportInternal> rtp_dtls_transport_;
522 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport_;
Jonas Orelanda3aa9bd2019-04-17 07:38:40 +0200523 std::unique_ptr<webrtc::VideoBitrateAllocatorFactory>
524 video_bitrate_allocator_factory_;
Artem Titov880fa812021-07-30 22:30:23 +0200525 // `media_engine_` is actually owned by `channel_manager_`.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700526 cricket::FakeMediaEngine* media_engine_;
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200527 std::unique_ptr<cricket::ChannelManager> channel_manager_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700528 cricket::FakeCall fake_call_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700529 cricket::VoiceChannel* voice_channel_;
530 cricket::VideoChannel* video_channel_;
531 cricket::FakeVoiceMediaChannel* voice_media_channel_;
532 cricket::FakeVideoMediaChannel* video_media_channel_;
deadbeef70ab1a12015-09-28 16:53:55 -0700533 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
534 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
535 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
536 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
deadbeefe814a0d2017-02-25 18:15:09 -0800537 rtc::scoped_refptr<MediaStreamInterface> local_stream_;
deadbeef70ab1a12015-09-28 16:53:55 -0700538 rtc::scoped_refptr<VideoTrackInterface> video_track_;
539 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
deadbeef20cb0c12017-02-01 20:27:00 -0800540 bool audio_sender_destroyed_signal_fired_ = false;
deadbeef70ab1a12015-09-28 16:53:55 -0700541};
542
Artem Titov880fa812021-07-30 22:30:23 +0200543// Test that `voice_channel_` is updated when an audio track is associated
deadbeef70ab1a12015-09-28 16:53:55 -0700544// and disassociated with an AudioRtpSender.
545TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
546 CreateAudioRtpSender();
547 DestroyAudioRtpSender();
548}
549
Artem Titov880fa812021-07-30 22:30:23 +0200550// Test that `video_channel_` is updated when a video track is associated and
deadbeef70ab1a12015-09-28 16:53:55 -0700551// disassociated with a VideoRtpSender.
552TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
553 CreateVideoRtpSender();
554 DestroyVideoRtpSender();
555}
556
Artem Titov880fa812021-07-30 22:30:23 +0200557// Test that `voice_channel_` is updated when a remote audio track is
deadbeef70ab1a12015-09-28 16:53:55 -0700558// associated and disassociated with an AudioRtpReceiver.
559TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
560 CreateAudioRtpReceiver();
561 DestroyAudioRtpReceiver();
562}
563
Artem Titov880fa812021-07-30 22:30:23 +0200564// Test that `video_channel_` is updated when a remote video track is
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700565// associated and disassociated with a VideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700566TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
567 CreateVideoRtpReceiver();
568 DestroyVideoRtpReceiver();
569}
570
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100571TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiverWithStreams) {
572 CreateAudioRtpReceiver({local_stream_});
573 DestroyAudioRtpReceiver();
574}
575
576TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiverWithStreams) {
577 CreateVideoRtpReceiver({local_stream_});
578 DestroyVideoRtpReceiver();
579}
580
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700581// Test that the AudioRtpSender applies options from the local audio source.
582TEST_F(RtpSenderReceiverTest, LocalAudioSourceOptionsApplied) {
583 cricket::AudioOptions options;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100584 options.echo_cancellation = true;
deadbeef757146b2017-02-10 21:26:48 -0800585 auto source = LocalAudioSource::Create(&options);
Niels Möllere7cc8832022-01-04 15:20:03 +0100586 CreateAudioRtpSender(source);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700587
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100588 EXPECT_EQ(true, voice_media_channel_->options().echo_cancellation);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700589
590 DestroyAudioRtpSender();
591}
592
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700593// Test that the stream is muted when the track is disabled, and unmuted when
594// the track is enabled.
595TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) {
596 CreateAudioRtpSender();
597
598 audio_track_->set_enabled(false);
599 EXPECT_TRUE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
600
601 audio_track_->set_enabled(true);
602 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
603
604 DestroyAudioRtpSender();
605}
606
607// Test that the volume is set to 0 when the track is disabled, and back to
608// 1 when the track is enabled.
deadbeef70ab1a12015-09-28 16:53:55 -0700609TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
610 CreateAudioRtpReceiver();
611
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700612 double volume;
613 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
614 EXPECT_EQ(1, volume);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700615
Tommi4ccdf932021-05-17 14:50:10 +0200616 // Handling of enable/disable is applied asynchronously.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700617 audio_track_->set_enabled(false);
Tommi4ccdf932021-05-17 14:50:10 +0200618 run_loop_.Flush();
619
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700620 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
621 EXPECT_EQ(0, volume);
622
deadbeef70ab1a12015-09-28 16:53:55 -0700623 audio_track_->set_enabled(true);
Tommi4ccdf932021-05-17 14:50:10 +0200624 run_loop_.Flush();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700625 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
626 EXPECT_EQ(1, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700627
628 DestroyAudioRtpReceiver();
629}
630
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700631// Currently no action is taken when a remote video track is disabled or
632// enabled, so there's nothing to test here, other than what is normally
633// verified in DestroyVideoRtpSender.
deadbeef70ab1a12015-09-28 16:53:55 -0700634TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
635 CreateVideoRtpSender();
636
deadbeef70ab1a12015-09-28 16:53:55 -0700637 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700638 video_track_->set_enabled(true);
639
640 DestroyVideoRtpSender();
641}
642
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700643// Test that the state of the video track created by the VideoRtpReceiver is
644// updated when the receiver is destroyed.
perkjf0dcfe22016-03-10 18:32:00 +0100645TEST_F(RtpSenderReceiverTest, RemoteVideoTrackState) {
646 CreateVideoRtpReceiver();
647
648 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track_->state());
649 EXPECT_EQ(webrtc::MediaSourceInterface::kLive,
650 video_track_->GetSource()->state());
651
652 DestroyVideoRtpReceiver();
653
654 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track_->state());
655 EXPECT_EQ(webrtc::MediaSourceInterface::kEnded,
656 video_track_->GetSource()->state());
Tommi4ccdf932021-05-17 14:50:10 +0200657 DestroyVideoRtpReceiver();
perkjf0dcfe22016-03-10 18:32:00 +0100658}
659
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700660// Currently no action is taken when a remote video track is disabled or
661// enabled, so there's nothing to test here, other than what is normally
662// verified in DestroyVideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700663TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
664 CreateVideoRtpReceiver();
665
666 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700667 video_track_->set_enabled(true);
668
669 DestroyVideoRtpReceiver();
670}
671
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700672// Test that the AudioRtpReceiver applies volume changes from the track source
673// to the media channel.
deadbeef70ab1a12015-09-28 16:53:55 -0700674TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
675 CreateAudioRtpReceiver();
676
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700677 double volume;
678 audio_track_->GetSource()->SetVolume(0.5);
Tommi4ccdf932021-05-17 14:50:10 +0200679 run_loop_.Flush();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700680 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
681 EXPECT_EQ(0.5, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700682
683 // Disable the audio track, this should prevent setting the volume.
deadbeef70ab1a12015-09-28 16:53:55 -0700684 audio_track_->set_enabled(false);
Tommi4ccdf932021-05-17 14:50:10 +0200685 RTC_DCHECK_EQ(worker_thread_, run_loop_.task_queue());
686 run_loop_.Flush();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700687 audio_track_->GetSource()->SetVolume(0.8);
688 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
689 EXPECT_EQ(0, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700690
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700691 // When the track is enabled, the previously set volume should take effect.
deadbeef70ab1a12015-09-28 16:53:55 -0700692 audio_track_->set_enabled(true);
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.8, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700696
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700697 // Try changing volume one more time.
698 audio_track_->GetSource()->SetVolume(0.9);
Tommi4ccdf932021-05-17 14:50:10 +0200699 run_loop_.Flush();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700700 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
701 EXPECT_EQ(0.9, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700702
703 DestroyAudioRtpReceiver();
704}
705
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200706TEST_F(RtpSenderReceiverTest, AudioRtpReceiverDelay) {
707 CreateAudioRtpReceiver();
708 VerifyRtpReceiverDelayBehaviour(voice_media_channel_,
709 audio_rtp_receiver_.get(), kAudioSsrc);
Tommi4ccdf932021-05-17 14:50:10 +0200710 DestroyAudioRtpReceiver();
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200711}
712
713TEST_F(RtpSenderReceiverTest, VideoRtpReceiverDelay) {
714 CreateVideoRtpReceiver();
715 VerifyRtpReceiverDelayBehaviour(video_media_channel_,
716 video_rtp_receiver_.get(), kVideoSsrc);
Tommi4ccdf932021-05-17 14:50:10 +0200717 DestroyVideoRtpReceiver();
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200718}
719
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700720// Test that the media channel isn't enabled for sending if the audio sender
721// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800722TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800723 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800724 rtc::scoped_refptr<AudioTrackInterface> track =
725 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700726
727 // Track but no SSRC.
728 EXPECT_TRUE(audio_rtp_sender_->SetTrack(track));
729 VerifyVoiceChannelNoInput();
730
731 // SSRC but no track.
732 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
733 audio_rtp_sender_->SetSsrc(kAudioSsrc);
734 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800735}
736
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700737// Test that the media channel isn't enabled for sending if the video sender
738// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800739TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800740 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700741
742 // Track but no SSRC.
743 EXPECT_TRUE(video_rtp_sender_->SetTrack(video_track_));
744 VerifyVideoChannelNoInput();
745
746 // SSRC but no track.
747 EXPECT_TRUE(video_rtp_sender_->SetTrack(nullptr));
748 video_rtp_sender_->SetSsrc(kVideoSsrc);
749 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800750}
751
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700752// Test that the media channel is enabled for sending when the audio sender
753// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800754TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800755 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800756 rtc::scoped_refptr<AudioTrackInterface> track =
757 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700758 audio_rtp_sender_->SetSsrc(kAudioSsrc);
759 audio_rtp_sender_->SetTrack(track);
760 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800761
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700762 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800763}
764
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700765// Test that the media channel is enabled for sending when the audio sender
766// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800767TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800768 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800769 rtc::scoped_refptr<AudioTrackInterface> track =
770 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700771 audio_rtp_sender_->SetTrack(track);
772 audio_rtp_sender_->SetSsrc(kAudioSsrc);
773 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800774
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700775 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800776}
777
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700778// Test that the media channel is enabled for sending when the video sender
779// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800780TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
nisseaf510af2016-03-21 08:20:42 -0700781 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800782 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700783 video_rtp_sender_->SetSsrc(kVideoSsrc);
784 video_rtp_sender_->SetTrack(video_track_);
785 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800786
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700787 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800788}
789
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700790// Test that the media channel is enabled for sending when the video sender
791// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800792TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
nisseaf510af2016-03-21 08:20:42 -0700793 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800794 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700795 video_rtp_sender_->SetTrack(video_track_);
796 video_rtp_sender_->SetSsrc(kVideoSsrc);
797 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800798
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700799 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800800}
801
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700802// Test that the media channel stops sending when the audio sender's SSRC is set
803// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800804TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700805 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800806
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700807 audio_rtp_sender_->SetSsrc(0);
808 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800809}
810
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700811// Test that the media channel stops sending when the video sender's SSRC is set
812// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800813TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700814 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800815
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700816 audio_rtp_sender_->SetSsrc(0);
817 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800818}
819
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700820// Test that the media channel stops sending when the audio sender's track is
821// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800822TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700823 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800824
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700825 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
826 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800827}
828
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700829// Test that the media channel stops sending when the video sender's track is
830// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800831TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700832 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800833
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700834 video_rtp_sender_->SetSsrc(0);
835 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800836}
837
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700838// Test that when the audio sender's SSRC is changed, the media channel stops
839// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800840TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700841 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800842
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700843 audio_rtp_sender_->SetSsrc(kAudioSsrc2);
844 VerifyVoiceChannelNoInput(kAudioSsrc);
845 VerifyVoiceChannelInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800846
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700847 audio_rtp_sender_ = nullptr;
848 VerifyVoiceChannelNoInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800849}
850
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700851// Test that when the audio sender's SSRC is changed, the media channel stops
852// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800853TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700854 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800855
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700856 video_rtp_sender_->SetSsrc(kVideoSsrc2);
857 VerifyVideoChannelNoInput(kVideoSsrc);
858 VerifyVideoChannelInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800859
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700860 video_rtp_sender_ = nullptr;
861 VerifyVideoChannelNoInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800862}
863
skvladdc1c62c2016-03-16 19:07:43 -0700864TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) {
865 CreateAudioRtpSender();
866
skvladdc1c62c2016-03-16 19:07:43 -0700867 RtpParameters params = audio_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700868 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -0800869 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -0700870
871 DestroyAudioRtpSender();
872}
873
Florent Castelli892acf02018-10-01 22:47:20 +0200874TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParametersBeforeNegotiation) {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800875 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200876 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +0200877
878 RtpParameters params = audio_rtp_sender_->GetParameters();
879 ASSERT_EQ(1u, params.encodings.size());
880 params.encodings[0].max_bitrate_bps = 90000;
881 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
882
883 params = audio_rtp_sender_->GetParameters();
884 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
885 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
886
887 DestroyAudioRtpSender();
888}
889
890TEST_F(RtpSenderReceiverTest, AudioSenderInitParametersMovedAfterNegotiation) {
891 audio_track_ = AudioTrack::Create(kAudioTrackId, nullptr);
892 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
893
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200894 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200895 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200896 audio_rtp_sender_ = AudioRtpSender::Create(
897 worker_thread_, audio_track_->id(), nullptr, set_streams_observer.get());
Florent Castelli892acf02018-10-01 22:47:20 +0200898 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200899 EXPECT_CALL(*set_streams_observer, OnSetStreams());
900 audio_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli892acf02018-10-01 22:47:20 +0200901
902 std::vector<RtpEncodingParameters> init_encodings(1);
903 init_encodings[0].max_bitrate_bps = 60000;
904 audio_rtp_sender_->set_init_send_encodings(init_encodings);
905
906 RtpParameters params = audio_rtp_sender_->GetParameters();
907 ASSERT_EQ(1u, params.encodings.size());
908 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
909
910 // Simulate the setLocalDescription call
911 std::vector<uint32_t> ssrcs(1, 1);
912 cricket::StreamParams stream_params =
913 cricket::CreateSimStreamParams("cname", ssrcs);
914 voice_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800915 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +0200916 audio_rtp_sender_->SetSsrc(1);
917
918 params = audio_rtp_sender_->GetParameters();
919 ASSERT_EQ(1u, params.encodings.size());
920 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
921
922 DestroyAudioRtpSender();
923}
924
925TEST_F(RtpSenderReceiverTest,
926 AudioSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800927 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200928 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +0200929
930 RtpParameters params;
931 RTCError result = audio_rtp_sender_->SetParameters(params);
932 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
933 DestroyAudioRtpSender();
934}
935
Florent Castellicebf50f2018-05-03 15:31:53 +0200936TEST_F(RtpSenderReceiverTest,
937 AudioSenderMustCallGetParametersBeforeSetParameters) {
938 CreateAudioRtpSender();
939
940 RtpParameters params;
941 RTCError result = audio_rtp_sender_->SetParameters(params);
942 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
943
944 DestroyAudioRtpSender();
945}
946
947TEST_F(RtpSenderReceiverTest,
948 AudioSenderSetParametersInvalidatesTransactionId) {
949 CreateAudioRtpSender();
950
951 RtpParameters params = audio_rtp_sender_->GetParameters();
952 EXPECT_EQ(1u, params.encodings.size());
953 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
954 RTCError result = audio_rtp_sender_->SetParameters(params);
955 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
956
957 DestroyAudioRtpSender();
958}
959
960TEST_F(RtpSenderReceiverTest, AudioSenderDetectTransactionIdModification) {
961 CreateAudioRtpSender();
962
963 RtpParameters params = audio_rtp_sender_->GetParameters();
964 params.transaction_id = "";
965 RTCError result = audio_rtp_sender_->SetParameters(params);
966 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
967
968 DestroyAudioRtpSender();
969}
970
971TEST_F(RtpSenderReceiverTest, AudioSenderCheckTransactionIdRefresh) {
972 CreateAudioRtpSender();
973
974 RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200975 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 15:31:53 +0200976 auto saved_transaction_id = params.transaction_id;
977 params = audio_rtp_sender_->GetParameters();
978 EXPECT_NE(saved_transaction_id, params.transaction_id);
979
980 DestroyAudioRtpSender();
981}
982
983TEST_F(RtpSenderReceiverTest, AudioSenderSetParametersOldValueFail) {
984 CreateAudioRtpSender();
985
986 RtpParameters params = audio_rtp_sender_->GetParameters();
987 RtpParameters second_params = audio_rtp_sender_->GetParameters();
988
989 RTCError result = audio_rtp_sender_->SetParameters(params);
990 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
Seth Hampson2d2c8882018-05-16 16:02:32 -0700991 DestroyAudioRtpSender();
992}
993
994TEST_F(RtpSenderReceiverTest, AudioSenderCantSetUnimplementedRtpParameters) {
995 CreateAudioRtpSender();
996 RtpParameters params = audio_rtp_sender_->GetParameters();
997 EXPECT_EQ(1u, params.encodings.size());
998
Florent Castelli87b3c512018-07-18 16:00:28 +0200999 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 16:02:32 -07001000 params.mid = "dummy_mid";
1001 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1002 audio_rtp_sender_->SetParameters(params).type());
1003 params = audio_rtp_sender_->GetParameters();
1004
Seth Hampson2d2c8882018-05-16 16:02:32 -07001005 DestroyAudioRtpSender();
1006}
1007
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001008TEST_F(RtpSenderReceiverTest, SetAudioMaxSendBitrate) {
1009 CreateAudioRtpSender();
1010
1011 EXPECT_EQ(-1, voice_media_channel_->max_bps());
1012 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001013 EXPECT_EQ(1U, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -08001014 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001015 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -08001016 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001017
1018 // Read back the parameters and verify they have been changed.
1019 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001020 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001021 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001022
1023 // Verify that the audio channel received the new parameters.
1024 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001025 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001026 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001027
1028 // Verify that the global bitrate limit has not been changed.
1029 EXPECT_EQ(-1, voice_media_channel_->max_bps());
1030
1031 DestroyAudioRtpSender();
1032}
1033
Seth Hampson24722b32017-12-22 09:36:42 -08001034TEST_F(RtpSenderReceiverTest, SetAudioBitratePriority) {
1035 CreateAudioRtpSender();
1036
1037 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001038 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001039 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1040 params.encodings[0].bitrate_priority);
1041 double new_bitrate_priority = 2.0;
1042 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -08001043 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -08001044
1045 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001046 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001047 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1048
1049 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001050 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001051 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1052
1053 DestroyAudioRtpSender();
1054}
1055
skvladdc1c62c2016-03-16 19:07:43 -07001056TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) {
1057 CreateVideoRtpSender();
1058
skvladdc1c62c2016-03-16 19:07:43 -07001059 RtpParameters params = video_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001060 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -08001061 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -07001062
1063 DestroyVideoRtpSender();
1064}
1065
Florent Castelli892acf02018-10-01 22:47:20 +02001066TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParametersBeforeNegotiation) {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001067 video_rtp_sender_ =
1068 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +02001069
1070 RtpParameters params = video_rtp_sender_->GetParameters();
1071 ASSERT_EQ(1u, params.encodings.size());
1072 params.encodings[0].max_bitrate_bps = 90000;
1073 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1074
1075 params = video_rtp_sender_->GetParameters();
1076 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1077 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
1078
1079 DestroyVideoRtpSender();
1080}
1081
1082TEST_F(RtpSenderReceiverTest, VideoSenderInitParametersMovedAfterNegotiation) {
1083 AddVideoTrack(false);
1084
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001085 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001086 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001087 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1088 set_streams_observer.get());
Florent Castelli892acf02018-10-01 22:47:20 +02001089 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001090 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1091 video_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli892acf02018-10-01 22:47:20 +02001092
1093 std::vector<RtpEncodingParameters> init_encodings(2);
1094 init_encodings[0].max_bitrate_bps = 60000;
1095 init_encodings[1].max_bitrate_bps = 900000;
1096 video_rtp_sender_->set_init_send_encodings(init_encodings);
1097
1098 RtpParameters params = video_rtp_sender_->GetParameters();
1099 ASSERT_EQ(2u, params.encodings.size());
1100 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1101 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
1102
1103 // Simulate the setLocalDescription call
1104 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +01001105 ssrcs.reserve(2);
Florent Castelli892acf02018-10-01 22:47:20 +02001106 for (int i = 0; i < 2; ++i)
1107 ssrcs.push_back(kVideoSsrcSimulcast + i);
1108 cricket::StreamParams stream_params =
1109 cricket::CreateSimStreamParams("cname", ssrcs);
1110 video_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -08001111 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +02001112 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
1113
1114 params = video_rtp_sender_->GetParameters();
1115 ASSERT_EQ(2u, params.encodings.size());
1116 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1117 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
1118
1119 DestroyVideoRtpSender();
1120}
1121
1122TEST_F(RtpSenderReceiverTest,
1123 VideoSenderInitParametersMovedAfterManualSimulcastAndNegotiation) {
1124 AddVideoTrack(false);
1125
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001126 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001127 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001128 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1129 set_streams_observer.get());
Florent Castelli892acf02018-10-01 22:47:20 +02001130 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001131 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1132 video_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli892acf02018-10-01 22:47:20 +02001133
1134 std::vector<RtpEncodingParameters> init_encodings(1);
1135 init_encodings[0].max_bitrate_bps = 60000;
1136 video_rtp_sender_->set_init_send_encodings(init_encodings);
1137
1138 RtpParameters params = video_rtp_sender_->GetParameters();
1139 ASSERT_EQ(1u, params.encodings.size());
1140 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1141
1142 // Simulate the setLocalDescription call as if the user used SDP munging
1143 // to enable simulcast
1144 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +01001145 ssrcs.reserve(2);
Florent Castelli892acf02018-10-01 22:47:20 +02001146 for (int i = 0; i < 2; ++i)
1147 ssrcs.push_back(kVideoSsrcSimulcast + i);
1148 cricket::StreamParams stream_params =
1149 cricket::CreateSimStreamParams("cname", ssrcs);
1150 video_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -08001151 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +02001152 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
1153
1154 params = video_rtp_sender_->GetParameters();
1155 ASSERT_EQ(2u, params.encodings.size());
1156 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1157
1158 DestroyVideoRtpSender();
1159}
1160
1161TEST_F(RtpSenderReceiverTest,
1162 VideoSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001163 video_rtp_sender_ =
1164 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +02001165
1166 RtpParameters params;
1167 RTCError result = video_rtp_sender_->SetParameters(params);
1168 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1169 DestroyVideoRtpSender();
1170}
1171
Florent Castellicebf50f2018-05-03 15:31:53 +02001172TEST_F(RtpSenderReceiverTest,
1173 VideoSenderMustCallGetParametersBeforeSetParameters) {
1174 CreateVideoRtpSender();
1175
1176 RtpParameters params;
1177 RTCError result = video_rtp_sender_->SetParameters(params);
1178 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1179
1180 DestroyVideoRtpSender();
1181}
1182
1183TEST_F(RtpSenderReceiverTest,
1184 VideoSenderSetParametersInvalidatesTransactionId) {
1185 CreateVideoRtpSender();
1186
1187 RtpParameters params = video_rtp_sender_->GetParameters();
1188 EXPECT_EQ(1u, params.encodings.size());
1189 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1190 RTCError result = video_rtp_sender_->SetParameters(params);
1191 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1192
1193 DestroyVideoRtpSender();
1194}
1195
1196TEST_F(RtpSenderReceiverTest, VideoSenderDetectTransactionIdModification) {
1197 CreateVideoRtpSender();
1198
1199 RtpParameters params = video_rtp_sender_->GetParameters();
1200 params.transaction_id = "";
1201 RTCError result = video_rtp_sender_->SetParameters(params);
1202 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1203
1204 DestroyVideoRtpSender();
1205}
1206
1207TEST_F(RtpSenderReceiverTest, VideoSenderCheckTransactionIdRefresh) {
1208 CreateVideoRtpSender();
1209
1210 RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001211 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 15:31:53 +02001212 auto saved_transaction_id = params.transaction_id;
1213 params = video_rtp_sender_->GetParameters();
1214 EXPECT_NE(saved_transaction_id, params.transaction_id);
1215
1216 DestroyVideoRtpSender();
1217}
1218
1219TEST_F(RtpSenderReceiverTest, VideoSenderSetParametersOldValueFail) {
1220 CreateVideoRtpSender();
1221
1222 RtpParameters params = video_rtp_sender_->GetParameters();
1223 RtpParameters second_params = video_rtp_sender_->GetParameters();
1224
1225 RTCError result = video_rtp_sender_->SetParameters(params);
1226 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1227
1228 DestroyVideoRtpSender();
1229}
1230
Seth Hampson2d2c8882018-05-16 16:02:32 -07001231TEST_F(RtpSenderReceiverTest, VideoSenderCantSetUnimplementedRtpParameters) {
1232 CreateVideoRtpSender();
1233 RtpParameters params = video_rtp_sender_->GetParameters();
1234 EXPECT_EQ(1u, params.encodings.size());
1235
Florent Castelli87b3c512018-07-18 16:00:28 +02001236 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 16:02:32 -07001237 params.mid = "dummy_mid";
1238 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1239 video_rtp_sender_->SetParameters(params).type());
1240 params = video_rtp_sender_->GetParameters();
1241
Seth Hampson2d2c8882018-05-16 16:02:32 -07001242 DestroyVideoRtpSender();
1243}
1244
Florent Castellic1a0bcb2019-01-29 14:26:48 +01001245TEST_F(RtpSenderReceiverTest, VideoSenderCanSetScaleResolutionDownBy) {
1246 CreateVideoRtpSender();
1247
1248 RtpParameters params = video_rtp_sender_->GetParameters();
1249 params.encodings[0].scale_resolution_down_by = 2;
1250
1251 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1252 params = video_rtp_sender_->GetParameters();
1253 EXPECT_EQ(2, params.encodings[0].scale_resolution_down_by);
1254
1255 DestroyVideoRtpSender();
1256}
1257
1258TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidScaleResolutionDownBy) {
1259 CreateVideoRtpSender();
1260
1261 RtpParameters params = video_rtp_sender_->GetParameters();
1262 params.encodings[0].scale_resolution_down_by = 0.5;
1263 RTCError result = video_rtp_sender_->SetParameters(params);
1264 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1265
1266 DestroyVideoRtpSender();
1267}
1268
Ă…sa Perssonfb195962021-08-16 16:41:56 +02001269TEST_F(RtpSenderReceiverTest, VideoSenderCanSetNumTemporalLayers) {
1270 CreateVideoRtpSender();
1271
1272 RtpParameters params = video_rtp_sender_->GetParameters();
1273 params.encodings[0].num_temporal_layers = 2;
1274
1275 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1276 params = video_rtp_sender_->GetParameters();
1277 EXPECT_EQ(2, params.encodings[0].num_temporal_layers);
1278
1279 DestroyVideoRtpSender();
1280}
1281
1282TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidNumTemporalLayers) {
1283 CreateVideoRtpSender();
1284
1285 RtpParameters params = video_rtp_sender_->GetParameters();
1286 params.encodings[0].num_temporal_layers = webrtc::kMaxTemporalStreams + 1;
1287 RTCError result = video_rtp_sender_->SetParameters(params);
1288 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1289
1290 DestroyVideoRtpSender();
1291}
1292
Florent Castelli907dc802019-12-06 15:03:19 +01001293TEST_F(RtpSenderReceiverTest, VideoSenderCanSetMaxFramerate) {
1294 CreateVideoRtpSender();
1295
1296 RtpParameters params = video_rtp_sender_->GetParameters();
1297 params.encodings[0].max_framerate = 20;
1298
1299 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1300 params = video_rtp_sender_->GetParameters();
1301 EXPECT_EQ(20., params.encodings[0].max_framerate);
1302
1303 DestroyVideoRtpSender();
1304}
1305
1306TEST_F(RtpSenderReceiverTest, VideoSenderCanSetMaxFramerateZero) {
1307 CreateVideoRtpSender();
1308
1309 RtpParameters params = video_rtp_sender_->GetParameters();
1310 params.encodings[0].max_framerate = 0.;
1311
1312 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1313 params = video_rtp_sender_->GetParameters();
1314 EXPECT_EQ(0., params.encodings[0].max_framerate);
1315
1316 DestroyVideoRtpSender();
1317}
1318
1319TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidMaxFramerate) {
1320 CreateVideoRtpSender();
1321
1322 RtpParameters params = video_rtp_sender_->GetParameters();
1323 params.encodings[0].max_framerate = -5.;
1324 RTCError result = video_rtp_sender_->SetParameters(params);
1325 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1326
1327 DestroyVideoRtpSender();
1328}
1329
Seth Hampson2d2c8882018-05-16 16:02:32 -07001330// A video sender can have multiple simulcast layers, in which case it will
1331// contain multiple RtpEncodingParameters. This tests that if this is the case
1332// (simulcast), then we can't set the bitrate_priority, or max_bitrate_bps
1333// for any encodings besides at index 0, because these are both implemented
1334// "per-sender."
1335TEST_F(RtpSenderReceiverTest, VideoSenderCantSetPerSenderEncodingParameters) {
1336 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001337 CreateVideoRtpSenderWithSimulcast();
Seth Hampson2d2c8882018-05-16 16:02:32 -07001338 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001339 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Seth Hampson2d2c8882018-05-16 16:02:32 -07001340
1341 params.encodings[1].bitrate_priority = 2.0;
1342 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1343 video_rtp_sender_->SetParameters(params).type());
1344 params = video_rtp_sender_->GetParameters();
1345
Seth Hampson2d2c8882018-05-16 16:02:32 -07001346 DestroyVideoRtpSender();
1347}
1348
Florent Castelli892acf02018-10-01 22:47:20 +02001349TEST_F(RtpSenderReceiverTest, VideoSenderCantSetReadOnlyEncodingParameters) {
1350 // Add a simulcast specific send stream that contains 2 encoding parameters.
1351 CreateVideoRtpSenderWithSimulcast();
1352 RtpParameters params = video_rtp_sender_->GetParameters();
1353 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
1354
1355 for (size_t i = 0; i < params.encodings.size(); i++) {
1356 params.encodings[i].ssrc = 1337;
1357 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION,
1358 video_rtp_sender_->SetParameters(params).type());
1359 params = video_rtp_sender_->GetParameters();
1360 }
1361
1362 DestroyVideoRtpSender();
1363}
1364
Ă…sa Persson55659812018-06-18 17:51:32 +02001365TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrate) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001366 CreateVideoRtpSender();
1367
1368 EXPECT_EQ(-1, video_media_channel_->max_bps());
1369 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001370 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001371 EXPECT_FALSE(params.encodings[0].min_bitrate_bps);
deadbeefe702b302017-02-04 12:09:01 -08001372 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Ă…sa Persson55659812018-06-18 17:51:32 +02001373 params.encodings[0].min_bitrate_bps = 100;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001374 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -08001375 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001376
1377 // Read back the parameters and verify they have been changed.
1378 params = video_rtp_sender_->GetParameters();
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 video channel received the new parameters.
1384 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001385 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001386 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001387 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001388
1389 // Verify that the global bitrate limit has not been changed.
1390 EXPECT_EQ(-1, video_media_channel_->max_bps());
1391
1392 DestroyVideoRtpSender();
1393}
1394
Ă…sa Persson55659812018-06-18 17:51:32 +02001395TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrateSimulcast) {
1396 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001397 CreateVideoRtpSenderWithSimulcast();
Ă…sa Persson55659812018-06-18 17:51:32 +02001398
1399 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001400 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001401 params.encodings[0].min_bitrate_bps = 100;
1402 params.encodings[0].max_bitrate_bps = 1000;
1403 params.encodings[1].min_bitrate_bps = 200;
1404 params.encodings[1].max_bitrate_bps = 2000;
1405 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1406
1407 // Verify that the video channel received the new parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001408 params = video_media_channel_->GetRtpSendParameters(kVideoSsrcSimulcast);
1409 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001410 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
1411 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
1412 EXPECT_EQ(200, params.encodings[1].min_bitrate_bps);
1413 EXPECT_EQ(2000, params.encodings[1].max_bitrate_bps);
1414
1415 DestroyVideoRtpSender();
1416}
1417
Seth Hampson24722b32017-12-22 09:36:42 -08001418TEST_F(RtpSenderReceiverTest, SetVideoBitratePriority) {
1419 CreateVideoRtpSender();
1420
1421 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001422 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001423 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1424 params.encodings[0].bitrate_priority);
1425 double new_bitrate_priority = 2.0;
1426 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -08001427 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -08001428
1429 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001430 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001431 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1432
1433 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001434 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001435 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1436
1437 DestroyVideoRtpSender();
1438}
1439
Florent Castelli38332cd2018-11-20 14:08:06 +01001440TEST_F(RtpSenderReceiverTest, VideoReceiverCanGetParametersWithSimulcast) {
1441 CreateVideoRtpReceiverWithSimulcast({}, 2);
1442
1443 RtpParameters params = video_rtp_receiver_->GetParameters();
1444 EXPECT_EQ(2u, params.encodings.size());
1445
1446 DestroyVideoRtpReceiver();
1447}
1448
pbos5214a0a2016-12-16 15:39:11 -08001449// Test that makes sure that a video track content hint translates to the proper
1450// value for sources that are not screencast.
1451TEST_F(RtpSenderReceiverTest, PropagatesVideoTrackContentHint) {
1452 CreateVideoRtpSender();
1453
1454 video_track_->set_enabled(true);
1455
Artem Titov880fa812021-07-30 22:30:23 +02001456 // `video_track_` is not screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001457 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001458 // No content hint should be set by default.
1459 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1460 video_track_->content_hint());
1461 // Setting detailed should turn a non-screencast source into screencast mode.
1462 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001463 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001464 // Removing the content hint should turn the track back into non-screencast
1465 // mode.
1466 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001467 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001468 // Setting fluid should remain in non-screencast mode (its default).
1469 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001470 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 08:53:10 +02001471 // Setting text should have the same effect as Detailed
1472 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
1473 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001474
1475 DestroyVideoRtpSender();
1476}
1477
1478// Test that makes sure that a video track content hint translates to the proper
1479// value for screencast sources.
1480TEST_F(RtpSenderReceiverTest,
1481 PropagatesVideoTrackContentHintForScreencastSource) {
1482 CreateVideoRtpSender(true);
1483
1484 video_track_->set_enabled(true);
1485
Artem Titov880fa812021-07-30 22:30:23 +02001486 // `video_track_` with a screencast source should be screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001487 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001488 // No content hint should be set by default.
1489 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1490 video_track_->content_hint());
1491 // Setting fluid should turn a screencast source into non-screencast mode.
1492 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001493 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001494 // Removing the content hint should turn the track back into screencast mode.
1495 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001496 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001497 // Setting detailed should still remain in screencast mode (its default).
1498 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001499 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 08:53:10 +02001500 // Setting text should have the same effect as Detailed
1501 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
1502 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001503
1504 DestroyVideoRtpSender();
1505}
1506
1507// Test that makes sure any content hints that are set on a track before
1508// VideoRtpSender is ready to send are still applied when it gets ready to send.
1509TEST_F(RtpSenderReceiverTest,
1510 PropagatesVideoTrackContentHintSetBeforeEnabling) {
1511 AddVideoTrack();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001512 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001513 std::make_unique<MockSetStreamsObserver>();
pbos5214a0a2016-12-16 15:39:11 -08001514 // Setting detailed overrides the default non-screencast mode. This should be
1515 // applied even if the track is set on construction.
1516 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001517 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1518 set_streams_observer.get());
Steve Anton111fdfd2018-06-25 13:03:36 -07001519 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001520 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1521 video_rtp_sender_->SetStreams({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -08001522 video_rtp_sender_->SetMediaChannel(video_media_channel_);
pbos5214a0a2016-12-16 15:39:11 -08001523 video_track_->set_enabled(true);
1524
1525 // Sender is not ready to send (no SSRC) so no option should have been set.
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001526 EXPECT_EQ(absl::nullopt, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001527
1528 // Verify that the content hint is accounted for when video_rtp_sender_ does
1529 // get enabled.
1530 video_rtp_sender_->SetSsrc(kVideoSsrc);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001531 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001532
1533 // And removing the hint should go back to false (to verify that false was
1534 // default correctly).
1535 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001536 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001537
1538 DestroyVideoRtpSender();
1539}
1540
deadbeef20cb0c12017-02-01 20:27:00 -08001541TEST_F(RtpSenderReceiverTest, AudioSenderHasDtmfSender) {
1542 CreateAudioRtpSender();
1543 EXPECT_NE(nullptr, audio_rtp_sender_->GetDtmfSender());
1544}
1545
1546TEST_F(RtpSenderReceiverTest, VideoSenderDoesNotHaveDtmfSender) {
1547 CreateVideoRtpSender();
1548 EXPECT_EQ(nullptr, video_rtp_sender_->GetDtmfSender());
1549}
1550
Artem Titov880fa812021-07-30 22:30:23 +02001551// Test that the DTMF sender is really using `voice_channel_`, and thus returns
1552// true/false from CanSendDtmf based on what `voice_channel_` returns.
deadbeef20cb0c12017-02-01 20:27:00 -08001553TEST_F(RtpSenderReceiverTest, CanInsertDtmf) {
1554 AddDtmfCodec();
1555 CreateAudioRtpSender();
1556 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1557 ASSERT_NE(nullptr, dtmf_sender);
1558 EXPECT_TRUE(dtmf_sender->CanInsertDtmf());
1559}
1560
1561TEST_F(RtpSenderReceiverTest, CanNotInsertDtmf) {
1562 CreateAudioRtpSender();
1563 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1564 ASSERT_NE(nullptr, dtmf_sender);
1565 // DTMF codec has not been added, as it was in the above test.
1566 EXPECT_FALSE(dtmf_sender->CanInsertDtmf());
1567}
1568
1569TEST_F(RtpSenderReceiverTest, InsertDtmf) {
1570 AddDtmfCodec();
1571 CreateAudioRtpSender();
1572 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1573 ASSERT_NE(nullptr, dtmf_sender);
1574
1575 EXPECT_EQ(0U, voice_media_channel_->dtmf_info_queue().size());
1576
1577 // Insert DTMF
1578 const int expected_duration = 90;
1579 dtmf_sender->InsertDtmf("012", expected_duration, 100);
1580
1581 // Verify
1582 ASSERT_EQ_WAIT(3U, voice_media_channel_->dtmf_info_queue().size(),
1583 kDefaultTimeout);
1584 const uint32_t send_ssrc =
1585 voice_media_channel_->send_streams()[0].first_ssrc();
1586 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[0],
1587 send_ssrc, 0, expected_duration));
1588 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[1],
1589 send_ssrc, 1, expected_duration));
1590 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[2],
1591 send_ssrc, 2, expected_duration));
1592}
1593
1594// Make sure the signal from "GetOnDestroyedSignal()" fires when the sender is
1595// destroyed, which is needed for the DTMF sender.
1596TEST_F(RtpSenderReceiverTest, TestOnDestroyedSignal) {
1597 CreateAudioRtpSender();
1598 EXPECT_FALSE(audio_sender_destroyed_signal_fired_);
1599 audio_rtp_sender_ = nullptr;
1600 EXPECT_TRUE(audio_sender_destroyed_signal_fired_);
1601}
1602
Benjamin Wright84583f62018-10-04 14:22:34 -07001603// Validate that the default FrameEncryptor setting is nullptr.
1604TEST_F(RtpSenderReceiverTest, AudioSenderCanSetFrameEncryptor) {
1605 CreateAudioRtpSender();
1606 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1607 new FakeFrameEncryptor());
1608 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1609 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1610 EXPECT_EQ(fake_frame_encryptor.get(),
1611 audio_rtp_sender_->GetFrameEncryptor().get());
1612}
1613
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001614// Validate that setting a FrameEncryptor after the send stream is stopped does
1615// nothing.
1616TEST_F(RtpSenderReceiverTest, AudioSenderCannotSetFrameEncryptorAfterStop) {
1617 CreateAudioRtpSender();
1618 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1619 new FakeFrameEncryptor());
1620 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1621 audio_rtp_sender_->Stop();
1622 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1623 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1624}
1625
Benjamin Wright84583f62018-10-04 14:22:34 -07001626// Validate that the default FrameEncryptor setting is nullptr.
1627TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetFrameDecryptor) {
1628 CreateAudioRtpReceiver();
1629 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1630 new FakeFrameDecryptor());
1631 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
1632 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1633 EXPECT_EQ(fake_frame_decryptor.get(),
1634 audio_rtp_receiver_->GetFrameDecryptor().get());
Tommi4ccdf932021-05-17 14:50:10 +02001635 DestroyAudioRtpReceiver();
Benjamin Wright84583f62018-10-04 14:22:34 -07001636}
1637
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001638// Validate that the default FrameEncryptor setting is nullptr.
1639TEST_F(RtpSenderReceiverTest, AudioReceiverCannotSetFrameDecryptorAfterStop) {
1640 CreateAudioRtpReceiver();
1641 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1642 new FakeFrameDecryptor());
1643 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
Tommi6589def2022-02-17 23:36:47 +01001644 audio_rtp_receiver_->SetMediaChannel(nullptr);
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001645 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1646 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
Tommi4ccdf932021-05-17 14:50:10 +02001647 DestroyAudioRtpReceiver();
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001648}
1649
1650// Validate that the default FrameEncryptor setting is nullptr.
1651TEST_F(RtpSenderReceiverTest, VideoSenderCanSetFrameEncryptor) {
1652 CreateVideoRtpSender();
1653 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1654 new FakeFrameEncryptor());
1655 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1656 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1657 EXPECT_EQ(fake_frame_encryptor.get(),
1658 video_rtp_sender_->GetFrameEncryptor().get());
1659}
1660
1661// Validate that setting a FrameEncryptor after the send stream is stopped does
1662// nothing.
1663TEST_F(RtpSenderReceiverTest, VideoSenderCannotSetFrameEncryptorAfterStop) {
1664 CreateVideoRtpSender();
1665 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1666 new FakeFrameEncryptor());
1667 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1668 video_rtp_sender_->Stop();
1669 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1670 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1671}
1672
1673// Validate that the default FrameEncryptor setting is nullptr.
1674TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetFrameDecryptor) {
1675 CreateVideoRtpReceiver();
1676 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1677 new FakeFrameDecryptor());
1678 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
1679 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1680 EXPECT_EQ(fake_frame_decryptor.get(),
1681 video_rtp_receiver_->GetFrameDecryptor().get());
Tommi4ccdf932021-05-17 14:50:10 +02001682 DestroyVideoRtpReceiver();
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001683}
1684
1685// Validate that the default FrameEncryptor setting is nullptr.
1686TEST_F(RtpSenderReceiverTest, VideoReceiverCannotSetFrameDecryptorAfterStop) {
1687 CreateVideoRtpReceiver();
1688 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1689 new FakeFrameDecryptor());
1690 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
Tommi6589def2022-02-17 23:36:47 +01001691 video_rtp_receiver_->SetMediaChannel(nullptr);
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001692 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1693 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
Tommi4ccdf932021-05-17 14:50:10 +02001694 DestroyVideoRtpReceiver();
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001695}
1696
Amit Hilbuch619b2942019-02-26 15:55:19 -08001697// Checks that calling the internal methods for get/set parameters do not
1698// invalidate any parameters retreived by clients.
1699TEST_F(RtpSenderReceiverTest,
1700 InternalParameterMethodsDoNotInvalidateTransaction) {
1701 CreateVideoRtpSender();
1702 RtpParameters parameters = video_rtp_sender_->GetParameters();
1703 RtpParameters new_parameters = video_rtp_sender_->GetParametersInternal();
1704 new_parameters.encodings[0].active = false;
1705 video_rtp_sender_->SetParametersInternal(new_parameters);
1706 new_parameters.encodings[0].active = true;
1707 video_rtp_sender_->SetParametersInternal(new_parameters);
1708 parameters.encodings[0].active = false;
1709 EXPECT_TRUE(video_rtp_sender_->SetParameters(parameters).ok());
1710}
1711
Amit Hilbuch2297d332019-02-19 12:49:22 -08001712// Helper method for syntactic sugar for accepting a vector with '{}' notation.
1713std::pair<RidList, RidList> CreatePairOfRidVectors(
1714 const std::vector<std::string>& first,
1715 const std::vector<std::string>& second) {
1716 return std::make_pair(first, second);
1717}
1718
1719// These parameters are used to test disabling simulcast layers.
1720const std::pair<RidList, RidList> kDisableSimulcastLayersParameters[] = {
1721 // Tests removing the first layer. This is a special case because
1722 // the first layer's SSRC is also the 'primary' SSRC used to associate the
1723 // parameters to the media channel.
1724 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"1"}),
1725 // Tests removing some layers.
1726 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"2", "4"}),
1727 // Tests simulcast rejected scenario all layers except first are rejected.
1728 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"2", "3", "4"}),
1729 // Tests removing all layers.
1730 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"1", "2", "3", "4"}),
1731};
1732
1733// Runs test for disabling layers on a sender without a media engine set.
1734TEST_P(RtpSenderReceiverTest, DisableSimulcastLayersWithoutMediaEngine) {
1735 auto parameter = GetParam();
1736 RunDisableSimulcastLayersWithoutMediaEngineTest(parameter.first,
1737 parameter.second);
1738}
1739
1740// Runs test for disabling layers on a sender with a media engine set.
1741TEST_P(RtpSenderReceiverTest, DisableSimulcastLayersWithMediaEngine) {
1742 auto parameter = GetParam();
1743 RunDisableSimulcastLayersWithMediaEngineTest(parameter.first,
1744 parameter.second);
1745}
1746
1747INSTANTIATE_TEST_SUITE_P(
1748 DisableSimulcastLayersInSender,
1749 RtpSenderReceiverTest,
1750 ::testing::ValuesIn(kDisableSimulcastLayersParameters));
1751
deadbeef70ab1a12015-09-28 16:53:55 -07001752} // namespace webrtc