blob: 4d6d58d8f662e429264d47a0538f06b2deea8747 [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_ =
305 new AudioRtpReceiver(rtc::Thread::Current(), kAudioTrackId, streams);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800306 audio_rtp_receiver_->SetMediaChannel(voice_media_channel_);
Steve Antond3679212018-01-17 17:41:02 -0800307 audio_rtp_receiver_->SetupMediaChannel(kAudioSsrc);
perkjd61bf802016-03-24 03:16:19 -0700308 audio_track_ = audio_rtp_receiver_->audio_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700309 VerifyVoiceChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700310 }
311
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100312 void CreateVideoRtpReceiver(
313 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
Mirko Bonadei05cf6be2019-01-31 21:38:12 +0100314 video_rtp_receiver_ =
315 new VideoRtpReceiver(rtc::Thread::Current(), kVideoTrackId, streams);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800316 video_rtp_receiver_->SetMediaChannel(video_media_channel_);
Steve Antond3679212018-01-17 17:41:02 -0800317 video_rtp_receiver_->SetupMediaChannel(kVideoSsrc);
perkjf0dcfe22016-03-10 18:32:00 +0100318 video_track_ = video_rtp_receiver_->video_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700319 VerifyVideoChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700320 }
321
Florent Castelli38332cd2018-11-20 14:08:06 +0100322 void CreateVideoRtpReceiverWithSimulcast(
323 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {},
324 int num_layers = kVideoSimulcastLayerCount) {
325 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +0100326 ssrcs.reserve(num_layers);
Florent Castelli38332cd2018-11-20 14:08:06 +0100327 for (int i = 0; i < num_layers; ++i)
328 ssrcs.push_back(kVideoSsrcSimulcast + i);
329 cricket::StreamParams stream_params =
330 cricket::CreateSimStreamParams("cname", ssrcs);
331 video_media_channel_->AddRecvStream(stream_params);
332 uint32_t primary_ssrc = stream_params.first_ssrc();
333
Mirko Bonadei05cf6be2019-01-31 21:38:12 +0100334 video_rtp_receiver_ =
335 new VideoRtpReceiver(rtc::Thread::Current(), kVideoTrackId, streams);
Florent Castelli38332cd2018-11-20 14:08:06 +0100336 video_rtp_receiver_->SetMediaChannel(video_media_channel_);
337 video_rtp_receiver_->SetupMediaChannel(primary_ssrc);
338 video_track_ = video_rtp_receiver_->video_track();
339 }
340
deadbeef70ab1a12015-09-28 16:53:55 -0700341 void DestroyAudioRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700342 audio_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700343 VerifyVoiceChannelNoOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700344 }
345
346 void DestroyVideoRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700347 video_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700348 VerifyVideoChannelNoOutput();
349 }
350
351 void VerifyVoiceChannelInput() { VerifyVoiceChannelInput(kAudioSsrc); }
352
353 void VerifyVoiceChannelInput(uint32_t ssrc) {
354 // Verify that the media channel has an audio source, and the stream isn't
355 // muted.
356 EXPECT_TRUE(voice_media_channel_->HasSource(ssrc));
357 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(ssrc));
358 }
359
360 void VerifyVideoChannelInput() { VerifyVideoChannelInput(kVideoSsrc); }
361
362 void VerifyVideoChannelInput(uint32_t ssrc) {
363 // Verify that the media channel has a video source,
364 EXPECT_TRUE(video_media_channel_->HasSource(ssrc));
365 }
366
367 void VerifyVoiceChannelNoInput() { VerifyVoiceChannelNoInput(kAudioSsrc); }
368
369 void VerifyVoiceChannelNoInput(uint32_t ssrc) {
370 // Verify that the media channel's source is reset.
371 EXPECT_FALSE(voice_media_channel_->HasSource(ssrc));
372 }
373
374 void VerifyVideoChannelNoInput() { VerifyVideoChannelNoInput(kVideoSsrc); }
375
376 void VerifyVideoChannelNoInput(uint32_t ssrc) {
377 // Verify that the media channel's source is reset.
378 EXPECT_FALSE(video_media_channel_->HasSource(ssrc));
379 }
380
381 void VerifyVoiceChannelOutput() {
382 // Verify that the volume is initialized to 1.
383 double volume;
384 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
385 EXPECT_EQ(1, volume);
386 }
387
388 void VerifyVideoChannelOutput() {
389 // Verify that the media channel has a sink.
390 EXPECT_TRUE(video_media_channel_->HasSink(kVideoSsrc));
391 }
392
393 void VerifyVoiceChannelNoOutput() {
394 // Verify that the volume is reset to 0.
395 double volume;
396 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
397 EXPECT_EQ(0, volume);
398 }
399
400 void VerifyVideoChannelNoOutput() {
401 // Verify that the media channel's sink is reset.
402 EXPECT_FALSE(video_media_channel_->HasSink(kVideoSsrc));
deadbeef70ab1a12015-09-28 16:53:55 -0700403 }
404
Amit Hilbuch2297d332019-02-19 12:49:22 -0800405 // Verifies that the encoding layers contain the specified RIDs.
406 bool VerifyEncodingLayers(const VideoRtpSender& sender,
407 const std::vector<std::string>& rids) {
408 bool has_failure = HasFailure();
409 RtpParameters parameters = sender.GetParameters();
410 std::vector<std::string> encoding_rids;
411 absl::c_transform(
412 parameters.encodings, std::back_inserter(encoding_rids),
413 [](const RtpEncodingParameters& encoding) { return encoding.rid; });
414 EXPECT_THAT(rids, ContainerEq(encoding_rids));
415 return has_failure || !HasFailure();
416 }
417
418 // Runs a test for disabling the encoding layers on the specified sender.
419 void RunDisableEncodingLayersTest(
420 const std::vector<std::string>& all_layers,
421 const std::vector<std::string>& disabled_layers,
422 VideoRtpSender* sender) {
423 std::vector<std::string> expected;
424 absl::c_copy_if(all_layers, std::back_inserter(expected),
425 [&disabled_layers](const std::string& rid) {
426 return !absl::c_linear_search(disabled_layers, rid);
427 });
428
429 EXPECT_TRUE(VerifyEncodingLayers(*sender, all_layers));
430 sender->DisableEncodingLayers(disabled_layers);
431 EXPECT_TRUE(VerifyEncodingLayers(*sender, expected));
432 }
433
434 // Runs a test for setting an encoding layer as inactive.
435 // This test assumes that some layers have already been disabled.
436 void RunSetLastLayerAsInactiveTest(VideoRtpSender* sender) {
437 auto parameters = sender->GetParameters();
438 if (parameters.encodings.size() == 0) {
439 return;
440 }
441
442 RtpEncodingParameters& encoding = parameters.encodings.back();
443 auto rid = encoding.rid;
444 EXPECT_TRUE(encoding.active);
445 encoding.active = false;
446 auto error = sender->SetParameters(parameters);
447 ASSERT_TRUE(error.ok());
448 parameters = sender->GetParameters();
449 RtpEncodingParameters& result_encoding = parameters.encodings.back();
450 EXPECT_EQ(rid, result_encoding.rid);
451 EXPECT_FALSE(result_encoding.active);
452 }
453
454 // Runs a test for disabling the encoding layers on a sender without a media
455 // channel.
456 void RunDisableSimulcastLayersWithoutMediaEngineTest(
457 const std::vector<std::string>& all_layers,
458 const std::vector<std::string>& disabled_layers) {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200459 auto sender = VideoRtpSender::Create(rtc::Thread::Current(), "1", nullptr);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800460 RtpParameters parameters;
461 parameters.encodings.resize(all_layers.size());
462 for (size_t i = 0; i < all_layers.size(); ++i) {
463 parameters.encodings[i].rid = all_layers[i];
464 }
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800465 sender->set_init_send_encodings(parameters.encodings);
466 RunDisableEncodingLayersTest(all_layers, disabled_layers, sender.get());
467 RunSetLastLayerAsInactiveTest(sender.get());
Amit Hilbuch2297d332019-02-19 12:49:22 -0800468 }
469
470 // Runs a test for disabling the encoding layers on a sender with a media
471 // channel.
472 void RunDisableSimulcastLayersWithMediaEngineTest(
473 const std::vector<std::string>& all_layers,
474 const std::vector<std::string>& disabled_layers) {
475 uint32_t ssrc = CreateVideoRtpSenderWithSimulcast(all_layers);
476 RunDisableEncodingLayersTest(all_layers, disabled_layers,
477 video_rtp_sender_.get());
478
479 auto channel_parameters = video_media_channel_->GetRtpSendParameters(ssrc);
480 ASSERT_EQ(channel_parameters.encodings.size(), all_layers.size());
481 for (size_t i = 0; i < all_layers.size(); ++i) {
482 EXPECT_EQ(all_layers[i], channel_parameters.encodings[i].rid);
483 bool is_active = !absl::c_linear_search(disabled_layers, all_layers[i]);
484 EXPECT_EQ(is_active, channel_parameters.encodings[i].active);
485 }
486
487 RunSetLastLayerAsInactiveTest(video_rtp_sender_.get());
488 }
489
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200490 // Check that minimum Jitter Buffer delay is propagated to the underlying
491 // |media_channel|.
492 void VerifyRtpReceiverDelayBehaviour(cricket::Delayable* media_channel,
493 RtpReceiverInterface* receiver,
494 uint32_t ssrc) {
495 receiver->SetJitterBufferMinimumDelay(/*delay_seconds=*/0.5);
496 absl::optional<int> delay_ms =
497 media_channel->GetBaseMinimumPlayoutDelayMs(ssrc); // In milliseconds.
498 EXPECT_DOUBLE_EQ(0.5, delay_ms.value_or(0) / 1000.0);
499 }
500
deadbeef70ab1a12015-09-28 16:53:55 -0700501 protected:
Steve Anton47136dd2018-01-12 10:49:35 -0800502 rtc::Thread* const network_thread_;
503 rtc::Thread* const worker_thread_;
Danil Chapovalov83bbe912019-08-07 12:24:53 +0200504 webrtc::RtcEventLogNull event_log_;
Zhi Huange830e682018-03-30 10:48:35 -0700505 // The |rtp_dtls_transport_| and |rtp_transport_| should be destroyed after
506 // the |channel_manager|.
507 std::unique_ptr<cricket::DtlsTransportInternal> rtp_dtls_transport_;
508 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport_;
Jonas Orelanda3aa9bd2019-04-17 07:38:40 +0200509 std::unique_ptr<webrtc::VideoBitrateAllocatorFactory>
510 video_bitrate_allocator_factory_;
deadbeef112b2e92017-02-10 20:13:37 -0800511 // |media_engine_| is actually owned by |channel_manager_|.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700512 cricket::FakeMediaEngine* media_engine_;
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200513 std::unique_ptr<cricket::ChannelManager> channel_manager_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700514 cricket::FakeCall fake_call_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700515 cricket::VoiceChannel* voice_channel_;
516 cricket::VideoChannel* video_channel_;
517 cricket::FakeVoiceMediaChannel* voice_media_channel_;
518 cricket::FakeVideoMediaChannel* video_media_channel_;
deadbeef70ab1a12015-09-28 16:53:55 -0700519 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
520 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
521 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
522 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
deadbeefe814a0d2017-02-25 18:15:09 -0800523 rtc::scoped_refptr<MediaStreamInterface> local_stream_;
deadbeef70ab1a12015-09-28 16:53:55 -0700524 rtc::scoped_refptr<VideoTrackInterface> video_track_;
525 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
deadbeef20cb0c12017-02-01 20:27:00 -0800526 bool audio_sender_destroyed_signal_fired_ = false;
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800527 rtc::UniqueRandomIdGenerator ssrc_generator_;
deadbeef70ab1a12015-09-28 16:53:55 -0700528};
529
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700530// Test that |voice_channel_| is updated when an audio track is associated
deadbeef70ab1a12015-09-28 16:53:55 -0700531// and disassociated with an AudioRtpSender.
532TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
533 CreateAudioRtpSender();
534 DestroyAudioRtpSender();
535}
536
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700537// Test that |video_channel_| is updated when a video track is associated and
deadbeef70ab1a12015-09-28 16:53:55 -0700538// disassociated with a VideoRtpSender.
539TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
540 CreateVideoRtpSender();
541 DestroyVideoRtpSender();
542}
543
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700544// Test that |voice_channel_| is updated when a remote audio track is
deadbeef70ab1a12015-09-28 16:53:55 -0700545// associated and disassociated with an AudioRtpReceiver.
546TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
547 CreateAudioRtpReceiver();
548 DestroyAudioRtpReceiver();
549}
550
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700551// Test that |video_channel_| is updated when a remote video track is
552// associated and disassociated with a VideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700553TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
554 CreateVideoRtpReceiver();
555 DestroyVideoRtpReceiver();
556}
557
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100558TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiverWithStreams) {
559 CreateAudioRtpReceiver({local_stream_});
560 DestroyAudioRtpReceiver();
561}
562
563TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiverWithStreams) {
564 CreateVideoRtpReceiver({local_stream_});
565 DestroyVideoRtpReceiver();
566}
567
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700568// Test that the AudioRtpSender applies options from the local audio source.
569TEST_F(RtpSenderReceiverTest, LocalAudioSourceOptionsApplied) {
570 cricket::AudioOptions options;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100571 options.echo_cancellation = true;
deadbeef757146b2017-02-10 21:26:48 -0800572 auto source = LocalAudioSource::Create(&options);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700573 CreateAudioRtpSender(source.get());
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700574
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100575 EXPECT_EQ(true, voice_media_channel_->options().echo_cancellation);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700576
577 DestroyAudioRtpSender();
578}
579
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700580// Test that the stream is muted when the track is disabled, and unmuted when
581// the track is enabled.
582TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) {
583 CreateAudioRtpSender();
584
585 audio_track_->set_enabled(false);
586 EXPECT_TRUE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
587
588 audio_track_->set_enabled(true);
589 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
590
591 DestroyAudioRtpSender();
592}
593
594// Test that the volume is set to 0 when the track is disabled, and back to
595// 1 when the track is enabled.
deadbeef70ab1a12015-09-28 16:53:55 -0700596TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
597 CreateAudioRtpReceiver();
598
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700599 double volume;
600 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
601 EXPECT_EQ(1, volume);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700602
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700603 audio_track_->set_enabled(false);
604 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
605 EXPECT_EQ(0, volume);
606
deadbeef70ab1a12015-09-28 16:53:55 -0700607 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700608 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
609 EXPECT_EQ(1, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700610
611 DestroyAudioRtpReceiver();
612}
613
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700614// Currently no action is taken when a remote video track is disabled or
615// enabled, so there's nothing to test here, other than what is normally
616// verified in DestroyVideoRtpSender.
deadbeef70ab1a12015-09-28 16:53:55 -0700617TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
618 CreateVideoRtpSender();
619
deadbeef70ab1a12015-09-28 16:53:55 -0700620 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700621 video_track_->set_enabled(true);
622
623 DestroyVideoRtpSender();
624}
625
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700626// Test that the state of the video track created by the VideoRtpReceiver is
627// updated when the receiver is destroyed.
perkjf0dcfe22016-03-10 18:32:00 +0100628TEST_F(RtpSenderReceiverTest, RemoteVideoTrackState) {
629 CreateVideoRtpReceiver();
630
631 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track_->state());
632 EXPECT_EQ(webrtc::MediaSourceInterface::kLive,
633 video_track_->GetSource()->state());
634
635 DestroyVideoRtpReceiver();
636
637 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track_->state());
638 EXPECT_EQ(webrtc::MediaSourceInterface::kEnded,
639 video_track_->GetSource()->state());
640}
641
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700642// Currently no action is taken when a remote video track is disabled or
643// enabled, so there's nothing to test here, other than what is normally
644// verified in DestroyVideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700645TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
646 CreateVideoRtpReceiver();
647
648 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700649 video_track_->set_enabled(true);
650
651 DestroyVideoRtpReceiver();
652}
653
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700654// Test that the AudioRtpReceiver applies volume changes from the track source
655// to the media channel.
deadbeef70ab1a12015-09-28 16:53:55 -0700656TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
657 CreateAudioRtpReceiver();
658
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700659 double volume;
660 audio_track_->GetSource()->SetVolume(0.5);
661 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
662 EXPECT_EQ(0.5, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700663
664 // Disable the audio track, this should prevent setting the volume.
deadbeef70ab1a12015-09-28 16:53:55 -0700665 audio_track_->set_enabled(false);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700666 audio_track_->GetSource()->SetVolume(0.8);
667 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
668 EXPECT_EQ(0, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700669
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700670 // When the track is enabled, the previously set volume should take effect.
deadbeef70ab1a12015-09-28 16:53:55 -0700671 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700672 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
673 EXPECT_EQ(0.8, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700674
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700675 // Try changing volume one more time.
676 audio_track_->GetSource()->SetVolume(0.9);
677 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
678 EXPECT_EQ(0.9, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700679
680 DestroyAudioRtpReceiver();
681}
682
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200683TEST_F(RtpSenderReceiverTest, AudioRtpReceiverDelay) {
684 CreateAudioRtpReceiver();
685 VerifyRtpReceiverDelayBehaviour(voice_media_channel_,
686 audio_rtp_receiver_.get(), kAudioSsrc);
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200687}
688
689TEST_F(RtpSenderReceiverTest, VideoRtpReceiverDelay) {
690 CreateVideoRtpReceiver();
691 VerifyRtpReceiverDelayBehaviour(video_media_channel_,
692 video_rtp_receiver_.get(), kVideoSsrc);
693}
694
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700695// Test that the media channel isn't enabled for sending if the audio sender
696// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800697TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800698 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800699 rtc::scoped_refptr<AudioTrackInterface> track =
700 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700701
702 // Track but no SSRC.
703 EXPECT_TRUE(audio_rtp_sender_->SetTrack(track));
704 VerifyVoiceChannelNoInput();
705
706 // SSRC but no track.
707 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
708 audio_rtp_sender_->SetSsrc(kAudioSsrc);
709 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800710}
711
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700712// Test that the media channel isn't enabled for sending if the video sender
713// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800714TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800715 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700716
717 // Track but no SSRC.
718 EXPECT_TRUE(video_rtp_sender_->SetTrack(video_track_));
719 VerifyVideoChannelNoInput();
720
721 // SSRC but no track.
722 EXPECT_TRUE(video_rtp_sender_->SetTrack(nullptr));
723 video_rtp_sender_->SetSsrc(kVideoSsrc);
724 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800725}
726
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700727// Test that the media channel is enabled for sending when the audio sender
728// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800729TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800730 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800731 rtc::scoped_refptr<AudioTrackInterface> track =
732 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700733 audio_rtp_sender_->SetSsrc(kAudioSsrc);
734 audio_rtp_sender_->SetTrack(track);
735 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800736
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700737 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800738}
739
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700740// Test that the media channel is enabled for sending when the audio sender
741// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800742TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800743 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800744 rtc::scoped_refptr<AudioTrackInterface> track =
745 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700746 audio_rtp_sender_->SetTrack(track);
747 audio_rtp_sender_->SetSsrc(kAudioSsrc);
748 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800749
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700750 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800751}
752
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700753// Test that the media channel is enabled for sending when the video sender
754// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800755TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
nisseaf510af2016-03-21 08:20:42 -0700756 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800757 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700758 video_rtp_sender_->SetSsrc(kVideoSsrc);
759 video_rtp_sender_->SetTrack(video_track_);
760 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800761
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700762 DestroyVideoRtpSender();
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 video sender
766// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800767TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
nisseaf510af2016-03-21 08:20:42 -0700768 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800769 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700770 video_rtp_sender_->SetTrack(video_track_);
771 video_rtp_sender_->SetSsrc(kVideoSsrc);
772 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800773
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700774 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800775}
776
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700777// Test that the media channel stops sending when the audio sender's SSRC is set
778// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800779TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700780 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800781
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700782 audio_rtp_sender_->SetSsrc(0);
783 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800784}
785
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700786// Test that the media channel stops sending when the video sender's SSRC is set
787// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800788TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700789 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800790
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700791 audio_rtp_sender_->SetSsrc(0);
792 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800793}
794
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700795// Test that the media channel stops sending when the audio sender's track is
796// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800797TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700798 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800799
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700800 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
801 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800802}
803
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700804// Test that the media channel stops sending when the video sender's track is
805// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800806TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700807 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800808
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700809 video_rtp_sender_->SetSsrc(0);
810 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800811}
812
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700813// Test that when the audio sender's SSRC is changed, the media channel stops
814// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800815TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700816 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800817
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700818 audio_rtp_sender_->SetSsrc(kAudioSsrc2);
819 VerifyVoiceChannelNoInput(kAudioSsrc);
820 VerifyVoiceChannelInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800821
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700822 audio_rtp_sender_ = nullptr;
823 VerifyVoiceChannelNoInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800824}
825
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700826// Test that when the audio sender's SSRC is changed, the media channel stops
827// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800828TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700829 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800830
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700831 video_rtp_sender_->SetSsrc(kVideoSsrc2);
832 VerifyVideoChannelNoInput(kVideoSsrc);
833 VerifyVideoChannelInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800834
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700835 video_rtp_sender_ = nullptr;
836 VerifyVideoChannelNoInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800837}
838
skvladdc1c62c2016-03-16 19:07:43 -0700839TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) {
840 CreateAudioRtpSender();
841
skvladdc1c62c2016-03-16 19:07:43 -0700842 RtpParameters params = audio_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700843 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -0800844 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -0700845
846 DestroyAudioRtpSender();
847}
848
Florent Castelli892acf02018-10-01 22:47:20 +0200849TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParametersBeforeNegotiation) {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800850 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200851 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +0200852
853 RtpParameters params = audio_rtp_sender_->GetParameters();
854 ASSERT_EQ(1u, params.encodings.size());
855 params.encodings[0].max_bitrate_bps = 90000;
856 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
857
858 params = audio_rtp_sender_->GetParameters();
859 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
860 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
861
862 DestroyAudioRtpSender();
863}
864
865TEST_F(RtpSenderReceiverTest, AudioSenderInitParametersMovedAfterNegotiation) {
866 audio_track_ = AudioTrack::Create(kAudioTrackId, nullptr);
867 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
868
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200869 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200870 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200871 audio_rtp_sender_ = AudioRtpSender::Create(
872 worker_thread_, audio_track_->id(), nullptr, set_streams_observer.get());
Florent Castelli892acf02018-10-01 22:47:20 +0200873 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200874 EXPECT_CALL(*set_streams_observer, OnSetStreams());
875 audio_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli892acf02018-10-01 22:47:20 +0200876
877 std::vector<RtpEncodingParameters> init_encodings(1);
878 init_encodings[0].max_bitrate_bps = 60000;
879 audio_rtp_sender_->set_init_send_encodings(init_encodings);
880
881 RtpParameters params = audio_rtp_sender_->GetParameters();
882 ASSERT_EQ(1u, params.encodings.size());
883 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
884
885 // Simulate the setLocalDescription call
886 std::vector<uint32_t> ssrcs(1, 1);
887 cricket::StreamParams stream_params =
888 cricket::CreateSimStreamParams("cname", ssrcs);
889 voice_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800890 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +0200891 audio_rtp_sender_->SetSsrc(1);
892
893 params = audio_rtp_sender_->GetParameters();
894 ASSERT_EQ(1u, params.encodings.size());
895 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
896
897 DestroyAudioRtpSender();
898}
899
900TEST_F(RtpSenderReceiverTest,
901 AudioSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800902 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200903 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +0200904
905 RtpParameters params;
906 RTCError result = audio_rtp_sender_->SetParameters(params);
907 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
908 DestroyAudioRtpSender();
909}
910
Florent Castellicebf50f2018-05-03 15:31:53 +0200911TEST_F(RtpSenderReceiverTest,
912 AudioSenderMustCallGetParametersBeforeSetParameters) {
913 CreateAudioRtpSender();
914
915 RtpParameters params;
916 RTCError result = audio_rtp_sender_->SetParameters(params);
917 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
918
919 DestroyAudioRtpSender();
920}
921
922TEST_F(RtpSenderReceiverTest,
923 AudioSenderSetParametersInvalidatesTransactionId) {
924 CreateAudioRtpSender();
925
926 RtpParameters params = audio_rtp_sender_->GetParameters();
927 EXPECT_EQ(1u, params.encodings.size());
928 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
929 RTCError result = audio_rtp_sender_->SetParameters(params);
930 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
931
932 DestroyAudioRtpSender();
933}
934
935TEST_F(RtpSenderReceiverTest, AudioSenderDetectTransactionIdModification) {
936 CreateAudioRtpSender();
937
938 RtpParameters params = audio_rtp_sender_->GetParameters();
939 params.transaction_id = "";
940 RTCError result = audio_rtp_sender_->SetParameters(params);
941 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
942
943 DestroyAudioRtpSender();
944}
945
946TEST_F(RtpSenderReceiverTest, AudioSenderCheckTransactionIdRefresh) {
947 CreateAudioRtpSender();
948
949 RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200950 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 15:31:53 +0200951 auto saved_transaction_id = params.transaction_id;
952 params = audio_rtp_sender_->GetParameters();
953 EXPECT_NE(saved_transaction_id, params.transaction_id);
954
955 DestroyAudioRtpSender();
956}
957
958TEST_F(RtpSenderReceiverTest, AudioSenderSetParametersOldValueFail) {
959 CreateAudioRtpSender();
960
961 RtpParameters params = audio_rtp_sender_->GetParameters();
962 RtpParameters second_params = audio_rtp_sender_->GetParameters();
963
964 RTCError result = audio_rtp_sender_->SetParameters(params);
965 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
Seth Hampson2d2c8882018-05-16 16:02:32 -0700966 DestroyAudioRtpSender();
967}
968
969TEST_F(RtpSenderReceiverTest, AudioSenderCantSetUnimplementedRtpParameters) {
970 CreateAudioRtpSender();
971 RtpParameters params = audio_rtp_sender_->GetParameters();
972 EXPECT_EQ(1u, params.encodings.size());
973
Florent Castelli87b3c512018-07-18 16:00:28 +0200974 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 16:02:32 -0700975 params.mid = "dummy_mid";
976 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
977 audio_rtp_sender_->SetParameters(params).type());
978 params = audio_rtp_sender_->GetParameters();
979
Seth Hampson2d2c8882018-05-16 16:02:32 -0700980 DestroyAudioRtpSender();
981}
982
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700983TEST_F(RtpSenderReceiverTest, SetAudioMaxSendBitrate) {
984 CreateAudioRtpSender();
985
986 EXPECT_EQ(-1, voice_media_channel_->max_bps());
987 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200988 EXPECT_EQ(1U, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -0800989 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100990 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -0800991 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700992
993 // Read back the parameters and verify they have been changed.
994 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200995 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100996 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700997
998 // Verify that the audio channel received the new parameters.
999 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001000 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001001 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001002
1003 // Verify that the global bitrate limit has not been changed.
1004 EXPECT_EQ(-1, voice_media_channel_->max_bps());
1005
1006 DestroyAudioRtpSender();
1007}
1008
Seth Hampson24722b32017-12-22 09:36:42 -08001009TEST_F(RtpSenderReceiverTest, SetAudioBitratePriority) {
1010 CreateAudioRtpSender();
1011
1012 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001013 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001014 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1015 params.encodings[0].bitrate_priority);
1016 double new_bitrate_priority = 2.0;
1017 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -08001018 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -08001019
1020 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001021 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001022 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1023
1024 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001025 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001026 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1027
1028 DestroyAudioRtpSender();
1029}
1030
skvladdc1c62c2016-03-16 19:07:43 -07001031TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) {
1032 CreateVideoRtpSender();
1033
skvladdc1c62c2016-03-16 19:07:43 -07001034 RtpParameters params = video_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001035 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -08001036 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -07001037
1038 DestroyVideoRtpSender();
1039}
1040
Florent Castelli892acf02018-10-01 22:47:20 +02001041TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParametersBeforeNegotiation) {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001042 video_rtp_sender_ =
1043 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +02001044
1045 RtpParameters params = video_rtp_sender_->GetParameters();
1046 ASSERT_EQ(1u, params.encodings.size());
1047 params.encodings[0].max_bitrate_bps = 90000;
1048 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1049
1050 params = video_rtp_sender_->GetParameters();
1051 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1052 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
1053
1054 DestroyVideoRtpSender();
1055}
1056
1057TEST_F(RtpSenderReceiverTest, VideoSenderInitParametersMovedAfterNegotiation) {
1058 AddVideoTrack(false);
1059
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001060 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001061 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001062 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1063 set_streams_observer.get());
Florent Castelli892acf02018-10-01 22:47:20 +02001064 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001065 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1066 video_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli892acf02018-10-01 22:47:20 +02001067
1068 std::vector<RtpEncodingParameters> init_encodings(2);
1069 init_encodings[0].max_bitrate_bps = 60000;
1070 init_encodings[1].max_bitrate_bps = 900000;
1071 video_rtp_sender_->set_init_send_encodings(init_encodings);
1072
1073 RtpParameters params = video_rtp_sender_->GetParameters();
1074 ASSERT_EQ(2u, params.encodings.size());
1075 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1076 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
1077
1078 // Simulate the setLocalDescription call
1079 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +01001080 ssrcs.reserve(2);
Florent Castelli892acf02018-10-01 22:47:20 +02001081 for (int i = 0; i < 2; ++i)
1082 ssrcs.push_back(kVideoSsrcSimulcast + i);
1083 cricket::StreamParams stream_params =
1084 cricket::CreateSimStreamParams("cname", ssrcs);
1085 video_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -08001086 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +02001087 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
1088
1089 params = video_rtp_sender_->GetParameters();
1090 ASSERT_EQ(2u, params.encodings.size());
1091 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1092 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
1093
1094 DestroyVideoRtpSender();
1095}
1096
1097TEST_F(RtpSenderReceiverTest,
1098 VideoSenderInitParametersMovedAfterManualSimulcastAndNegotiation) {
1099 AddVideoTrack(false);
1100
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001101 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001102 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001103 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1104 set_streams_observer.get());
Florent Castelli892acf02018-10-01 22:47:20 +02001105 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001106 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1107 video_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli892acf02018-10-01 22:47:20 +02001108
1109 std::vector<RtpEncodingParameters> init_encodings(1);
1110 init_encodings[0].max_bitrate_bps = 60000;
1111 video_rtp_sender_->set_init_send_encodings(init_encodings);
1112
1113 RtpParameters params = video_rtp_sender_->GetParameters();
1114 ASSERT_EQ(1u, params.encodings.size());
1115 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1116
1117 // Simulate the setLocalDescription call as if the user used SDP munging
1118 // to enable simulcast
1119 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +01001120 ssrcs.reserve(2);
Florent Castelli892acf02018-10-01 22:47:20 +02001121 for (int i = 0; i < 2; ++i)
1122 ssrcs.push_back(kVideoSsrcSimulcast + i);
1123 cricket::StreamParams stream_params =
1124 cricket::CreateSimStreamParams("cname", ssrcs);
1125 video_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -08001126 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +02001127 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
1128
1129 params = video_rtp_sender_->GetParameters();
1130 ASSERT_EQ(2u, params.encodings.size());
1131 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1132
1133 DestroyVideoRtpSender();
1134}
1135
1136TEST_F(RtpSenderReceiverTest,
1137 VideoSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001138 video_rtp_sender_ =
1139 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +02001140
1141 RtpParameters params;
1142 RTCError result = video_rtp_sender_->SetParameters(params);
1143 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1144 DestroyVideoRtpSender();
1145}
1146
Florent Castellicebf50f2018-05-03 15:31:53 +02001147TEST_F(RtpSenderReceiverTest,
1148 VideoSenderMustCallGetParametersBeforeSetParameters) {
1149 CreateVideoRtpSender();
1150
1151 RtpParameters params;
1152 RTCError result = video_rtp_sender_->SetParameters(params);
1153 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1154
1155 DestroyVideoRtpSender();
1156}
1157
1158TEST_F(RtpSenderReceiverTest,
1159 VideoSenderSetParametersInvalidatesTransactionId) {
1160 CreateVideoRtpSender();
1161
1162 RtpParameters params = video_rtp_sender_->GetParameters();
1163 EXPECT_EQ(1u, params.encodings.size());
1164 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1165 RTCError result = video_rtp_sender_->SetParameters(params);
1166 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1167
1168 DestroyVideoRtpSender();
1169}
1170
1171TEST_F(RtpSenderReceiverTest, VideoSenderDetectTransactionIdModification) {
1172 CreateVideoRtpSender();
1173
1174 RtpParameters params = video_rtp_sender_->GetParameters();
1175 params.transaction_id = "";
1176 RTCError result = video_rtp_sender_->SetParameters(params);
1177 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1178
1179 DestroyVideoRtpSender();
1180}
1181
1182TEST_F(RtpSenderReceiverTest, VideoSenderCheckTransactionIdRefresh) {
1183 CreateVideoRtpSender();
1184
1185 RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001186 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 15:31:53 +02001187 auto saved_transaction_id = params.transaction_id;
1188 params = video_rtp_sender_->GetParameters();
1189 EXPECT_NE(saved_transaction_id, params.transaction_id);
1190
1191 DestroyVideoRtpSender();
1192}
1193
1194TEST_F(RtpSenderReceiverTest, VideoSenderSetParametersOldValueFail) {
1195 CreateVideoRtpSender();
1196
1197 RtpParameters params = video_rtp_sender_->GetParameters();
1198 RtpParameters second_params = video_rtp_sender_->GetParameters();
1199
1200 RTCError result = video_rtp_sender_->SetParameters(params);
1201 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1202
1203 DestroyVideoRtpSender();
1204}
1205
Seth Hampson2d2c8882018-05-16 16:02:32 -07001206TEST_F(RtpSenderReceiverTest, VideoSenderCantSetUnimplementedRtpParameters) {
1207 CreateVideoRtpSender();
1208 RtpParameters params = video_rtp_sender_->GetParameters();
1209 EXPECT_EQ(1u, params.encodings.size());
1210
Florent Castelli87b3c512018-07-18 16:00:28 +02001211 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 16:02:32 -07001212 params.mid = "dummy_mid";
1213 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1214 video_rtp_sender_->SetParameters(params).type());
1215 params = video_rtp_sender_->GetParameters();
1216
Seth Hampson2d2c8882018-05-16 16:02:32 -07001217 DestroyVideoRtpSender();
1218}
1219
Florent Castellic1a0bcb2019-01-29 14:26:48 +01001220TEST_F(RtpSenderReceiverTest, VideoSenderCanSetScaleResolutionDownBy) {
1221 CreateVideoRtpSender();
1222
1223 RtpParameters params = video_rtp_sender_->GetParameters();
1224 params.encodings[0].scale_resolution_down_by = 2;
1225
1226 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1227 params = video_rtp_sender_->GetParameters();
1228 EXPECT_EQ(2, params.encodings[0].scale_resolution_down_by);
1229
1230 DestroyVideoRtpSender();
1231}
1232
1233TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidScaleResolutionDownBy) {
1234 CreateVideoRtpSender();
1235
1236 RtpParameters params = video_rtp_sender_->GetParameters();
1237 params.encodings[0].scale_resolution_down_by = 0.5;
1238 RTCError result = video_rtp_sender_->SetParameters(params);
1239 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1240
1241 DestroyVideoRtpSender();
1242}
1243
Florent Castelli907dc802019-12-06 15:03:19 +01001244TEST_F(RtpSenderReceiverTest, VideoSenderCanSetMaxFramerate) {
1245 CreateVideoRtpSender();
1246
1247 RtpParameters params = video_rtp_sender_->GetParameters();
1248 params.encodings[0].max_framerate = 20;
1249
1250 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1251 params = video_rtp_sender_->GetParameters();
1252 EXPECT_EQ(20., params.encodings[0].max_framerate);
1253
1254 DestroyVideoRtpSender();
1255}
1256
1257TEST_F(RtpSenderReceiverTest, VideoSenderCanSetMaxFramerateZero) {
1258 CreateVideoRtpSender();
1259
1260 RtpParameters params = video_rtp_sender_->GetParameters();
1261 params.encodings[0].max_framerate = 0.;
1262
1263 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1264 params = video_rtp_sender_->GetParameters();
1265 EXPECT_EQ(0., params.encodings[0].max_framerate);
1266
1267 DestroyVideoRtpSender();
1268}
1269
1270TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidMaxFramerate) {
1271 CreateVideoRtpSender();
1272
1273 RtpParameters params = video_rtp_sender_->GetParameters();
1274 params.encodings[0].max_framerate = -5.;
1275 RTCError result = video_rtp_sender_->SetParameters(params);
1276 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1277
1278 DestroyVideoRtpSender();
1279}
1280
Seth Hampson2d2c8882018-05-16 16:02:32 -07001281// A video sender can have multiple simulcast layers, in which case it will
1282// contain multiple RtpEncodingParameters. This tests that if this is the case
1283// (simulcast), then we can't set the bitrate_priority, or max_bitrate_bps
1284// for any encodings besides at index 0, because these are both implemented
1285// "per-sender."
1286TEST_F(RtpSenderReceiverTest, VideoSenderCantSetPerSenderEncodingParameters) {
1287 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001288 CreateVideoRtpSenderWithSimulcast();
Seth Hampson2d2c8882018-05-16 16:02:32 -07001289 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001290 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Seth Hampson2d2c8882018-05-16 16:02:32 -07001291
1292 params.encodings[1].bitrate_priority = 2.0;
1293 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1294 video_rtp_sender_->SetParameters(params).type());
1295 params = video_rtp_sender_->GetParameters();
1296
Seth Hampson2d2c8882018-05-16 16:02:32 -07001297 DestroyVideoRtpSender();
1298}
1299
Florent Castelli892acf02018-10-01 22:47:20 +02001300TEST_F(RtpSenderReceiverTest, VideoSenderCantSetReadOnlyEncodingParameters) {
1301 // Add a simulcast specific send stream that contains 2 encoding parameters.
1302 CreateVideoRtpSenderWithSimulcast();
1303 RtpParameters params = video_rtp_sender_->GetParameters();
1304 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
1305
1306 for (size_t i = 0; i < params.encodings.size(); i++) {
1307 params.encodings[i].ssrc = 1337;
1308 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION,
1309 video_rtp_sender_->SetParameters(params).type());
1310 params = video_rtp_sender_->GetParameters();
1311 }
1312
1313 DestroyVideoRtpSender();
1314}
1315
Ă…sa Persson55659812018-06-18 17:51:32 +02001316TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrate) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001317 CreateVideoRtpSender();
1318
1319 EXPECT_EQ(-1, video_media_channel_->max_bps());
1320 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001321 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001322 EXPECT_FALSE(params.encodings[0].min_bitrate_bps);
deadbeefe702b302017-02-04 12:09:01 -08001323 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Ă…sa Persson55659812018-06-18 17:51:32 +02001324 params.encodings[0].min_bitrate_bps = 100;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001325 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -08001326 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001327
1328 // Read back the parameters and verify they have been changed.
1329 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001330 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001331 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001332 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001333
1334 // Verify that the video channel received the new parameters.
1335 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001336 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001337 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001338 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001339
1340 // Verify that the global bitrate limit has not been changed.
1341 EXPECT_EQ(-1, video_media_channel_->max_bps());
1342
1343 DestroyVideoRtpSender();
1344}
1345
Ă…sa Persson55659812018-06-18 17:51:32 +02001346TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrateSimulcast) {
1347 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001348 CreateVideoRtpSenderWithSimulcast();
Ă…sa Persson55659812018-06-18 17:51:32 +02001349
1350 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001351 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001352 params.encodings[0].min_bitrate_bps = 100;
1353 params.encodings[0].max_bitrate_bps = 1000;
1354 params.encodings[1].min_bitrate_bps = 200;
1355 params.encodings[1].max_bitrate_bps = 2000;
1356 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1357
1358 // Verify that the video channel received the new parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001359 params = video_media_channel_->GetRtpSendParameters(kVideoSsrcSimulcast);
1360 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001361 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
1362 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
1363 EXPECT_EQ(200, params.encodings[1].min_bitrate_bps);
1364 EXPECT_EQ(2000, params.encodings[1].max_bitrate_bps);
1365
1366 DestroyVideoRtpSender();
1367}
1368
Seth Hampson24722b32017-12-22 09:36:42 -08001369TEST_F(RtpSenderReceiverTest, SetVideoBitratePriority) {
1370 CreateVideoRtpSender();
1371
1372 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001373 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001374 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1375 params.encodings[0].bitrate_priority);
1376 double new_bitrate_priority = 2.0;
1377 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -08001378 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -08001379
1380 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001381 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001382 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1383
1384 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001385 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001386 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1387
1388 DestroyVideoRtpSender();
1389}
1390
Florent Castelli38332cd2018-11-20 14:08:06 +01001391TEST_F(RtpSenderReceiverTest, VideoReceiverCanGetParametersWithSimulcast) {
1392 CreateVideoRtpReceiverWithSimulcast({}, 2);
1393
1394 RtpParameters params = video_rtp_receiver_->GetParameters();
1395 EXPECT_EQ(2u, params.encodings.size());
1396
1397 DestroyVideoRtpReceiver();
1398}
1399
pbos5214a0a2016-12-16 15:39:11 -08001400// Test that makes sure that a video track content hint translates to the proper
1401// value for sources that are not screencast.
1402TEST_F(RtpSenderReceiverTest, PropagatesVideoTrackContentHint) {
1403 CreateVideoRtpSender();
1404
1405 video_track_->set_enabled(true);
1406
1407 // |video_track_| is not screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001408 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001409 // No content hint should be set by default.
1410 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1411 video_track_->content_hint());
1412 // Setting detailed should turn a non-screencast source into screencast mode.
1413 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001414 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001415 // Removing the content hint should turn the track back into non-screencast
1416 // mode.
1417 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001418 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001419 // Setting fluid should remain in non-screencast mode (its default).
1420 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001421 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 08:53:10 +02001422 // Setting text should have the same effect as Detailed
1423 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
1424 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001425
1426 DestroyVideoRtpSender();
1427}
1428
1429// Test that makes sure that a video track content hint translates to the proper
1430// value for screencast sources.
1431TEST_F(RtpSenderReceiverTest,
1432 PropagatesVideoTrackContentHintForScreencastSource) {
1433 CreateVideoRtpSender(true);
1434
1435 video_track_->set_enabled(true);
1436
1437 // |video_track_| with a screencast source should be screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001438 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001439 // No content hint should be set by default.
1440 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1441 video_track_->content_hint());
1442 // Setting fluid should turn a screencast source into non-screencast mode.
1443 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001444 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001445 // Removing the content hint should turn the track back into screencast mode.
1446 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001447 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001448 // Setting detailed should still remain in screencast mode (its default).
1449 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001450 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 08:53:10 +02001451 // Setting text should have the same effect as Detailed
1452 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
1453 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001454
1455 DestroyVideoRtpSender();
1456}
1457
1458// Test that makes sure any content hints that are set on a track before
1459// VideoRtpSender is ready to send are still applied when it gets ready to send.
1460TEST_F(RtpSenderReceiverTest,
1461 PropagatesVideoTrackContentHintSetBeforeEnabling) {
1462 AddVideoTrack();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001463 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001464 std::make_unique<MockSetStreamsObserver>();
pbos5214a0a2016-12-16 15:39:11 -08001465 // Setting detailed overrides the default non-screencast mode. This should be
1466 // applied even if the track is set on construction.
1467 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001468 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1469 set_streams_observer.get());
Steve Anton111fdfd2018-06-25 13:03:36 -07001470 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001471 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1472 video_rtp_sender_->SetStreams({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -08001473 video_rtp_sender_->SetMediaChannel(video_media_channel_);
pbos5214a0a2016-12-16 15:39:11 -08001474 video_track_->set_enabled(true);
1475
1476 // Sender is not ready to send (no SSRC) so no option should have been set.
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001477 EXPECT_EQ(absl::nullopt, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001478
1479 // Verify that the content hint is accounted for when video_rtp_sender_ does
1480 // get enabled.
1481 video_rtp_sender_->SetSsrc(kVideoSsrc);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001482 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001483
1484 // And removing the hint should go back to false (to verify that false was
1485 // default correctly).
1486 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001487 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001488
1489 DestroyVideoRtpSender();
1490}
1491
deadbeef20cb0c12017-02-01 20:27:00 -08001492TEST_F(RtpSenderReceiverTest, AudioSenderHasDtmfSender) {
1493 CreateAudioRtpSender();
1494 EXPECT_NE(nullptr, audio_rtp_sender_->GetDtmfSender());
1495}
1496
1497TEST_F(RtpSenderReceiverTest, VideoSenderDoesNotHaveDtmfSender) {
1498 CreateVideoRtpSender();
1499 EXPECT_EQ(nullptr, video_rtp_sender_->GetDtmfSender());
1500}
1501
1502// Test that the DTMF sender is really using |voice_channel_|, and thus returns
1503// true/false from CanSendDtmf based on what |voice_channel_| returns.
1504TEST_F(RtpSenderReceiverTest, CanInsertDtmf) {
1505 AddDtmfCodec();
1506 CreateAudioRtpSender();
1507 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1508 ASSERT_NE(nullptr, dtmf_sender);
1509 EXPECT_TRUE(dtmf_sender->CanInsertDtmf());
1510}
1511
1512TEST_F(RtpSenderReceiverTest, CanNotInsertDtmf) {
1513 CreateAudioRtpSender();
1514 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1515 ASSERT_NE(nullptr, dtmf_sender);
1516 // DTMF codec has not been added, as it was in the above test.
1517 EXPECT_FALSE(dtmf_sender->CanInsertDtmf());
1518}
1519
1520TEST_F(RtpSenderReceiverTest, InsertDtmf) {
1521 AddDtmfCodec();
1522 CreateAudioRtpSender();
1523 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1524 ASSERT_NE(nullptr, dtmf_sender);
1525
1526 EXPECT_EQ(0U, voice_media_channel_->dtmf_info_queue().size());
1527
1528 // Insert DTMF
1529 const int expected_duration = 90;
1530 dtmf_sender->InsertDtmf("012", expected_duration, 100);
1531
1532 // Verify
1533 ASSERT_EQ_WAIT(3U, voice_media_channel_->dtmf_info_queue().size(),
1534 kDefaultTimeout);
1535 const uint32_t send_ssrc =
1536 voice_media_channel_->send_streams()[0].first_ssrc();
1537 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[0],
1538 send_ssrc, 0, expected_duration));
1539 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[1],
1540 send_ssrc, 1, expected_duration));
1541 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[2],
1542 send_ssrc, 2, expected_duration));
1543}
1544
1545// Make sure the signal from "GetOnDestroyedSignal()" fires when the sender is
1546// destroyed, which is needed for the DTMF sender.
1547TEST_F(RtpSenderReceiverTest, TestOnDestroyedSignal) {
1548 CreateAudioRtpSender();
1549 EXPECT_FALSE(audio_sender_destroyed_signal_fired_);
1550 audio_rtp_sender_ = nullptr;
1551 EXPECT_TRUE(audio_sender_destroyed_signal_fired_);
1552}
1553
Benjamin Wright84583f62018-10-04 14:22:34 -07001554// Validate that the default FrameEncryptor setting is nullptr.
1555TEST_F(RtpSenderReceiverTest, AudioSenderCanSetFrameEncryptor) {
1556 CreateAudioRtpSender();
1557 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1558 new FakeFrameEncryptor());
1559 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1560 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1561 EXPECT_EQ(fake_frame_encryptor.get(),
1562 audio_rtp_sender_->GetFrameEncryptor().get());
1563}
1564
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001565// Validate that setting a FrameEncryptor after the send stream is stopped does
1566// nothing.
1567TEST_F(RtpSenderReceiverTest, AudioSenderCannotSetFrameEncryptorAfterStop) {
1568 CreateAudioRtpSender();
1569 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1570 new FakeFrameEncryptor());
1571 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1572 audio_rtp_sender_->Stop();
1573 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1574 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1575}
1576
Benjamin Wright84583f62018-10-04 14:22:34 -07001577// Validate that the default FrameEncryptor setting is nullptr.
1578TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetFrameDecryptor) {
1579 CreateAudioRtpReceiver();
1580 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1581 new FakeFrameDecryptor());
1582 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
1583 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1584 EXPECT_EQ(fake_frame_decryptor.get(),
1585 audio_rtp_receiver_->GetFrameDecryptor().get());
1586}
1587
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001588// Validate that the default FrameEncryptor setting is nullptr.
1589TEST_F(RtpSenderReceiverTest, AudioReceiverCannotSetFrameDecryptorAfterStop) {
1590 CreateAudioRtpReceiver();
1591 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1592 new FakeFrameDecryptor());
1593 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
1594 audio_rtp_receiver_->Stop();
1595 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1596 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1597}
1598
1599// Validate that the default FrameEncryptor setting is nullptr.
1600TEST_F(RtpSenderReceiverTest, VideoSenderCanSetFrameEncryptor) {
1601 CreateVideoRtpSender();
1602 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1603 new FakeFrameEncryptor());
1604 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1605 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1606 EXPECT_EQ(fake_frame_encryptor.get(),
1607 video_rtp_sender_->GetFrameEncryptor().get());
1608}
1609
1610// Validate that setting a FrameEncryptor after the send stream is stopped does
1611// nothing.
1612TEST_F(RtpSenderReceiverTest, VideoSenderCannotSetFrameEncryptorAfterStop) {
1613 CreateVideoRtpSender();
1614 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1615 new FakeFrameEncryptor());
1616 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1617 video_rtp_sender_->Stop();
1618 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1619 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1620}
1621
1622// Validate that the default FrameEncryptor setting is nullptr.
1623TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetFrameDecryptor) {
1624 CreateVideoRtpReceiver();
1625 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1626 new FakeFrameDecryptor());
1627 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
1628 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1629 EXPECT_EQ(fake_frame_decryptor.get(),
1630 video_rtp_receiver_->GetFrameDecryptor().get());
1631}
1632
1633// Validate that the default FrameEncryptor setting is nullptr.
1634TEST_F(RtpSenderReceiverTest, VideoReceiverCannotSetFrameDecryptorAfterStop) {
1635 CreateVideoRtpReceiver();
1636 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1637 new FakeFrameDecryptor());
1638 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
1639 video_rtp_receiver_->Stop();
1640 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1641 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1642}
1643
Amit Hilbuch619b2942019-02-26 15:55:19 -08001644// Checks that calling the internal methods for get/set parameters do not
1645// invalidate any parameters retreived by clients.
1646TEST_F(RtpSenderReceiverTest,
1647 InternalParameterMethodsDoNotInvalidateTransaction) {
1648 CreateVideoRtpSender();
1649 RtpParameters parameters = video_rtp_sender_->GetParameters();
1650 RtpParameters new_parameters = video_rtp_sender_->GetParametersInternal();
1651 new_parameters.encodings[0].active = false;
1652 video_rtp_sender_->SetParametersInternal(new_parameters);
1653 new_parameters.encodings[0].active = true;
1654 video_rtp_sender_->SetParametersInternal(new_parameters);
1655 parameters.encodings[0].active = false;
1656 EXPECT_TRUE(video_rtp_sender_->SetParameters(parameters).ok());
1657}
1658
Amit Hilbuch2297d332019-02-19 12:49:22 -08001659// Helper method for syntactic sugar for accepting a vector with '{}' notation.
1660std::pair<RidList, RidList> CreatePairOfRidVectors(
1661 const std::vector<std::string>& first,
1662 const std::vector<std::string>& second) {
1663 return std::make_pair(first, second);
1664}
1665
1666// These parameters are used to test disabling simulcast layers.
1667const std::pair<RidList, RidList> kDisableSimulcastLayersParameters[] = {
1668 // Tests removing the first layer. This is a special case because
1669 // the first layer's SSRC is also the 'primary' SSRC used to associate the
1670 // parameters to the media channel.
1671 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"1"}),
1672 // Tests removing some layers.
1673 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"2", "4"}),
1674 // Tests simulcast rejected scenario all layers except first are rejected.
1675 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"2", "3", "4"}),
1676 // Tests removing all layers.
1677 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"1", "2", "3", "4"}),
1678};
1679
1680// Runs test for disabling layers on a sender without a media engine set.
1681TEST_P(RtpSenderReceiverTest, DisableSimulcastLayersWithoutMediaEngine) {
1682 auto parameter = GetParam();
1683 RunDisableSimulcastLayersWithoutMediaEngineTest(parameter.first,
1684 parameter.second);
1685}
1686
1687// Runs test for disabling layers on a sender with a media engine set.
1688TEST_P(RtpSenderReceiverTest, DisableSimulcastLayersWithMediaEngine) {
1689 auto parameter = GetParam();
1690 RunDisableSimulcastLayersWithMediaEngineTest(parameter.first,
1691 parameter.second);
1692}
1693
1694INSTANTIATE_TEST_SUITE_P(
1695 DisableSimulcastLayersInSender,
1696 RtpSenderReceiverTest,
1697 ::testing::ValuesIn(kDisableSimulcastLayersParameters));
1698
deadbeef70ab1a12015-09-28 16:53:55 -07001699} // namespace webrtc