blob: 97093e82bed630ba67ba9d471027704a7678eb9f [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"
40#include "media/base/rtp_data_engine.h"
41#include "media/base/stream_params.h"
42#include "media/base/test_utils.h"
43#include "media/engine/fake_webrtc_call.h"
44#include "p2p/base/dtls_transport_internal.h"
45#include "p2p/base/fake_dtls_transport.h"
46#include "p2p/base/p2p_constants.h"
Ruslan Burakov501bfba2019-02-11 10:29:19 +010047#include "pc/audio_rtp_receiver.h"
Steve Anton10542f22019-01-11 09:11:00 -080048#include "pc/audio_track.h"
Yves Gerey3e707812018-11-28 16:47:49 +010049#include "pc/channel.h"
Steve Anton10542f22019-01-11 09:11:00 -080050#include "pc/channel_manager.h"
51#include "pc/dtls_srtp_transport.h"
52#include "pc/local_audio_source.h"
53#include "pc/media_stream.h"
Ruslan Burakov7ea46052019-02-16 02:07:05 +010054#include "pc/remote_audio_source.h"
Steve Anton10542f22019-01-11 09:11:00 -080055#include "pc/rtp_receiver.h"
56#include "pc/rtp_sender.h"
57#include "pc/rtp_transport_internal.h"
58#include "pc/test/fake_video_track_source.h"
Ruslan Burakov501bfba2019-02-11 10:29:19 +010059#include "pc/video_rtp_receiver.h"
Steve Anton10542f22019-01-11 09:11:00 -080060#include "pc/video_track.h"
Yves Gerey3e707812018-11-28 16:47:49 +010061#include "rtc_base/checks.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020062#include "rtc_base/gunit.h"
Yves Gerey3e707812018-11-28 16:47:49 +010063#include "rtc_base/third_party/sigslot/sigslot.h"
64#include "rtc_base/thread.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020065#include "test/gmock.h"
66#include "test/gtest.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()),
Sebastian Jansson8f83b422018-02-21 13:07:13 +0100111 fake_call_(),
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(
115 absl::WrapUnique(media_engine_),
116 std::make_unique<cricket::RtpDataEngine>(), false, worker_thread_,
117 network_thread_);
118 });
119
deadbeef7af91dd2016-12-13 11:29:11 -0800120 bool srtp_required = true;
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200121 rtp_dtls_transport_ = std::make_unique<cricket::FakeDtlsTransport>(
Zhi Huange830e682018-03-30 10:48:35 -0700122 "fake_dtls_transport", cricket::ICE_CANDIDATE_COMPONENT_RTP);
123 rtp_transport_ = CreateDtlsSrtpTransport();
124
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200125 voice_channel_ = channel_manager_->CreateVoiceChannel(
Zhi Huange830e682018-03-30 10:48:35 -0700126 &fake_call_, cricket::MediaConfig(), rtp_transport_.get(),
Niels Möller2a707032020-06-16 16:39:13 +0200127 rtc::Thread::Current(), cricket::CN_AUDIO, srtp_required,
128 webrtc::CryptoOptions(), &ssrc_generator_, cricket::AudioOptions());
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200129 video_channel_ = channel_manager_->CreateVideoChannel(
Zhi Huange830e682018-03-30 10:48:35 -0700130 &fake_call_, cricket::MediaConfig(), rtp_transport_.get(),
Niels Möller2a707032020-06-16 16:39:13 +0200131 rtc::Thread::Current(), cricket::CN_VIDEO, srtp_required,
132 webrtc::CryptoOptions(), &ssrc_generator_, cricket::VideoOptions(),
133 video_bitrate_allocator_factory_.get());
deadbeef20cb0c12017-02-01 20:27:00 -0800134 voice_channel_->Enable(true);
135 video_channel_->Enable(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700136 voice_media_channel_ = media_engine_->GetVoiceChannel(0);
137 video_media_channel_ = media_engine_->GetVideoChannel(0);
138 RTC_CHECK(voice_channel_);
139 RTC_CHECK(video_channel_);
140 RTC_CHECK(voice_media_channel_);
141 RTC_CHECK(video_media_channel_);
142
143 // Create streams for predefined SSRCs. Streams need to exist in order
144 // for the senders and receievers to apply parameters to them.
145 // Normally these would be created by SetLocalDescription and
146 // SetRemoteDescription.
147 voice_media_channel_->AddSendStream(
148 cricket::StreamParams::CreateLegacy(kAudioSsrc));
149 voice_media_channel_->AddRecvStream(
150 cricket::StreamParams::CreateLegacy(kAudioSsrc));
151 voice_media_channel_->AddSendStream(
152 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
153 voice_media_channel_->AddRecvStream(
154 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
155 video_media_channel_->AddSendStream(
156 cricket::StreamParams::CreateLegacy(kVideoSsrc));
157 video_media_channel_->AddRecvStream(
158 cricket::StreamParams::CreateLegacy(kVideoSsrc));
159 video_media_channel_->AddSendStream(
160 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
161 video_media_channel_->AddRecvStream(
162 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
tkchin3784b4a2016-06-24 19:31:47 -0700163 }
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700164
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200165 ~RtpSenderReceiverTest() {
166 audio_rtp_sender_ = nullptr;
167 video_rtp_sender_ = nullptr;
168 audio_rtp_receiver_ = nullptr;
169 video_rtp_receiver_ = nullptr;
170 local_stream_ = nullptr;
171 video_track_ = nullptr;
172 audio_track_ = nullptr;
173 worker_thread_->Invoke<void>(RTC_FROM_HERE,
174 [&]() { channel_manager_.reset(); });
175 }
176
Zhi Huange830e682018-03-30 10:48:35 -0700177 std::unique_ptr<webrtc::RtpTransportInternal> CreateDtlsSrtpTransport() {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200178 auto dtls_srtp_transport = std::make_unique<webrtc::DtlsSrtpTransport>(
Karl Wiberg918f50c2018-07-05 11:40:33 +0200179 /*rtcp_mux_required=*/true);
Zhi Huange830e682018-03-30 10:48:35 -0700180 dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport_.get(),
181 /*rtcp_dtls_transport=*/nullptr);
182 return dtls_srtp_transport;
183 }
184
deadbeef20cb0c12017-02-01 20:27:00 -0800185 // Needed to use DTMF sender.
186 void AddDtmfCodec() {
187 cricket::AudioSendParameters params;
188 const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000,
189 0, 1);
190 params.codecs.push_back(kTelephoneEventCodec);
191 voice_media_channel_->SetSendParameters(params);
192 }
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700193
pbos5214a0a2016-12-16 15:39:11 -0800194 void AddVideoTrack() { AddVideoTrack(false); }
195
196 void AddVideoTrack(bool is_screencast) {
perkja3ede6c2016-03-08 01:27:48 +0100197 rtc::scoped_refptr<VideoTrackSourceInterface> source(
pbos5214a0a2016-12-16 15:39:11 -0800198 FakeVideoTrackSource::Create(is_screencast));
perkj773be362017-07-31 23:22:01 -0700199 video_track_ =
200 VideoTrack::Create(kVideoTrackId, source, rtc::Thread::Current());
deadbeefe814a0d2017-02-25 18:15:09 -0800201 EXPECT_TRUE(local_stream_->AddTrack(video_track_));
deadbeef70ab1a12015-09-28 16:53:55 -0700202 }
203
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700204 void CreateAudioRtpSender() { CreateAudioRtpSender(nullptr); }
205
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +0100206 void CreateAudioRtpSender(
207 const rtc::scoped_refptr<LocalAudioSource>& source) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700208 audio_track_ = AudioTrack::Create(kAudioTrackId, source);
deadbeefe814a0d2017-02-25 18:15:09 -0800209 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200210 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200211 std::make_unique<MockSetStreamsObserver>();
Steve Anton47136dd2018-01-12 10:49:35 -0800212 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200213 AudioRtpSender::Create(worker_thread_, audio_track_->id(), nullptr,
214 set_streams_observer.get());
Steve Anton111fdfd2018-06-25 13:03:36 -0700215 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200216 EXPECT_CALL(*set_streams_observer, OnSetStreams());
217 audio_rtp_sender_->SetStreams({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800218 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
deadbeeffac06552015-11-25 11:26:01 -0800219 audio_rtp_sender_->SetSsrc(kAudioSsrc);
deadbeef20cb0c12017-02-01 20:27:00 -0800220 audio_rtp_sender_->GetOnDestroyedSignal()->connect(
221 this, &RtpSenderReceiverTest::OnAudioSenderDestroyed);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700222 VerifyVoiceChannelInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700223 }
224
Steve Anton02ee47c2018-01-10 16:26:06 -0800225 void CreateAudioRtpSenderWithNoTrack() {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800226 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200227 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800228 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
Steve Anton02ee47c2018-01-10 16:26:06 -0800229 }
230
deadbeef20cb0c12017-02-01 20:27:00 -0800231 void OnAudioSenderDestroyed() { audio_sender_destroyed_signal_fired_ = true; }
232
Seth Hampson2d2c8882018-05-16 16:02:32 -0700233 void CreateVideoRtpSender(uint32_t ssrc) {
234 CreateVideoRtpSender(false, ssrc);
235 }
236
pbos5214a0a2016-12-16 15:39:11 -0800237 void CreateVideoRtpSender() { CreateVideoRtpSender(false); }
238
Amit Hilbuch2297d332019-02-19 12:49:22 -0800239 cricket::StreamParams CreateSimulcastStreamParams(int num_layers) {
Florent Castelli892acf02018-10-01 22:47:20 +0200240 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +0100241 ssrcs.reserve(num_layers);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800242 for (int i = 0; i < num_layers; ++i) {
Florent Castelli892acf02018-10-01 22:47:20 +0200243 ssrcs.push_back(kVideoSsrcSimulcast + i);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800244 }
245 return cricket::CreateSimStreamParams("cname", ssrcs);
246 }
247
248 uint32_t CreateVideoRtpSender(const cricket::StreamParams& stream_params) {
Florent Castelli892acf02018-10-01 22:47:20 +0200249 video_media_channel_->AddSendStream(stream_params);
250 uint32_t primary_ssrc = stream_params.first_ssrc();
251 CreateVideoRtpSender(primary_ssrc);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800252 return primary_ssrc;
253 }
254
255 uint32_t CreateVideoRtpSenderWithSimulcast(
256 int num_layers = kVideoSimulcastLayerCount) {
257 return CreateVideoRtpSender(CreateSimulcastStreamParams(num_layers));
258 }
259
260 uint32_t CreateVideoRtpSenderWithSimulcast(
261 const std::vector<std::string>& rids) {
262 cricket::StreamParams stream_params =
263 CreateSimulcastStreamParams(rids.size());
264 std::vector<cricket::RidDescription> rid_descriptions;
265 absl::c_transform(
266 rids, std::back_inserter(rid_descriptions), [](const std::string& rid) {
267 return cricket::RidDescription(rid, cricket::RidDirection::kSend);
268 });
269 stream_params.set_rids(rid_descriptions);
270 return CreateVideoRtpSender(stream_params);
Florent Castelli892acf02018-10-01 22:47:20 +0200271 }
272
Seth Hampson2d2c8882018-05-16 16:02:32 -0700273 void CreateVideoRtpSender(bool is_screencast, uint32_t ssrc = kVideoSsrc) {
pbos5214a0a2016-12-16 15:39:11 -0800274 AddVideoTrack(is_screencast);
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200275 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200276 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200277 video_rtp_sender_ = VideoRtpSender::Create(
278 worker_thread_, video_track_->id(), set_streams_observer.get());
Steve Anton111fdfd2018-06-25 13:03:36 -0700279 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200280 EXPECT_CALL(*set_streams_observer, OnSetStreams());
281 video_rtp_sender_->SetStreams({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800282 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Seth Hampson2d2c8882018-05-16 16:02:32 -0700283 video_rtp_sender_->SetSsrc(ssrc);
284 VerifyVideoChannelInput(ssrc);
deadbeef70ab1a12015-09-28 16:53:55 -0700285 }
Steve Anton02ee47c2018-01-10 16:26:06 -0800286 void CreateVideoRtpSenderWithNoTrack() {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200287 video_rtp_sender_ =
288 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800289 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Steve Anton02ee47c2018-01-10 16:26:06 -0800290 }
291
deadbeef70ab1a12015-09-28 16:53:55 -0700292 void DestroyAudioRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700293 audio_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700294 VerifyVoiceChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700295 }
296
297 void DestroyVideoRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700298 video_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700299 VerifyVideoChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700300 }
301
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100302 void CreateAudioRtpReceiver(
303 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
Mirko Bonadei05cf6be2019-01-31 21:38:12 +0100304 audio_rtp_receiver_ =
Henrik Boströmc335b0e2021-04-08 07:25:38 +0200305 new AudioRtpReceiver(rtc::Thread::Current(), kAudioTrackId, streams,
306 /*is_unified_plan=*/true);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800307 audio_rtp_receiver_->SetMediaChannel(voice_media_channel_);
Steve Antond3679212018-01-17 17:41:02 -0800308 audio_rtp_receiver_->SetupMediaChannel(kAudioSsrc);
perkjd61bf802016-03-24 03:16:19 -0700309 audio_track_ = audio_rtp_receiver_->audio_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700310 VerifyVoiceChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700311 }
312
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100313 void CreateVideoRtpReceiver(
314 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
Mirko Bonadei05cf6be2019-01-31 21:38:12 +0100315 video_rtp_receiver_ =
316 new VideoRtpReceiver(rtc::Thread::Current(), kVideoTrackId, streams);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800317 video_rtp_receiver_->SetMediaChannel(video_media_channel_);
Steve Antond3679212018-01-17 17:41:02 -0800318 video_rtp_receiver_->SetupMediaChannel(kVideoSsrc);
perkjf0dcfe22016-03-10 18:32:00 +0100319 video_track_ = video_rtp_receiver_->video_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700320 VerifyVideoChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700321 }
322
Florent Castelli38332cd2018-11-20 14:08:06 +0100323 void CreateVideoRtpReceiverWithSimulcast(
324 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {},
325 int num_layers = kVideoSimulcastLayerCount) {
326 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +0100327 ssrcs.reserve(num_layers);
Florent Castelli38332cd2018-11-20 14:08:06 +0100328 for (int i = 0; i < num_layers; ++i)
329 ssrcs.push_back(kVideoSsrcSimulcast + i);
330 cricket::StreamParams stream_params =
331 cricket::CreateSimStreamParams("cname", ssrcs);
332 video_media_channel_->AddRecvStream(stream_params);
333 uint32_t primary_ssrc = stream_params.first_ssrc();
334
Mirko Bonadei05cf6be2019-01-31 21:38:12 +0100335 video_rtp_receiver_ =
336 new VideoRtpReceiver(rtc::Thread::Current(), kVideoTrackId, streams);
Florent Castelli38332cd2018-11-20 14:08:06 +0100337 video_rtp_receiver_->SetMediaChannel(video_media_channel_);
338 video_rtp_receiver_->SetupMediaChannel(primary_ssrc);
339 video_track_ = video_rtp_receiver_->video_track();
340 }
341
deadbeef70ab1a12015-09-28 16:53:55 -0700342 void DestroyAudioRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700343 audio_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700344 VerifyVoiceChannelNoOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700345 }
346
347 void DestroyVideoRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700348 video_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700349 VerifyVideoChannelNoOutput();
350 }
351
352 void VerifyVoiceChannelInput() { VerifyVoiceChannelInput(kAudioSsrc); }
353
354 void VerifyVoiceChannelInput(uint32_t ssrc) {
355 // Verify that the media channel has an audio source, and the stream isn't
356 // muted.
357 EXPECT_TRUE(voice_media_channel_->HasSource(ssrc));
358 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(ssrc));
359 }
360
361 void VerifyVideoChannelInput() { VerifyVideoChannelInput(kVideoSsrc); }
362
363 void VerifyVideoChannelInput(uint32_t ssrc) {
364 // Verify that the media channel has a video source,
365 EXPECT_TRUE(video_media_channel_->HasSource(ssrc));
366 }
367
368 void VerifyVoiceChannelNoInput() { VerifyVoiceChannelNoInput(kAudioSsrc); }
369
370 void VerifyVoiceChannelNoInput(uint32_t ssrc) {
371 // Verify that the media channel's source is reset.
372 EXPECT_FALSE(voice_media_channel_->HasSource(ssrc));
373 }
374
375 void VerifyVideoChannelNoInput() { VerifyVideoChannelNoInput(kVideoSsrc); }
376
377 void VerifyVideoChannelNoInput(uint32_t ssrc) {
378 // Verify that the media channel's source is reset.
379 EXPECT_FALSE(video_media_channel_->HasSource(ssrc));
380 }
381
382 void VerifyVoiceChannelOutput() {
383 // Verify that the volume is initialized to 1.
384 double volume;
385 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
386 EXPECT_EQ(1, volume);
387 }
388
389 void VerifyVideoChannelOutput() {
390 // Verify that the media channel has a sink.
391 EXPECT_TRUE(video_media_channel_->HasSink(kVideoSsrc));
392 }
393
394 void VerifyVoiceChannelNoOutput() {
395 // Verify that the volume is reset to 0.
396 double volume;
397 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
398 EXPECT_EQ(0, volume);
399 }
400
401 void VerifyVideoChannelNoOutput() {
402 // Verify that the media channel's sink is reset.
403 EXPECT_FALSE(video_media_channel_->HasSink(kVideoSsrc));
deadbeef70ab1a12015-09-28 16:53:55 -0700404 }
405
Amit Hilbuch2297d332019-02-19 12:49:22 -0800406 // Verifies that the encoding layers contain the specified RIDs.
407 bool VerifyEncodingLayers(const VideoRtpSender& sender,
408 const std::vector<std::string>& rids) {
409 bool has_failure = HasFailure();
410 RtpParameters parameters = sender.GetParameters();
411 std::vector<std::string> encoding_rids;
412 absl::c_transform(
413 parameters.encodings, std::back_inserter(encoding_rids),
414 [](const RtpEncodingParameters& encoding) { return encoding.rid; });
415 EXPECT_THAT(rids, ContainerEq(encoding_rids));
416 return has_failure || !HasFailure();
417 }
418
419 // Runs a test for disabling the encoding layers on the specified sender.
420 void RunDisableEncodingLayersTest(
421 const std::vector<std::string>& all_layers,
422 const std::vector<std::string>& disabled_layers,
423 VideoRtpSender* sender) {
424 std::vector<std::string> expected;
425 absl::c_copy_if(all_layers, std::back_inserter(expected),
426 [&disabled_layers](const std::string& rid) {
427 return !absl::c_linear_search(disabled_layers, rid);
428 });
429
430 EXPECT_TRUE(VerifyEncodingLayers(*sender, all_layers));
431 sender->DisableEncodingLayers(disabled_layers);
432 EXPECT_TRUE(VerifyEncodingLayers(*sender, expected));
433 }
434
435 // Runs a test for setting an encoding layer as inactive.
436 // This test assumes that some layers have already been disabled.
437 void RunSetLastLayerAsInactiveTest(VideoRtpSender* sender) {
438 auto parameters = sender->GetParameters();
439 if (parameters.encodings.size() == 0) {
440 return;
441 }
442
443 RtpEncodingParameters& encoding = parameters.encodings.back();
444 auto rid = encoding.rid;
445 EXPECT_TRUE(encoding.active);
446 encoding.active = false;
447 auto error = sender->SetParameters(parameters);
448 ASSERT_TRUE(error.ok());
449 parameters = sender->GetParameters();
450 RtpEncodingParameters& result_encoding = parameters.encodings.back();
451 EXPECT_EQ(rid, result_encoding.rid);
452 EXPECT_FALSE(result_encoding.active);
453 }
454
455 // Runs a test for disabling the encoding layers on a sender without a media
456 // channel.
457 void RunDisableSimulcastLayersWithoutMediaEngineTest(
458 const std::vector<std::string>& all_layers,
459 const std::vector<std::string>& disabled_layers) {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200460 auto sender = VideoRtpSender::Create(rtc::Thread::Current(), "1", nullptr);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800461 RtpParameters parameters;
462 parameters.encodings.resize(all_layers.size());
463 for (size_t i = 0; i < all_layers.size(); ++i) {
464 parameters.encodings[i].rid = all_layers[i];
465 }
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800466 sender->set_init_send_encodings(parameters.encodings);
467 RunDisableEncodingLayersTest(all_layers, disabled_layers, sender.get());
468 RunSetLastLayerAsInactiveTest(sender.get());
Amit Hilbuch2297d332019-02-19 12:49:22 -0800469 }
470
471 // Runs a test for disabling the encoding layers on a sender with a media
472 // channel.
473 void RunDisableSimulcastLayersWithMediaEngineTest(
474 const std::vector<std::string>& all_layers,
475 const std::vector<std::string>& disabled_layers) {
476 uint32_t ssrc = CreateVideoRtpSenderWithSimulcast(all_layers);
477 RunDisableEncodingLayersTest(all_layers, disabled_layers,
478 video_rtp_sender_.get());
479
480 auto channel_parameters = video_media_channel_->GetRtpSendParameters(ssrc);
481 ASSERT_EQ(channel_parameters.encodings.size(), all_layers.size());
482 for (size_t i = 0; i < all_layers.size(); ++i) {
483 EXPECT_EQ(all_layers[i], channel_parameters.encodings[i].rid);
484 bool is_active = !absl::c_linear_search(disabled_layers, all_layers[i]);
485 EXPECT_EQ(is_active, channel_parameters.encodings[i].active);
486 }
487
488 RunSetLastLayerAsInactiveTest(video_rtp_sender_.get());
489 }
490
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200491 // Check that minimum Jitter Buffer delay is propagated to the underlying
492 // |media_channel|.
493 void VerifyRtpReceiverDelayBehaviour(cricket::Delayable* media_channel,
494 RtpReceiverInterface* receiver,
495 uint32_t ssrc) {
496 receiver->SetJitterBufferMinimumDelay(/*delay_seconds=*/0.5);
497 absl::optional<int> delay_ms =
498 media_channel->GetBaseMinimumPlayoutDelayMs(ssrc); // In milliseconds.
499 EXPECT_DOUBLE_EQ(0.5, delay_ms.value_or(0) / 1000.0);
500 }
501
deadbeef70ab1a12015-09-28 16:53:55 -0700502 protected:
Steve Anton47136dd2018-01-12 10:49:35 -0800503 rtc::Thread* const network_thread_;
504 rtc::Thread* const worker_thread_;
Danil Chapovalov83bbe912019-08-07 12:24:53 +0200505 webrtc::RtcEventLogNull event_log_;
Zhi Huange830e682018-03-30 10:48:35 -0700506 // The |rtp_dtls_transport_| and |rtp_transport_| should be destroyed after
507 // the |channel_manager|.
508 std::unique_ptr<cricket::DtlsTransportInternal> rtp_dtls_transport_;
509 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport_;
Jonas Orelanda3aa9bd2019-04-17 07:38:40 +0200510 std::unique_ptr<webrtc::VideoBitrateAllocatorFactory>
511 video_bitrate_allocator_factory_;
deadbeef112b2e92017-02-10 20:13:37 -0800512 // |media_engine_| is actually owned by |channel_manager_|.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700513 cricket::FakeMediaEngine* media_engine_;
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200514 std::unique_ptr<cricket::ChannelManager> channel_manager_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700515 cricket::FakeCall fake_call_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700516 cricket::VoiceChannel* voice_channel_;
517 cricket::VideoChannel* video_channel_;
518 cricket::FakeVoiceMediaChannel* voice_media_channel_;
519 cricket::FakeVideoMediaChannel* video_media_channel_;
deadbeef70ab1a12015-09-28 16:53:55 -0700520 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
521 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
522 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
523 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
deadbeefe814a0d2017-02-25 18:15:09 -0800524 rtc::scoped_refptr<MediaStreamInterface> local_stream_;
deadbeef70ab1a12015-09-28 16:53:55 -0700525 rtc::scoped_refptr<VideoTrackInterface> video_track_;
526 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
deadbeef20cb0c12017-02-01 20:27:00 -0800527 bool audio_sender_destroyed_signal_fired_ = false;
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800528 rtc::UniqueRandomIdGenerator ssrc_generator_;
deadbeef70ab1a12015-09-28 16:53:55 -0700529};
530
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700531// Test that |voice_channel_| is updated when an audio track is associated
deadbeef70ab1a12015-09-28 16:53:55 -0700532// and disassociated with an AudioRtpSender.
533TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
534 CreateAudioRtpSender();
535 DestroyAudioRtpSender();
536}
537
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700538// Test that |video_channel_| is updated when a video track is associated and
deadbeef70ab1a12015-09-28 16:53:55 -0700539// disassociated with a VideoRtpSender.
540TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
541 CreateVideoRtpSender();
542 DestroyVideoRtpSender();
543}
544
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700545// Test that |voice_channel_| is updated when a remote audio track is
deadbeef70ab1a12015-09-28 16:53:55 -0700546// associated and disassociated with an AudioRtpReceiver.
547TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
548 CreateAudioRtpReceiver();
549 DestroyAudioRtpReceiver();
550}
551
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700552// Test that |video_channel_| is updated when a remote video track is
553// associated and disassociated with a VideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700554TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
555 CreateVideoRtpReceiver();
556 DestroyVideoRtpReceiver();
557}
558
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100559TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiverWithStreams) {
560 CreateAudioRtpReceiver({local_stream_});
561 DestroyAudioRtpReceiver();
562}
563
564TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiverWithStreams) {
565 CreateVideoRtpReceiver({local_stream_});
566 DestroyVideoRtpReceiver();
567}
568
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700569// Test that the AudioRtpSender applies options from the local audio source.
570TEST_F(RtpSenderReceiverTest, LocalAudioSourceOptionsApplied) {
571 cricket::AudioOptions options;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100572 options.echo_cancellation = true;
deadbeef757146b2017-02-10 21:26:48 -0800573 auto source = LocalAudioSource::Create(&options);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700574 CreateAudioRtpSender(source.get());
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700575
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100576 EXPECT_EQ(true, voice_media_channel_->options().echo_cancellation);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700577
578 DestroyAudioRtpSender();
579}
580
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700581// Test that the stream is muted when the track is disabled, and unmuted when
582// the track is enabled.
583TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) {
584 CreateAudioRtpSender();
585
586 audio_track_->set_enabled(false);
587 EXPECT_TRUE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
588
589 audio_track_->set_enabled(true);
590 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
591
592 DestroyAudioRtpSender();
593}
594
595// Test that the volume is set to 0 when the track is disabled, and back to
596// 1 when the track is enabled.
deadbeef70ab1a12015-09-28 16:53:55 -0700597TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
598 CreateAudioRtpReceiver();
599
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700600 double volume;
601 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
602 EXPECT_EQ(1, volume);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700603
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700604 audio_track_->set_enabled(false);
605 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
606 EXPECT_EQ(0, volume);
607
deadbeef70ab1a12015-09-28 16:53:55 -0700608 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700609 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
610 EXPECT_EQ(1, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700611
612 DestroyAudioRtpReceiver();
613}
614
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700615// Currently no action is taken when a remote video track is disabled or
616// enabled, so there's nothing to test here, other than what is normally
617// verified in DestroyVideoRtpSender.
deadbeef70ab1a12015-09-28 16:53:55 -0700618TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
619 CreateVideoRtpSender();
620
deadbeef70ab1a12015-09-28 16:53:55 -0700621 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700622 video_track_->set_enabled(true);
623
624 DestroyVideoRtpSender();
625}
626
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700627// Test that the state of the video track created by the VideoRtpReceiver is
628// updated when the receiver is destroyed.
perkjf0dcfe22016-03-10 18:32:00 +0100629TEST_F(RtpSenderReceiverTest, RemoteVideoTrackState) {
630 CreateVideoRtpReceiver();
631
632 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track_->state());
633 EXPECT_EQ(webrtc::MediaSourceInterface::kLive,
634 video_track_->GetSource()->state());
635
636 DestroyVideoRtpReceiver();
637
638 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track_->state());
639 EXPECT_EQ(webrtc::MediaSourceInterface::kEnded,
640 video_track_->GetSource()->state());
641}
642
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700643// Currently no action is taken when a remote video track is disabled or
644// enabled, so there's nothing to test here, other than what is normally
645// verified in DestroyVideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700646TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
647 CreateVideoRtpReceiver();
648
649 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700650 video_track_->set_enabled(true);
651
652 DestroyVideoRtpReceiver();
653}
654
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700655// Test that the AudioRtpReceiver applies volume changes from the track source
656// to the media channel.
deadbeef70ab1a12015-09-28 16:53:55 -0700657TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
658 CreateAudioRtpReceiver();
659
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700660 double volume;
661 audio_track_->GetSource()->SetVolume(0.5);
662 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
663 EXPECT_EQ(0.5, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700664
665 // Disable the audio track, this should prevent setting the volume.
deadbeef70ab1a12015-09-28 16:53:55 -0700666 audio_track_->set_enabled(false);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700667 audio_track_->GetSource()->SetVolume(0.8);
668 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
669 EXPECT_EQ(0, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700670
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700671 // When the track is enabled, the previously set volume should take effect.
deadbeef70ab1a12015-09-28 16:53:55 -0700672 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700673 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
674 EXPECT_EQ(0.8, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700675
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700676 // Try changing volume one more time.
677 audio_track_->GetSource()->SetVolume(0.9);
678 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
679 EXPECT_EQ(0.9, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700680
681 DestroyAudioRtpReceiver();
682}
683
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200684TEST_F(RtpSenderReceiverTest, AudioRtpReceiverDelay) {
685 CreateAudioRtpReceiver();
686 VerifyRtpReceiverDelayBehaviour(voice_media_channel_,
687 audio_rtp_receiver_.get(), kAudioSsrc);
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200688}
689
690TEST_F(RtpSenderReceiverTest, VideoRtpReceiverDelay) {
691 CreateVideoRtpReceiver();
692 VerifyRtpReceiverDelayBehaviour(video_media_channel_,
693 video_rtp_receiver_.get(), kVideoSsrc);
694}
695
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700696// Test that the media channel isn't enabled for sending if the audio sender
697// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800698TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800699 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800700 rtc::scoped_refptr<AudioTrackInterface> track =
701 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700702
703 // Track but no SSRC.
704 EXPECT_TRUE(audio_rtp_sender_->SetTrack(track));
705 VerifyVoiceChannelNoInput();
706
707 // SSRC but no track.
708 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
709 audio_rtp_sender_->SetSsrc(kAudioSsrc);
710 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800711}
712
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700713// Test that the media channel isn't enabled for sending if the video sender
714// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800715TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800716 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700717
718 // Track but no SSRC.
719 EXPECT_TRUE(video_rtp_sender_->SetTrack(video_track_));
720 VerifyVideoChannelNoInput();
721
722 // SSRC but no track.
723 EXPECT_TRUE(video_rtp_sender_->SetTrack(nullptr));
724 video_rtp_sender_->SetSsrc(kVideoSsrc);
725 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800726}
727
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700728// Test that the media channel is enabled for sending when the audio sender
729// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800730TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800731 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800732 rtc::scoped_refptr<AudioTrackInterface> track =
733 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700734 audio_rtp_sender_->SetSsrc(kAudioSsrc);
735 audio_rtp_sender_->SetTrack(track);
736 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800737
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700738 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800739}
740
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700741// Test that the media channel is enabled for sending when the audio sender
742// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800743TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800744 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800745 rtc::scoped_refptr<AudioTrackInterface> track =
746 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700747 audio_rtp_sender_->SetTrack(track);
748 audio_rtp_sender_->SetSsrc(kAudioSsrc);
749 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800750
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700751 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800752}
753
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700754// Test that the media channel is enabled for sending when the video sender
755// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800756TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
nisseaf510af2016-03-21 08:20:42 -0700757 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800758 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700759 video_rtp_sender_->SetSsrc(kVideoSsrc);
760 video_rtp_sender_->SetTrack(video_track_);
761 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800762
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700763 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800764}
765
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700766// Test that the media channel is enabled for sending when the video sender
767// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800768TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
nisseaf510af2016-03-21 08:20:42 -0700769 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800770 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700771 video_rtp_sender_->SetTrack(video_track_);
772 video_rtp_sender_->SetSsrc(kVideoSsrc);
773 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800774
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700775 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800776}
777
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700778// Test that the media channel stops sending when the audio sender's SSRC is set
779// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800780TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700781 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800782
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700783 audio_rtp_sender_->SetSsrc(0);
784 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800785}
786
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700787// Test that the media channel stops sending when the video sender's SSRC is set
788// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800789TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700790 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800791
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700792 audio_rtp_sender_->SetSsrc(0);
793 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800794}
795
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700796// Test that the media channel stops sending when the audio sender's track is
797// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800798TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700799 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800800
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700801 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
802 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800803}
804
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700805// Test that the media channel stops sending when the video sender's track is
806// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800807TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700808 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800809
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700810 video_rtp_sender_->SetSsrc(0);
811 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800812}
813
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700814// Test that when the audio sender's SSRC is changed, the media channel stops
815// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800816TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700817 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800818
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700819 audio_rtp_sender_->SetSsrc(kAudioSsrc2);
820 VerifyVoiceChannelNoInput(kAudioSsrc);
821 VerifyVoiceChannelInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800822
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700823 audio_rtp_sender_ = nullptr;
824 VerifyVoiceChannelNoInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800825}
826
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700827// Test that when the audio sender's SSRC is changed, the media channel stops
828// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800829TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700830 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800831
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700832 video_rtp_sender_->SetSsrc(kVideoSsrc2);
833 VerifyVideoChannelNoInput(kVideoSsrc);
834 VerifyVideoChannelInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800835
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700836 video_rtp_sender_ = nullptr;
837 VerifyVideoChannelNoInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800838}
839
skvladdc1c62c2016-03-16 19:07:43 -0700840TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) {
841 CreateAudioRtpSender();
842
skvladdc1c62c2016-03-16 19:07:43 -0700843 RtpParameters params = audio_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700844 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -0800845 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -0700846
847 DestroyAudioRtpSender();
848}
849
Florent Castelli892acf02018-10-01 22:47:20 +0200850TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParametersBeforeNegotiation) {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800851 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200852 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +0200853
854 RtpParameters params = audio_rtp_sender_->GetParameters();
855 ASSERT_EQ(1u, params.encodings.size());
856 params.encodings[0].max_bitrate_bps = 90000;
857 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
858
859 params = audio_rtp_sender_->GetParameters();
860 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
861 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
862
863 DestroyAudioRtpSender();
864}
865
866TEST_F(RtpSenderReceiverTest, AudioSenderInitParametersMovedAfterNegotiation) {
867 audio_track_ = AudioTrack::Create(kAudioTrackId, nullptr);
868 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
869
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200870 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200871 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200872 audio_rtp_sender_ = AudioRtpSender::Create(
873 worker_thread_, audio_track_->id(), nullptr, set_streams_observer.get());
Florent Castelli892acf02018-10-01 22:47:20 +0200874 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200875 EXPECT_CALL(*set_streams_observer, OnSetStreams());
876 audio_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli892acf02018-10-01 22:47:20 +0200877
878 std::vector<RtpEncodingParameters> init_encodings(1);
879 init_encodings[0].max_bitrate_bps = 60000;
880 audio_rtp_sender_->set_init_send_encodings(init_encodings);
881
882 RtpParameters params = audio_rtp_sender_->GetParameters();
883 ASSERT_EQ(1u, params.encodings.size());
884 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
885
886 // Simulate the setLocalDescription call
887 std::vector<uint32_t> ssrcs(1, 1);
888 cricket::StreamParams stream_params =
889 cricket::CreateSimStreamParams("cname", ssrcs);
890 voice_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800891 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +0200892 audio_rtp_sender_->SetSsrc(1);
893
894 params = audio_rtp_sender_->GetParameters();
895 ASSERT_EQ(1u, params.encodings.size());
896 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
897
898 DestroyAudioRtpSender();
899}
900
901TEST_F(RtpSenderReceiverTest,
902 AudioSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800903 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200904 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +0200905
906 RtpParameters params;
907 RTCError result = audio_rtp_sender_->SetParameters(params);
908 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
909 DestroyAudioRtpSender();
910}
911
Florent Castellicebf50f2018-05-03 15:31:53 +0200912TEST_F(RtpSenderReceiverTest,
913 AudioSenderMustCallGetParametersBeforeSetParameters) {
914 CreateAudioRtpSender();
915
916 RtpParameters params;
917 RTCError result = audio_rtp_sender_->SetParameters(params);
918 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
919
920 DestroyAudioRtpSender();
921}
922
923TEST_F(RtpSenderReceiverTest,
924 AudioSenderSetParametersInvalidatesTransactionId) {
925 CreateAudioRtpSender();
926
927 RtpParameters params = audio_rtp_sender_->GetParameters();
928 EXPECT_EQ(1u, params.encodings.size());
929 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
930 RTCError result = audio_rtp_sender_->SetParameters(params);
931 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
932
933 DestroyAudioRtpSender();
934}
935
936TEST_F(RtpSenderReceiverTest, AudioSenderDetectTransactionIdModification) {
937 CreateAudioRtpSender();
938
939 RtpParameters params = audio_rtp_sender_->GetParameters();
940 params.transaction_id = "";
941 RTCError result = audio_rtp_sender_->SetParameters(params);
942 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
943
944 DestroyAudioRtpSender();
945}
946
947TEST_F(RtpSenderReceiverTest, AudioSenderCheckTransactionIdRefresh) {
948 CreateAudioRtpSender();
949
950 RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200951 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 15:31:53 +0200952 auto saved_transaction_id = params.transaction_id;
953 params = audio_rtp_sender_->GetParameters();
954 EXPECT_NE(saved_transaction_id, params.transaction_id);
955
956 DestroyAudioRtpSender();
957}
958
959TEST_F(RtpSenderReceiverTest, AudioSenderSetParametersOldValueFail) {
960 CreateAudioRtpSender();
961
962 RtpParameters params = audio_rtp_sender_->GetParameters();
963 RtpParameters second_params = audio_rtp_sender_->GetParameters();
964
965 RTCError result = audio_rtp_sender_->SetParameters(params);
966 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
Seth Hampson2d2c8882018-05-16 16:02:32 -0700967 DestroyAudioRtpSender();
968}
969
970TEST_F(RtpSenderReceiverTest, AudioSenderCantSetUnimplementedRtpParameters) {
971 CreateAudioRtpSender();
972 RtpParameters params = audio_rtp_sender_->GetParameters();
973 EXPECT_EQ(1u, params.encodings.size());
974
Florent Castelli87b3c512018-07-18 16:00:28 +0200975 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 16:02:32 -0700976 params.mid = "dummy_mid";
977 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
978 audio_rtp_sender_->SetParameters(params).type());
979 params = audio_rtp_sender_->GetParameters();
980
Seth Hampson2d2c8882018-05-16 16:02:32 -0700981 DestroyAudioRtpSender();
982}
983
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700984TEST_F(RtpSenderReceiverTest, SetAudioMaxSendBitrate) {
985 CreateAudioRtpSender();
986
987 EXPECT_EQ(-1, voice_media_channel_->max_bps());
988 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200989 EXPECT_EQ(1U, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -0800990 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100991 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -0800992 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700993
994 // Read back the parameters and verify they have been changed.
995 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200996 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100997 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700998
999 // Verify that the audio channel received the new parameters.
1000 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001001 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001002 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001003
1004 // Verify that the global bitrate limit has not been changed.
1005 EXPECT_EQ(-1, voice_media_channel_->max_bps());
1006
1007 DestroyAudioRtpSender();
1008}
1009
Seth Hampson24722b32017-12-22 09:36:42 -08001010TEST_F(RtpSenderReceiverTest, SetAudioBitratePriority) {
1011 CreateAudioRtpSender();
1012
1013 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001014 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001015 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1016 params.encodings[0].bitrate_priority);
1017 double new_bitrate_priority = 2.0;
1018 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -08001019 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -08001020
1021 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001022 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001023 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1024
1025 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001026 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001027 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1028
1029 DestroyAudioRtpSender();
1030}
1031
skvladdc1c62c2016-03-16 19:07:43 -07001032TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) {
1033 CreateVideoRtpSender();
1034
skvladdc1c62c2016-03-16 19:07:43 -07001035 RtpParameters params = video_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001036 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -08001037 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -07001038
1039 DestroyVideoRtpSender();
1040}
1041
Florent Castelli892acf02018-10-01 22:47:20 +02001042TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParametersBeforeNegotiation) {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001043 video_rtp_sender_ =
1044 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +02001045
1046 RtpParameters params = video_rtp_sender_->GetParameters();
1047 ASSERT_EQ(1u, params.encodings.size());
1048 params.encodings[0].max_bitrate_bps = 90000;
1049 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1050
1051 params = video_rtp_sender_->GetParameters();
1052 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1053 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
1054
1055 DestroyVideoRtpSender();
1056}
1057
1058TEST_F(RtpSenderReceiverTest, VideoSenderInitParametersMovedAfterNegotiation) {
1059 AddVideoTrack(false);
1060
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001061 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001062 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001063 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1064 set_streams_observer.get());
Florent Castelli892acf02018-10-01 22:47:20 +02001065 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001066 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1067 video_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli892acf02018-10-01 22:47:20 +02001068
1069 std::vector<RtpEncodingParameters> init_encodings(2);
1070 init_encodings[0].max_bitrate_bps = 60000;
1071 init_encodings[1].max_bitrate_bps = 900000;
1072 video_rtp_sender_->set_init_send_encodings(init_encodings);
1073
1074 RtpParameters params = video_rtp_sender_->GetParameters();
1075 ASSERT_EQ(2u, params.encodings.size());
1076 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1077 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
1078
1079 // Simulate the setLocalDescription call
1080 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +01001081 ssrcs.reserve(2);
Florent Castelli892acf02018-10-01 22:47:20 +02001082 for (int i = 0; i < 2; ++i)
1083 ssrcs.push_back(kVideoSsrcSimulcast + i);
1084 cricket::StreamParams stream_params =
1085 cricket::CreateSimStreamParams("cname", ssrcs);
1086 video_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -08001087 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +02001088 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
1089
1090 params = video_rtp_sender_->GetParameters();
1091 ASSERT_EQ(2u, params.encodings.size());
1092 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1093 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
1094
1095 DestroyVideoRtpSender();
1096}
1097
1098TEST_F(RtpSenderReceiverTest,
1099 VideoSenderInitParametersMovedAfterManualSimulcastAndNegotiation) {
1100 AddVideoTrack(false);
1101
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001102 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001103 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001104 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1105 set_streams_observer.get());
Florent Castelli892acf02018-10-01 22:47:20 +02001106 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001107 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1108 video_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli892acf02018-10-01 22:47:20 +02001109
1110 std::vector<RtpEncodingParameters> init_encodings(1);
1111 init_encodings[0].max_bitrate_bps = 60000;
1112 video_rtp_sender_->set_init_send_encodings(init_encodings);
1113
1114 RtpParameters params = video_rtp_sender_->GetParameters();
1115 ASSERT_EQ(1u, params.encodings.size());
1116 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1117
1118 // Simulate the setLocalDescription call as if the user used SDP munging
1119 // to enable simulcast
1120 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +01001121 ssrcs.reserve(2);
Florent Castelli892acf02018-10-01 22:47:20 +02001122 for (int i = 0; i < 2; ++i)
1123 ssrcs.push_back(kVideoSsrcSimulcast + i);
1124 cricket::StreamParams stream_params =
1125 cricket::CreateSimStreamParams("cname", ssrcs);
1126 video_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -08001127 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +02001128 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
1129
1130 params = video_rtp_sender_->GetParameters();
1131 ASSERT_EQ(2u, params.encodings.size());
1132 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1133
1134 DestroyVideoRtpSender();
1135}
1136
1137TEST_F(RtpSenderReceiverTest,
1138 VideoSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001139 video_rtp_sender_ =
1140 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +02001141
1142 RtpParameters params;
1143 RTCError result = video_rtp_sender_->SetParameters(params);
1144 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1145 DestroyVideoRtpSender();
1146}
1147
Florent Castellicebf50f2018-05-03 15:31:53 +02001148TEST_F(RtpSenderReceiverTest,
1149 VideoSenderMustCallGetParametersBeforeSetParameters) {
1150 CreateVideoRtpSender();
1151
1152 RtpParameters params;
1153 RTCError result = video_rtp_sender_->SetParameters(params);
1154 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1155
1156 DestroyVideoRtpSender();
1157}
1158
1159TEST_F(RtpSenderReceiverTest,
1160 VideoSenderSetParametersInvalidatesTransactionId) {
1161 CreateVideoRtpSender();
1162
1163 RtpParameters params = video_rtp_sender_->GetParameters();
1164 EXPECT_EQ(1u, params.encodings.size());
1165 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1166 RTCError result = video_rtp_sender_->SetParameters(params);
1167 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1168
1169 DestroyVideoRtpSender();
1170}
1171
1172TEST_F(RtpSenderReceiverTest, VideoSenderDetectTransactionIdModification) {
1173 CreateVideoRtpSender();
1174
1175 RtpParameters params = video_rtp_sender_->GetParameters();
1176 params.transaction_id = "";
1177 RTCError result = video_rtp_sender_->SetParameters(params);
1178 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1179
1180 DestroyVideoRtpSender();
1181}
1182
1183TEST_F(RtpSenderReceiverTest, VideoSenderCheckTransactionIdRefresh) {
1184 CreateVideoRtpSender();
1185
1186 RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001187 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 15:31:53 +02001188 auto saved_transaction_id = params.transaction_id;
1189 params = video_rtp_sender_->GetParameters();
1190 EXPECT_NE(saved_transaction_id, params.transaction_id);
1191
1192 DestroyVideoRtpSender();
1193}
1194
1195TEST_F(RtpSenderReceiverTest, VideoSenderSetParametersOldValueFail) {
1196 CreateVideoRtpSender();
1197
1198 RtpParameters params = video_rtp_sender_->GetParameters();
1199 RtpParameters second_params = video_rtp_sender_->GetParameters();
1200
1201 RTCError result = video_rtp_sender_->SetParameters(params);
1202 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1203
1204 DestroyVideoRtpSender();
1205}
1206
Seth Hampson2d2c8882018-05-16 16:02:32 -07001207TEST_F(RtpSenderReceiverTest, VideoSenderCantSetUnimplementedRtpParameters) {
1208 CreateVideoRtpSender();
1209 RtpParameters params = video_rtp_sender_->GetParameters();
1210 EXPECT_EQ(1u, params.encodings.size());
1211
Florent Castelli87b3c512018-07-18 16:00:28 +02001212 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 16:02:32 -07001213 params.mid = "dummy_mid";
1214 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1215 video_rtp_sender_->SetParameters(params).type());
1216 params = video_rtp_sender_->GetParameters();
1217
Seth Hampson2d2c8882018-05-16 16:02:32 -07001218 DestroyVideoRtpSender();
1219}
1220
Florent Castellic1a0bcb2019-01-29 14:26:48 +01001221TEST_F(RtpSenderReceiverTest, VideoSenderCanSetScaleResolutionDownBy) {
1222 CreateVideoRtpSender();
1223
1224 RtpParameters params = video_rtp_sender_->GetParameters();
1225 params.encodings[0].scale_resolution_down_by = 2;
1226
1227 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1228 params = video_rtp_sender_->GetParameters();
1229 EXPECT_EQ(2, params.encodings[0].scale_resolution_down_by);
1230
1231 DestroyVideoRtpSender();
1232}
1233
1234TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidScaleResolutionDownBy) {
1235 CreateVideoRtpSender();
1236
1237 RtpParameters params = video_rtp_sender_->GetParameters();
1238 params.encodings[0].scale_resolution_down_by = 0.5;
1239 RTCError result = video_rtp_sender_->SetParameters(params);
1240 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1241
1242 DestroyVideoRtpSender();
1243}
1244
Florent Castelli907dc802019-12-06 15:03:19 +01001245TEST_F(RtpSenderReceiverTest, VideoSenderCanSetMaxFramerate) {
1246 CreateVideoRtpSender();
1247
1248 RtpParameters params = video_rtp_sender_->GetParameters();
1249 params.encodings[0].max_framerate = 20;
1250
1251 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1252 params = video_rtp_sender_->GetParameters();
1253 EXPECT_EQ(20., params.encodings[0].max_framerate);
1254
1255 DestroyVideoRtpSender();
1256}
1257
1258TEST_F(RtpSenderReceiverTest, VideoSenderCanSetMaxFramerateZero) {
1259 CreateVideoRtpSender();
1260
1261 RtpParameters params = video_rtp_sender_->GetParameters();
1262 params.encodings[0].max_framerate = 0.;
1263
1264 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1265 params = video_rtp_sender_->GetParameters();
1266 EXPECT_EQ(0., params.encodings[0].max_framerate);
1267
1268 DestroyVideoRtpSender();
1269}
1270
1271TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidMaxFramerate) {
1272 CreateVideoRtpSender();
1273
1274 RtpParameters params = video_rtp_sender_->GetParameters();
1275 params.encodings[0].max_framerate = -5.;
1276 RTCError result = video_rtp_sender_->SetParameters(params);
1277 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1278
1279 DestroyVideoRtpSender();
1280}
1281
Seth Hampson2d2c8882018-05-16 16:02:32 -07001282// A video sender can have multiple simulcast layers, in which case it will
1283// contain multiple RtpEncodingParameters. This tests that if this is the case
1284// (simulcast), then we can't set the bitrate_priority, or max_bitrate_bps
1285// for any encodings besides at index 0, because these are both implemented
1286// "per-sender."
1287TEST_F(RtpSenderReceiverTest, VideoSenderCantSetPerSenderEncodingParameters) {
1288 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001289 CreateVideoRtpSenderWithSimulcast();
Seth Hampson2d2c8882018-05-16 16:02:32 -07001290 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001291 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Seth Hampson2d2c8882018-05-16 16:02:32 -07001292
1293 params.encodings[1].bitrate_priority = 2.0;
1294 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1295 video_rtp_sender_->SetParameters(params).type());
1296 params = video_rtp_sender_->GetParameters();
1297
Seth Hampson2d2c8882018-05-16 16:02:32 -07001298 DestroyVideoRtpSender();
1299}
1300
Florent Castelli892acf02018-10-01 22:47:20 +02001301TEST_F(RtpSenderReceiverTest, VideoSenderCantSetReadOnlyEncodingParameters) {
1302 // Add a simulcast specific send stream that contains 2 encoding parameters.
1303 CreateVideoRtpSenderWithSimulcast();
1304 RtpParameters params = video_rtp_sender_->GetParameters();
1305 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
1306
1307 for (size_t i = 0; i < params.encodings.size(); i++) {
1308 params.encodings[i].ssrc = 1337;
1309 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION,
1310 video_rtp_sender_->SetParameters(params).type());
1311 params = video_rtp_sender_->GetParameters();
1312 }
1313
1314 DestroyVideoRtpSender();
1315}
1316
Ă…sa Persson55659812018-06-18 17:51:32 +02001317TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrate) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001318 CreateVideoRtpSender();
1319
1320 EXPECT_EQ(-1, video_media_channel_->max_bps());
1321 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001322 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001323 EXPECT_FALSE(params.encodings[0].min_bitrate_bps);
deadbeefe702b302017-02-04 12:09:01 -08001324 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Ă…sa Persson55659812018-06-18 17:51:32 +02001325 params.encodings[0].min_bitrate_bps = 100;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001326 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -08001327 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001328
1329 // Read back the parameters and verify they have been changed.
1330 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001331 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001332 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001333 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001334
1335 // Verify that the video channel received the new parameters.
1336 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001337 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001338 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001339 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001340
1341 // Verify that the global bitrate limit has not been changed.
1342 EXPECT_EQ(-1, video_media_channel_->max_bps());
1343
1344 DestroyVideoRtpSender();
1345}
1346
Ă…sa Persson55659812018-06-18 17:51:32 +02001347TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrateSimulcast) {
1348 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001349 CreateVideoRtpSenderWithSimulcast();
Ă…sa Persson55659812018-06-18 17:51:32 +02001350
1351 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001352 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001353 params.encodings[0].min_bitrate_bps = 100;
1354 params.encodings[0].max_bitrate_bps = 1000;
1355 params.encodings[1].min_bitrate_bps = 200;
1356 params.encodings[1].max_bitrate_bps = 2000;
1357 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1358
1359 // Verify that the video channel received the new parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001360 params = video_media_channel_->GetRtpSendParameters(kVideoSsrcSimulcast);
1361 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001362 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
1363 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
1364 EXPECT_EQ(200, params.encodings[1].min_bitrate_bps);
1365 EXPECT_EQ(2000, params.encodings[1].max_bitrate_bps);
1366
1367 DestroyVideoRtpSender();
1368}
1369
Seth Hampson24722b32017-12-22 09:36:42 -08001370TEST_F(RtpSenderReceiverTest, SetVideoBitratePriority) {
1371 CreateVideoRtpSender();
1372
1373 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001374 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001375 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1376 params.encodings[0].bitrate_priority);
1377 double new_bitrate_priority = 2.0;
1378 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -08001379 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -08001380
1381 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001382 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001383 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1384
1385 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001386 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001387 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1388
1389 DestroyVideoRtpSender();
1390}
1391
Florent Castelli38332cd2018-11-20 14:08:06 +01001392TEST_F(RtpSenderReceiverTest, VideoReceiverCanGetParametersWithSimulcast) {
1393 CreateVideoRtpReceiverWithSimulcast({}, 2);
1394
1395 RtpParameters params = video_rtp_receiver_->GetParameters();
1396 EXPECT_EQ(2u, params.encodings.size());
1397
1398 DestroyVideoRtpReceiver();
1399}
1400
pbos5214a0a2016-12-16 15:39:11 -08001401// Test that makes sure that a video track content hint translates to the proper
1402// value for sources that are not screencast.
1403TEST_F(RtpSenderReceiverTest, PropagatesVideoTrackContentHint) {
1404 CreateVideoRtpSender();
1405
1406 video_track_->set_enabled(true);
1407
1408 // |video_track_| is not screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001409 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001410 // No content hint should be set by default.
1411 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1412 video_track_->content_hint());
1413 // Setting detailed should turn a non-screencast source into screencast mode.
1414 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001415 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001416 // Removing the content hint should turn the track back into non-screencast
1417 // mode.
1418 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001419 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001420 // Setting fluid should remain in non-screencast mode (its default).
1421 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001422 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 08:53:10 +02001423 // Setting text should have the same effect as Detailed
1424 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
1425 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001426
1427 DestroyVideoRtpSender();
1428}
1429
1430// Test that makes sure that a video track content hint translates to the proper
1431// value for screencast sources.
1432TEST_F(RtpSenderReceiverTest,
1433 PropagatesVideoTrackContentHintForScreencastSource) {
1434 CreateVideoRtpSender(true);
1435
1436 video_track_->set_enabled(true);
1437
1438 // |video_track_| with a screencast source should be screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001439 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001440 // No content hint should be set by default.
1441 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1442 video_track_->content_hint());
1443 // Setting fluid should turn a screencast source into non-screencast mode.
1444 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001445 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001446 // Removing the content hint should turn the track back into screencast mode.
1447 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001448 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001449 // Setting detailed should still remain in screencast mode (its default).
1450 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001451 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 08:53:10 +02001452 // Setting text should have the same effect as Detailed
1453 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
1454 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001455
1456 DestroyVideoRtpSender();
1457}
1458
1459// Test that makes sure any content hints that are set on a track before
1460// VideoRtpSender is ready to send are still applied when it gets ready to send.
1461TEST_F(RtpSenderReceiverTest,
1462 PropagatesVideoTrackContentHintSetBeforeEnabling) {
1463 AddVideoTrack();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001464 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001465 std::make_unique<MockSetStreamsObserver>();
pbos5214a0a2016-12-16 15:39:11 -08001466 // Setting detailed overrides the default non-screencast mode. This should be
1467 // applied even if the track is set on construction.
1468 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001469 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1470 set_streams_observer.get());
Steve Anton111fdfd2018-06-25 13:03:36 -07001471 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001472 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1473 video_rtp_sender_->SetStreams({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -08001474 video_rtp_sender_->SetMediaChannel(video_media_channel_);
pbos5214a0a2016-12-16 15:39:11 -08001475 video_track_->set_enabled(true);
1476
1477 // Sender is not ready to send (no SSRC) so no option should have been set.
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001478 EXPECT_EQ(absl::nullopt, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001479
1480 // Verify that the content hint is accounted for when video_rtp_sender_ does
1481 // get enabled.
1482 video_rtp_sender_->SetSsrc(kVideoSsrc);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001483 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001484
1485 // And removing the hint should go back to false (to verify that false was
1486 // default correctly).
1487 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001488 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001489
1490 DestroyVideoRtpSender();
1491}
1492
deadbeef20cb0c12017-02-01 20:27:00 -08001493TEST_F(RtpSenderReceiverTest, AudioSenderHasDtmfSender) {
1494 CreateAudioRtpSender();
1495 EXPECT_NE(nullptr, audio_rtp_sender_->GetDtmfSender());
1496}
1497
1498TEST_F(RtpSenderReceiverTest, VideoSenderDoesNotHaveDtmfSender) {
1499 CreateVideoRtpSender();
1500 EXPECT_EQ(nullptr, video_rtp_sender_->GetDtmfSender());
1501}
1502
1503// Test that the DTMF sender is really using |voice_channel_|, and thus returns
1504// true/false from CanSendDtmf based on what |voice_channel_| returns.
1505TEST_F(RtpSenderReceiverTest, CanInsertDtmf) {
1506 AddDtmfCodec();
1507 CreateAudioRtpSender();
1508 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1509 ASSERT_NE(nullptr, dtmf_sender);
1510 EXPECT_TRUE(dtmf_sender->CanInsertDtmf());
1511}
1512
1513TEST_F(RtpSenderReceiverTest, CanNotInsertDtmf) {
1514 CreateAudioRtpSender();
1515 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1516 ASSERT_NE(nullptr, dtmf_sender);
1517 // DTMF codec has not been added, as it was in the above test.
1518 EXPECT_FALSE(dtmf_sender->CanInsertDtmf());
1519}
1520
1521TEST_F(RtpSenderReceiverTest, InsertDtmf) {
1522 AddDtmfCodec();
1523 CreateAudioRtpSender();
1524 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1525 ASSERT_NE(nullptr, dtmf_sender);
1526
1527 EXPECT_EQ(0U, voice_media_channel_->dtmf_info_queue().size());
1528
1529 // Insert DTMF
1530 const int expected_duration = 90;
1531 dtmf_sender->InsertDtmf("012", expected_duration, 100);
1532
1533 // Verify
1534 ASSERT_EQ_WAIT(3U, voice_media_channel_->dtmf_info_queue().size(),
1535 kDefaultTimeout);
1536 const uint32_t send_ssrc =
1537 voice_media_channel_->send_streams()[0].first_ssrc();
1538 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[0],
1539 send_ssrc, 0, expected_duration));
1540 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[1],
1541 send_ssrc, 1, expected_duration));
1542 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[2],
1543 send_ssrc, 2, expected_duration));
1544}
1545
1546// Make sure the signal from "GetOnDestroyedSignal()" fires when the sender is
1547// destroyed, which is needed for the DTMF sender.
1548TEST_F(RtpSenderReceiverTest, TestOnDestroyedSignal) {
1549 CreateAudioRtpSender();
1550 EXPECT_FALSE(audio_sender_destroyed_signal_fired_);
1551 audio_rtp_sender_ = nullptr;
1552 EXPECT_TRUE(audio_sender_destroyed_signal_fired_);
1553}
1554
Benjamin Wright84583f62018-10-04 14:22:34 -07001555// Validate that the default FrameEncryptor setting is nullptr.
1556TEST_F(RtpSenderReceiverTest, AudioSenderCanSetFrameEncryptor) {
1557 CreateAudioRtpSender();
1558 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1559 new FakeFrameEncryptor());
1560 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1561 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1562 EXPECT_EQ(fake_frame_encryptor.get(),
1563 audio_rtp_sender_->GetFrameEncryptor().get());
1564}
1565
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001566// Validate that setting a FrameEncryptor after the send stream is stopped does
1567// nothing.
1568TEST_F(RtpSenderReceiverTest, AudioSenderCannotSetFrameEncryptorAfterStop) {
1569 CreateAudioRtpSender();
1570 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1571 new FakeFrameEncryptor());
1572 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1573 audio_rtp_sender_->Stop();
1574 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1575 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1576}
1577
Benjamin Wright84583f62018-10-04 14:22:34 -07001578// Validate that the default FrameEncryptor setting is nullptr.
1579TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetFrameDecryptor) {
1580 CreateAudioRtpReceiver();
1581 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1582 new FakeFrameDecryptor());
1583 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
1584 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1585 EXPECT_EQ(fake_frame_decryptor.get(),
1586 audio_rtp_receiver_->GetFrameDecryptor().get());
1587}
1588
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001589// Validate that the default FrameEncryptor setting is nullptr.
1590TEST_F(RtpSenderReceiverTest, AudioReceiverCannotSetFrameDecryptorAfterStop) {
1591 CreateAudioRtpReceiver();
1592 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1593 new FakeFrameDecryptor());
1594 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
1595 audio_rtp_receiver_->Stop();
1596 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1597 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1598}
1599
1600// Validate that the default FrameEncryptor setting is nullptr.
1601TEST_F(RtpSenderReceiverTest, VideoSenderCanSetFrameEncryptor) {
1602 CreateVideoRtpSender();
1603 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1604 new FakeFrameEncryptor());
1605 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1606 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1607 EXPECT_EQ(fake_frame_encryptor.get(),
1608 video_rtp_sender_->GetFrameEncryptor().get());
1609}
1610
1611// Validate that setting a FrameEncryptor after the send stream is stopped does
1612// nothing.
1613TEST_F(RtpSenderReceiverTest, VideoSenderCannotSetFrameEncryptorAfterStop) {
1614 CreateVideoRtpSender();
1615 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1616 new FakeFrameEncryptor());
1617 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1618 video_rtp_sender_->Stop();
1619 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1620 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1621}
1622
1623// Validate that the default FrameEncryptor setting is nullptr.
1624TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetFrameDecryptor) {
1625 CreateVideoRtpReceiver();
1626 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1627 new FakeFrameDecryptor());
1628 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
1629 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1630 EXPECT_EQ(fake_frame_decryptor.get(),
1631 video_rtp_receiver_->GetFrameDecryptor().get());
1632}
1633
1634// Validate that the default FrameEncryptor setting is nullptr.
1635TEST_F(RtpSenderReceiverTest, VideoReceiverCannotSetFrameDecryptorAfterStop) {
1636 CreateVideoRtpReceiver();
1637 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1638 new FakeFrameDecryptor());
1639 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
1640 video_rtp_receiver_->Stop();
1641 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1642 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1643}
1644
Amit Hilbuch619b2942019-02-26 15:55:19 -08001645// Checks that calling the internal methods for get/set parameters do not
1646// invalidate any parameters retreived by clients.
1647TEST_F(RtpSenderReceiverTest,
1648 InternalParameterMethodsDoNotInvalidateTransaction) {
1649 CreateVideoRtpSender();
1650 RtpParameters parameters = video_rtp_sender_->GetParameters();
1651 RtpParameters new_parameters = video_rtp_sender_->GetParametersInternal();
1652 new_parameters.encodings[0].active = false;
1653 video_rtp_sender_->SetParametersInternal(new_parameters);
1654 new_parameters.encodings[0].active = true;
1655 video_rtp_sender_->SetParametersInternal(new_parameters);
1656 parameters.encodings[0].active = false;
1657 EXPECT_TRUE(video_rtp_sender_->SetParameters(parameters).ok());
1658}
1659
Amit Hilbuch2297d332019-02-19 12:49:22 -08001660// Helper method for syntactic sugar for accepting a vector with '{}' notation.
1661std::pair<RidList, RidList> CreatePairOfRidVectors(
1662 const std::vector<std::string>& first,
1663 const std::vector<std::string>& second) {
1664 return std::make_pair(first, second);
1665}
1666
1667// These parameters are used to test disabling simulcast layers.
1668const std::pair<RidList, RidList> kDisableSimulcastLayersParameters[] = {
1669 // Tests removing the first layer. This is a special case because
1670 // the first layer's SSRC is also the 'primary' SSRC used to associate the
1671 // parameters to the media channel.
1672 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"1"}),
1673 // Tests removing some layers.
1674 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"2", "4"}),
1675 // Tests simulcast rejected scenario all layers except first are rejected.
1676 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"2", "3", "4"}),
1677 // Tests removing all layers.
1678 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"1", "2", "3", "4"}),
1679};
1680
1681// Runs test for disabling layers on a sender without a media engine set.
1682TEST_P(RtpSenderReceiverTest, DisableSimulcastLayersWithoutMediaEngine) {
1683 auto parameter = GetParam();
1684 RunDisableSimulcastLayersWithoutMediaEngineTest(parameter.first,
1685 parameter.second);
1686}
1687
1688// Runs test for disabling layers on a sender with a media engine set.
1689TEST_P(RtpSenderReceiverTest, DisableSimulcastLayersWithMediaEngine) {
1690 auto parameter = GetParam();
1691 RunDisableSimulcastLayersWithMediaEngineTest(parameter.first,
1692 parameter.second);
1693}
1694
1695INSTANTIATE_TEST_SUITE_P(
1696 DisableSimulcastLayersInSender,
1697 RtpSenderReceiverTest,
1698 ::testing::ValuesIn(kDisableSimulcastLayersParameters));
1699
deadbeef70ab1a12015-09-28 16:53:55 -07001700} // namespace webrtc