blob: 625f29b34bcce2383b358773497fbbfbd8d8ee35 [file] [log] [blame]
deadbeef70ab1a12015-09-28 16:53:55 -07001/*
kjellanderb24317b2016-02-10 07:54:43 -08002 * Copyright 2012 The WebRTC project authors. All Rights Reserved.
deadbeef70ab1a12015-09-28 16:53:55 -07003 *
kjellanderb24317b2016-02-10 07:54:43 -08004 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
deadbeef70ab1a12015-09-28 16:53:55 -07009 */
10
Yves Gerey3e707812018-11-28 16:47:49 +010011#include <stddef.h>
Jonas Olssona4d87372019-07-05 19:08:33 +020012
Yves Gerey3e707812018-11-28 16:47:49 +010013#include <cstdint>
kwibergd1fe2812016-04-27 06:47:29 -070014#include <memory>
deadbeef70ab1a12015-09-28 16:53:55 -070015#include <string>
Tommif888bb52015-12-12 01:37:01 +010016#include <utility>
Yves Gerey3e707812018-11-28 16:47:49 +010017#include <vector>
deadbeef70ab1a12015-09-28 16:53:55 -070018
Amit Hilbuch2297d332019-02-19 12:49:22 -080019#include "absl/algorithm/container.h"
Yves Gerey3e707812018-11-28 16:47:49 +010020#include "absl/memory/memory.h"
21#include "absl/types/optional.h"
22#include "api/audio_options.h"
Steve Anton10542f22019-01-11 09:11:00 -080023#include "api/crypto/crypto_options.h"
24#include "api/crypto/frame_decryptor_interface.h"
25#include "api/crypto/frame_encryptor_interface.h"
26#include "api/dtmf_sender_interface.h"
27#include "api/media_stream_interface.h"
28#include "api/rtc_error.h"
Danil Chapovalov83bbe912019-08-07 12:24:53 +020029#include "api/rtc_event_log/rtc_event_log.h"
Steve Anton10542f22019-01-11 09:11:00 -080030#include "api/rtp_parameters.h"
Mirko Bonadeid9708072019-01-25 20:26:48 +010031#include "api/scoped_refptr.h"
Benjamin Wright84583f62018-10-04 14:22:34 -070032#include "api/test/fake_frame_decryptor.h"
33#include "api/test/fake_frame_encryptor.h"
Jonas Orelanda3aa9bd2019-04-17 07:38:40 +020034#include "api/video/builtin_video_bitrate_allocator_factory.h"
Yves Gerey3e707812018-11-28 16:47:49 +010035#include "media/base/codec.h"
Steve Anton10542f22019-01-11 09:11:00 -080036#include "media/base/fake_media_engine.h"
37#include "media/base/media_channel.h"
38#include "media/base/media_config.h"
39#include "media/base/media_engine.h"
Steve Anton10542f22019-01-11 09:11:00 -080040#include "media/base/stream_params.h"
41#include "media/base/test_utils.h"
42#include "media/engine/fake_webrtc_call.h"
43#include "p2p/base/dtls_transport_internal.h"
44#include "p2p/base/fake_dtls_transport.h"
45#include "p2p/base/p2p_constants.h"
Ruslan Burakov501bfba2019-02-11 10:29:19 +010046#include "pc/audio_rtp_receiver.h"
Steve Anton10542f22019-01-11 09:11:00 -080047#include "pc/audio_track.h"
Yves Gerey3e707812018-11-28 16:47:49 +010048#include "pc/channel.h"
Steve Anton10542f22019-01-11 09:11:00 -080049#include "pc/channel_manager.h"
50#include "pc/dtls_srtp_transport.h"
51#include "pc/local_audio_source.h"
52#include "pc/media_stream.h"
Ruslan Burakov7ea46052019-02-16 02:07:05 +010053#include "pc/remote_audio_source.h"
Steve Anton10542f22019-01-11 09:11:00 -080054#include "pc/rtp_receiver.h"
55#include "pc/rtp_sender.h"
56#include "pc/rtp_transport_internal.h"
57#include "pc/test/fake_video_track_source.h"
Ruslan Burakov501bfba2019-02-11 10:29:19 +010058#include "pc/video_rtp_receiver.h"
Steve Anton10542f22019-01-11 09:11:00 -080059#include "pc/video_track.h"
Yves Gerey3e707812018-11-28 16:47:49 +010060#include "rtc_base/checks.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020061#include "rtc_base/gunit.h"
Yves Gerey3e707812018-11-28 16:47:49 +010062#include "rtc_base/third_party/sigslot/sigslot.h"
63#include "rtc_base/thread.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020064#include "test/gmock.h"
65#include "test/gtest.h"
deadbeef70ab1a12015-09-28 16:53:55 -070066
67using ::testing::_;
Amit Hilbuch2297d332019-02-19 12:49:22 -080068using ::testing::ContainerEq;
deadbeef70ab1a12015-09-28 16:53:55 -070069using ::testing::Exactly;
deadbeef5dd42fd2016-05-02 16:20:01 -070070using ::testing::InvokeWithoutArgs;
skvladdc1c62c2016-03-16 19:07:43 -070071using ::testing::Return;
Amit Hilbuch2297d332019-02-19 12:49:22 -080072using RidList = std::vector<std::string>;
deadbeef70ab1a12015-09-28 16:53:55 -070073
deadbeef20cb0c12017-02-01 20:27:00 -080074namespace {
75
Seth Hampson845e8782018-03-02 11:34:10 -080076static const char kStreamId1[] = "local_stream_1";
deadbeef70ab1a12015-09-28 16:53:55 -070077static const char kVideoTrackId[] = "video_1";
78static const char kAudioTrackId[] = "audio_1";
Peter Boström0c4e06b2015-10-07 12:23:21 +020079static const uint32_t kVideoSsrc = 98;
deadbeeffac06552015-11-25 11:26:01 -080080static const uint32_t kVideoSsrc2 = 100;
Peter Boström0c4e06b2015-10-07 12:23:21 +020081static const uint32_t kAudioSsrc = 99;
deadbeeffac06552015-11-25 11:26:01 -080082static const uint32_t kAudioSsrc2 = 101;
Florent Castelli892acf02018-10-01 22:47:20 +020083static const uint32_t kVideoSsrcSimulcast = 102;
84static const uint32_t kVideoSimulcastLayerCount = 2;
deadbeef20cb0c12017-02-01 20:27:00 -080085static const int kDefaultTimeout = 10000; // 10 seconds.
Guido Urdaneta1ff16c82019-05-20 19:31:53 +020086
87class MockSetStreamsObserver
88 : public webrtc::RtpSenderBase::SetStreamsObserver {
89 public:
Danil Chapovalov3a353122020-05-15 11:16:53 +020090 MOCK_METHOD(void, OnSetStreams, (), (override));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +020091};
92
deadbeef20cb0c12017-02-01 20:27:00 -080093} // namespace
deadbeef70ab1a12015-09-28 16:53:55 -070094
95namespace webrtc {
96
Amit Hilbuch2297d332019-02-19 12:49:22 -080097class RtpSenderReceiverTest
Mirko Bonadei6a489f22019-04-09 15:11:12 +020098 : public ::testing::Test,
99 public ::testing::WithParamInterface<std::pair<RidList, RidList>>,
Amit Hilbuch2297d332019-02-19 12:49:22 -0800100 public sigslot::has_slots<> {
tkchin3784b4a2016-06-24 19:31:47 -0700101 public:
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700102 RtpSenderReceiverTest()
Steve Anton47136dd2018-01-12 10:49:35 -0800103 : network_thread_(rtc::Thread::Current()),
104 worker_thread_(rtc::Thread::Current()),
Jonas Orelanda3aa9bd2019-04-17 07:38:40 +0200105 video_bitrate_allocator_factory_(
106 webrtc::CreateBuiltinVideoBitrateAllocatorFactory()),
Steve Anton47136dd2018-01-12 10:49:35 -0800107 // Create fake media engine/etc. so we can create channels to use to
108 // test RtpSenders/RtpReceivers.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700109 media_engine_(new cricket::FakeMediaEngine()),
Tomas Gunnarssone984aa22021-04-19 09:21:06 +0200110 fake_call_(worker_thread_, network_thread_),
Seth Hampson845e8782018-03-02 11:34:10 -0800111 local_stream_(MediaStream::Create(kStreamId1)) {
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200112 worker_thread_->Invoke<void>(RTC_FROM_HERE, [&]() {
113 channel_manager_ = cricket::ChannelManager::Create(
Harald Alvestrand7af57c62021-04-16 11:12:14 +0000114 absl::WrapUnique(media_engine_), false, worker_thread_,
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200115 network_thread_);
116 });
117
deadbeef7af91dd2016-12-13 11:29:11 -0800118 bool srtp_required = true;
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200119 rtp_dtls_transport_ = std::make_unique<cricket::FakeDtlsTransport>(
Zhi Huange830e682018-03-30 10:48:35 -0700120 "fake_dtls_transport", cricket::ICE_CANDIDATE_COMPONENT_RTP);
121 rtp_transport_ = CreateDtlsSrtpTransport();
122
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200123 voice_channel_ = channel_manager_->CreateVoiceChannel(
Zhi Huange830e682018-03-30 10:48:35 -0700124 &fake_call_, cricket::MediaConfig(), rtp_transport_.get(),
Niels Möller2a707032020-06-16 16:39:13 +0200125 rtc::Thread::Current(), cricket::CN_AUDIO, srtp_required,
126 webrtc::CryptoOptions(), &ssrc_generator_, cricket::AudioOptions());
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200127 video_channel_ = channel_manager_->CreateVideoChannel(
Zhi Huange830e682018-03-30 10:48:35 -0700128 &fake_call_, cricket::MediaConfig(), rtp_transport_.get(),
Niels Möller2a707032020-06-16 16:39:13 +0200129 rtc::Thread::Current(), cricket::CN_VIDEO, srtp_required,
130 webrtc::CryptoOptions(), &ssrc_generator_, cricket::VideoOptions(),
131 video_bitrate_allocator_factory_.get());
deadbeef20cb0c12017-02-01 20:27:00 -0800132 voice_channel_->Enable(true);
133 video_channel_->Enable(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700134 voice_media_channel_ = media_engine_->GetVoiceChannel(0);
135 video_media_channel_ = media_engine_->GetVideoChannel(0);
136 RTC_CHECK(voice_channel_);
137 RTC_CHECK(video_channel_);
138 RTC_CHECK(voice_media_channel_);
139 RTC_CHECK(video_media_channel_);
140
141 // Create streams for predefined SSRCs. Streams need to exist in order
142 // for the senders and receievers to apply parameters to them.
143 // Normally these would be created by SetLocalDescription and
144 // SetRemoteDescription.
145 voice_media_channel_->AddSendStream(
146 cricket::StreamParams::CreateLegacy(kAudioSsrc));
147 voice_media_channel_->AddRecvStream(
148 cricket::StreamParams::CreateLegacy(kAudioSsrc));
149 voice_media_channel_->AddSendStream(
150 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
151 voice_media_channel_->AddRecvStream(
152 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
153 video_media_channel_->AddSendStream(
154 cricket::StreamParams::CreateLegacy(kVideoSsrc));
155 video_media_channel_->AddRecvStream(
156 cricket::StreamParams::CreateLegacy(kVideoSsrc));
157 video_media_channel_->AddSendStream(
158 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
159 video_media_channel_->AddRecvStream(
160 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
tkchin3784b4a2016-06-24 19:31:47 -0700161 }
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700162
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200163 ~RtpSenderReceiverTest() {
164 audio_rtp_sender_ = nullptr;
165 video_rtp_sender_ = nullptr;
166 audio_rtp_receiver_ = nullptr;
167 video_rtp_receiver_ = nullptr;
168 local_stream_ = nullptr;
169 video_track_ = nullptr;
170 audio_track_ = nullptr;
171 worker_thread_->Invoke<void>(RTC_FROM_HERE,
172 [&]() { channel_manager_.reset(); });
173 }
174
Zhi Huange830e682018-03-30 10:48:35 -0700175 std::unique_ptr<webrtc::RtpTransportInternal> CreateDtlsSrtpTransport() {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200176 auto dtls_srtp_transport = std::make_unique<webrtc::DtlsSrtpTransport>(
Karl Wiberg918f50c2018-07-05 11:40:33 +0200177 /*rtcp_mux_required=*/true);
Zhi Huange830e682018-03-30 10:48:35 -0700178 dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport_.get(),
179 /*rtcp_dtls_transport=*/nullptr);
180 return dtls_srtp_transport;
181 }
182
deadbeef20cb0c12017-02-01 20:27:00 -0800183 // Needed to use DTMF sender.
184 void AddDtmfCodec() {
185 cricket::AudioSendParameters params;
186 const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000,
187 0, 1);
188 params.codecs.push_back(kTelephoneEventCodec);
189 voice_media_channel_->SetSendParameters(params);
190 }
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700191
pbos5214a0a2016-12-16 15:39:11 -0800192 void AddVideoTrack() { AddVideoTrack(false); }
193
194 void AddVideoTrack(bool is_screencast) {
perkja3ede6c2016-03-08 01:27:48 +0100195 rtc::scoped_refptr<VideoTrackSourceInterface> source(
pbos5214a0a2016-12-16 15:39:11 -0800196 FakeVideoTrackSource::Create(is_screencast));
perkj773be362017-07-31 23:22:01 -0700197 video_track_ =
198 VideoTrack::Create(kVideoTrackId, source, rtc::Thread::Current());
deadbeefe814a0d2017-02-25 18:15:09 -0800199 EXPECT_TRUE(local_stream_->AddTrack(video_track_));
deadbeef70ab1a12015-09-28 16:53:55 -0700200 }
201
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700202 void CreateAudioRtpSender() { CreateAudioRtpSender(nullptr); }
203
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +0100204 void CreateAudioRtpSender(
205 const rtc::scoped_refptr<LocalAudioSource>& source) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700206 audio_track_ = AudioTrack::Create(kAudioTrackId, source);
deadbeefe814a0d2017-02-25 18:15:09 -0800207 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200208 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200209 std::make_unique<MockSetStreamsObserver>();
Steve Anton47136dd2018-01-12 10:49:35 -0800210 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200211 AudioRtpSender::Create(worker_thread_, audio_track_->id(), nullptr,
212 set_streams_observer.get());
Steve Anton111fdfd2018-06-25 13:03:36 -0700213 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200214 EXPECT_CALL(*set_streams_observer, OnSetStreams());
215 audio_rtp_sender_->SetStreams({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800216 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
deadbeeffac06552015-11-25 11:26:01 -0800217 audio_rtp_sender_->SetSsrc(kAudioSsrc);
deadbeef20cb0c12017-02-01 20:27:00 -0800218 audio_rtp_sender_->GetOnDestroyedSignal()->connect(
219 this, &RtpSenderReceiverTest::OnAudioSenderDestroyed);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700220 VerifyVoiceChannelInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700221 }
222
Steve Anton02ee47c2018-01-10 16:26:06 -0800223 void CreateAudioRtpSenderWithNoTrack() {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800224 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200225 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800226 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
Steve Anton02ee47c2018-01-10 16:26:06 -0800227 }
228
deadbeef20cb0c12017-02-01 20:27:00 -0800229 void OnAudioSenderDestroyed() { audio_sender_destroyed_signal_fired_ = true; }
230
Seth Hampson2d2c8882018-05-16 16:02:32 -0700231 void CreateVideoRtpSender(uint32_t ssrc) {
232 CreateVideoRtpSender(false, ssrc);
233 }
234
pbos5214a0a2016-12-16 15:39:11 -0800235 void CreateVideoRtpSender() { CreateVideoRtpSender(false); }
236
Amit Hilbuch2297d332019-02-19 12:49:22 -0800237 cricket::StreamParams CreateSimulcastStreamParams(int num_layers) {
Florent Castelli892acf02018-10-01 22:47:20 +0200238 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +0100239 ssrcs.reserve(num_layers);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800240 for (int i = 0; i < num_layers; ++i) {
Florent Castelli892acf02018-10-01 22:47:20 +0200241 ssrcs.push_back(kVideoSsrcSimulcast + i);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800242 }
243 return cricket::CreateSimStreamParams("cname", ssrcs);
244 }
245
246 uint32_t CreateVideoRtpSender(const cricket::StreamParams& stream_params) {
Florent Castelli892acf02018-10-01 22:47:20 +0200247 video_media_channel_->AddSendStream(stream_params);
248 uint32_t primary_ssrc = stream_params.first_ssrc();
249 CreateVideoRtpSender(primary_ssrc);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800250 return primary_ssrc;
251 }
252
253 uint32_t CreateVideoRtpSenderWithSimulcast(
254 int num_layers = kVideoSimulcastLayerCount) {
255 return CreateVideoRtpSender(CreateSimulcastStreamParams(num_layers));
256 }
257
258 uint32_t CreateVideoRtpSenderWithSimulcast(
259 const std::vector<std::string>& rids) {
260 cricket::StreamParams stream_params =
261 CreateSimulcastStreamParams(rids.size());
262 std::vector<cricket::RidDescription> rid_descriptions;
263 absl::c_transform(
264 rids, std::back_inserter(rid_descriptions), [](const std::string& rid) {
265 return cricket::RidDescription(rid, cricket::RidDirection::kSend);
266 });
267 stream_params.set_rids(rid_descriptions);
268 return CreateVideoRtpSender(stream_params);
Florent Castelli892acf02018-10-01 22:47:20 +0200269 }
270
Seth Hampson2d2c8882018-05-16 16:02:32 -0700271 void CreateVideoRtpSender(bool is_screencast, uint32_t ssrc = kVideoSsrc) {
pbos5214a0a2016-12-16 15:39:11 -0800272 AddVideoTrack(is_screencast);
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200273 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200274 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200275 video_rtp_sender_ = VideoRtpSender::Create(
276 worker_thread_, video_track_->id(), set_streams_observer.get());
Steve Anton111fdfd2018-06-25 13:03:36 -0700277 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200278 EXPECT_CALL(*set_streams_observer, OnSetStreams());
279 video_rtp_sender_->SetStreams({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800280 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Seth Hampson2d2c8882018-05-16 16:02:32 -0700281 video_rtp_sender_->SetSsrc(ssrc);
282 VerifyVideoChannelInput(ssrc);
deadbeef70ab1a12015-09-28 16:53:55 -0700283 }
Steve Anton02ee47c2018-01-10 16:26:06 -0800284 void CreateVideoRtpSenderWithNoTrack() {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200285 video_rtp_sender_ =
286 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800287 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Steve Anton02ee47c2018-01-10 16:26:06 -0800288 }
289
deadbeef70ab1a12015-09-28 16:53:55 -0700290 void DestroyAudioRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700291 audio_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700292 VerifyVoiceChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700293 }
294
295 void DestroyVideoRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700296 video_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700297 VerifyVideoChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700298 }
299
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100300 void CreateAudioRtpReceiver(
301 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
Mirko Bonadei05cf6be2019-01-31 21:38:12 +0100302 audio_rtp_receiver_ =
Henrik Boströmc335b0e2021-04-08 07:25:38 +0200303 new AudioRtpReceiver(rtc::Thread::Current(), kAudioTrackId, streams,
304 /*is_unified_plan=*/true);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800305 audio_rtp_receiver_->SetMediaChannel(voice_media_channel_);
Steve Antond3679212018-01-17 17:41:02 -0800306 audio_rtp_receiver_->SetupMediaChannel(kAudioSsrc);
perkjd61bf802016-03-24 03:16:19 -0700307 audio_track_ = audio_rtp_receiver_->audio_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700308 VerifyVoiceChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700309 }
310
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100311 void CreateVideoRtpReceiver(
312 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
Mirko Bonadei05cf6be2019-01-31 21:38:12 +0100313 video_rtp_receiver_ =
314 new VideoRtpReceiver(rtc::Thread::Current(), kVideoTrackId, streams);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800315 video_rtp_receiver_->SetMediaChannel(video_media_channel_);
Steve Antond3679212018-01-17 17:41:02 -0800316 video_rtp_receiver_->SetupMediaChannel(kVideoSsrc);
perkjf0dcfe22016-03-10 18:32:00 +0100317 video_track_ = video_rtp_receiver_->video_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700318 VerifyVideoChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700319 }
320
Florent Castelli38332cd2018-11-20 14:08:06 +0100321 void CreateVideoRtpReceiverWithSimulcast(
322 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {},
323 int num_layers = kVideoSimulcastLayerCount) {
324 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +0100325 ssrcs.reserve(num_layers);
Florent Castelli38332cd2018-11-20 14:08:06 +0100326 for (int i = 0; i < num_layers; ++i)
327 ssrcs.push_back(kVideoSsrcSimulcast + i);
328 cricket::StreamParams stream_params =
329 cricket::CreateSimStreamParams("cname", ssrcs);
330 video_media_channel_->AddRecvStream(stream_params);
331 uint32_t primary_ssrc = stream_params.first_ssrc();
332
Mirko Bonadei05cf6be2019-01-31 21:38:12 +0100333 video_rtp_receiver_ =
334 new VideoRtpReceiver(rtc::Thread::Current(), kVideoTrackId, streams);
Florent Castelli38332cd2018-11-20 14:08:06 +0100335 video_rtp_receiver_->SetMediaChannel(video_media_channel_);
336 video_rtp_receiver_->SetupMediaChannel(primary_ssrc);
337 video_track_ = video_rtp_receiver_->video_track();
338 }
339
deadbeef70ab1a12015-09-28 16:53:55 -0700340 void DestroyAudioRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700341 audio_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700342 VerifyVoiceChannelNoOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700343 }
344
345 void DestroyVideoRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700346 video_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700347 VerifyVideoChannelNoOutput();
348 }
349
350 void VerifyVoiceChannelInput() { VerifyVoiceChannelInput(kAudioSsrc); }
351
352 void VerifyVoiceChannelInput(uint32_t ssrc) {
353 // Verify that the media channel has an audio source, and the stream isn't
354 // muted.
355 EXPECT_TRUE(voice_media_channel_->HasSource(ssrc));
356 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(ssrc));
357 }
358
359 void VerifyVideoChannelInput() { VerifyVideoChannelInput(kVideoSsrc); }
360
361 void VerifyVideoChannelInput(uint32_t ssrc) {
362 // Verify that the media channel has a video source,
363 EXPECT_TRUE(video_media_channel_->HasSource(ssrc));
364 }
365
366 void VerifyVoiceChannelNoInput() { VerifyVoiceChannelNoInput(kAudioSsrc); }
367
368 void VerifyVoiceChannelNoInput(uint32_t ssrc) {
369 // Verify that the media channel's source is reset.
370 EXPECT_FALSE(voice_media_channel_->HasSource(ssrc));
371 }
372
373 void VerifyVideoChannelNoInput() { VerifyVideoChannelNoInput(kVideoSsrc); }
374
375 void VerifyVideoChannelNoInput(uint32_t ssrc) {
376 // Verify that the media channel's source is reset.
377 EXPECT_FALSE(video_media_channel_->HasSource(ssrc));
378 }
379
380 void VerifyVoiceChannelOutput() {
381 // Verify that the volume is initialized to 1.
382 double volume;
383 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
384 EXPECT_EQ(1, volume);
385 }
386
387 void VerifyVideoChannelOutput() {
388 // Verify that the media channel has a sink.
389 EXPECT_TRUE(video_media_channel_->HasSink(kVideoSsrc));
390 }
391
392 void VerifyVoiceChannelNoOutput() {
393 // Verify that the volume is reset to 0.
394 double volume;
395 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
396 EXPECT_EQ(0, volume);
397 }
398
399 void VerifyVideoChannelNoOutput() {
400 // Verify that the media channel's sink is reset.
401 EXPECT_FALSE(video_media_channel_->HasSink(kVideoSsrc));
deadbeef70ab1a12015-09-28 16:53:55 -0700402 }
403
Amit Hilbuch2297d332019-02-19 12:49:22 -0800404 // Verifies that the encoding layers contain the specified RIDs.
405 bool VerifyEncodingLayers(const VideoRtpSender& sender,
406 const std::vector<std::string>& rids) {
407 bool has_failure = HasFailure();
408 RtpParameters parameters = sender.GetParameters();
409 std::vector<std::string> encoding_rids;
410 absl::c_transform(
411 parameters.encodings, std::back_inserter(encoding_rids),
412 [](const RtpEncodingParameters& encoding) { return encoding.rid; });
413 EXPECT_THAT(rids, ContainerEq(encoding_rids));
414 return has_failure || !HasFailure();
415 }
416
417 // Runs a test for disabling the encoding layers on the specified sender.
418 void RunDisableEncodingLayersTest(
419 const std::vector<std::string>& all_layers,
420 const std::vector<std::string>& disabled_layers,
421 VideoRtpSender* sender) {
422 std::vector<std::string> expected;
423 absl::c_copy_if(all_layers, std::back_inserter(expected),
424 [&disabled_layers](const std::string& rid) {
425 return !absl::c_linear_search(disabled_layers, rid);
426 });
427
428 EXPECT_TRUE(VerifyEncodingLayers(*sender, all_layers));
429 sender->DisableEncodingLayers(disabled_layers);
430 EXPECT_TRUE(VerifyEncodingLayers(*sender, expected));
431 }
432
433 // Runs a test for setting an encoding layer as inactive.
434 // This test assumes that some layers have already been disabled.
435 void RunSetLastLayerAsInactiveTest(VideoRtpSender* sender) {
436 auto parameters = sender->GetParameters();
437 if (parameters.encodings.size() == 0) {
438 return;
439 }
440
441 RtpEncodingParameters& encoding = parameters.encodings.back();
442 auto rid = encoding.rid;
443 EXPECT_TRUE(encoding.active);
444 encoding.active = false;
445 auto error = sender->SetParameters(parameters);
446 ASSERT_TRUE(error.ok());
447 parameters = sender->GetParameters();
448 RtpEncodingParameters& result_encoding = parameters.encodings.back();
449 EXPECT_EQ(rid, result_encoding.rid);
450 EXPECT_FALSE(result_encoding.active);
451 }
452
453 // Runs a test for disabling the encoding layers on a sender without a media
454 // channel.
455 void RunDisableSimulcastLayersWithoutMediaEngineTest(
456 const std::vector<std::string>& all_layers,
457 const std::vector<std::string>& disabled_layers) {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200458 auto sender = VideoRtpSender::Create(rtc::Thread::Current(), "1", nullptr);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800459 RtpParameters parameters;
460 parameters.encodings.resize(all_layers.size());
461 for (size_t i = 0; i < all_layers.size(); ++i) {
462 parameters.encodings[i].rid = all_layers[i];
463 }
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800464 sender->set_init_send_encodings(parameters.encodings);
465 RunDisableEncodingLayersTest(all_layers, disabled_layers, sender.get());
466 RunSetLastLayerAsInactiveTest(sender.get());
Amit Hilbuch2297d332019-02-19 12:49:22 -0800467 }
468
469 // Runs a test for disabling the encoding layers on a sender with a media
470 // channel.
471 void RunDisableSimulcastLayersWithMediaEngineTest(
472 const std::vector<std::string>& all_layers,
473 const std::vector<std::string>& disabled_layers) {
474 uint32_t ssrc = CreateVideoRtpSenderWithSimulcast(all_layers);
475 RunDisableEncodingLayersTest(all_layers, disabled_layers,
476 video_rtp_sender_.get());
477
478 auto channel_parameters = video_media_channel_->GetRtpSendParameters(ssrc);
479 ASSERT_EQ(channel_parameters.encodings.size(), all_layers.size());
480 for (size_t i = 0; i < all_layers.size(); ++i) {
481 EXPECT_EQ(all_layers[i], channel_parameters.encodings[i].rid);
482 bool is_active = !absl::c_linear_search(disabled_layers, all_layers[i]);
483 EXPECT_EQ(is_active, channel_parameters.encodings[i].active);
484 }
485
486 RunSetLastLayerAsInactiveTest(video_rtp_sender_.get());
487 }
488
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200489 // Check that minimum Jitter Buffer delay is propagated to the underlying
490 // |media_channel|.
491 void VerifyRtpReceiverDelayBehaviour(cricket::Delayable* media_channel,
492 RtpReceiverInterface* receiver,
493 uint32_t ssrc) {
494 receiver->SetJitterBufferMinimumDelay(/*delay_seconds=*/0.5);
495 absl::optional<int> delay_ms =
496 media_channel->GetBaseMinimumPlayoutDelayMs(ssrc); // In milliseconds.
497 EXPECT_DOUBLE_EQ(0.5, delay_ms.value_or(0) / 1000.0);
498 }
499
deadbeef70ab1a12015-09-28 16:53:55 -0700500 protected:
Steve Anton47136dd2018-01-12 10:49:35 -0800501 rtc::Thread* const network_thread_;
502 rtc::Thread* const worker_thread_;
Danil Chapovalov83bbe912019-08-07 12:24:53 +0200503 webrtc::RtcEventLogNull event_log_;
Zhi Huange830e682018-03-30 10:48:35 -0700504 // The |rtp_dtls_transport_| and |rtp_transport_| should be destroyed after
505 // the |channel_manager|.
506 std::unique_ptr<cricket::DtlsTransportInternal> rtp_dtls_transport_;
507 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport_;
Jonas Orelanda3aa9bd2019-04-17 07:38:40 +0200508 std::unique_ptr<webrtc::VideoBitrateAllocatorFactory>
509 video_bitrate_allocator_factory_;
deadbeef112b2e92017-02-10 20:13:37 -0800510 // |media_engine_| is actually owned by |channel_manager_|.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700511 cricket::FakeMediaEngine* media_engine_;
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200512 std::unique_ptr<cricket::ChannelManager> channel_manager_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700513 cricket::FakeCall fake_call_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700514 cricket::VoiceChannel* voice_channel_;
515 cricket::VideoChannel* video_channel_;
516 cricket::FakeVoiceMediaChannel* voice_media_channel_;
517 cricket::FakeVideoMediaChannel* video_media_channel_;
deadbeef70ab1a12015-09-28 16:53:55 -0700518 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
519 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
520 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
521 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
deadbeefe814a0d2017-02-25 18:15:09 -0800522 rtc::scoped_refptr<MediaStreamInterface> local_stream_;
deadbeef70ab1a12015-09-28 16:53:55 -0700523 rtc::scoped_refptr<VideoTrackInterface> video_track_;
524 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
deadbeef20cb0c12017-02-01 20:27:00 -0800525 bool audio_sender_destroyed_signal_fired_ = false;
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800526 rtc::UniqueRandomIdGenerator ssrc_generator_;
deadbeef70ab1a12015-09-28 16:53:55 -0700527};
528
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700529// Test that |voice_channel_| is updated when an audio track is associated
deadbeef70ab1a12015-09-28 16:53:55 -0700530// and disassociated with an AudioRtpSender.
531TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
532 CreateAudioRtpSender();
533 DestroyAudioRtpSender();
534}
535
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700536// Test that |video_channel_| is updated when a video track is associated and
deadbeef70ab1a12015-09-28 16:53:55 -0700537// disassociated with a VideoRtpSender.
538TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
539 CreateVideoRtpSender();
540 DestroyVideoRtpSender();
541}
542
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700543// Test that |voice_channel_| is updated when a remote audio track is
deadbeef70ab1a12015-09-28 16:53:55 -0700544// associated and disassociated with an AudioRtpReceiver.
545TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
546 CreateAudioRtpReceiver();
547 DestroyAudioRtpReceiver();
548}
549
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700550// Test that |video_channel_| is updated when a remote video track is
551// associated and disassociated with a VideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700552TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
553 CreateVideoRtpReceiver();
554 DestroyVideoRtpReceiver();
555}
556
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100557TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiverWithStreams) {
558 CreateAudioRtpReceiver({local_stream_});
559 DestroyAudioRtpReceiver();
560}
561
562TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiverWithStreams) {
563 CreateVideoRtpReceiver({local_stream_});
564 DestroyVideoRtpReceiver();
565}
566
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700567// Test that the AudioRtpSender applies options from the local audio source.
568TEST_F(RtpSenderReceiverTest, LocalAudioSourceOptionsApplied) {
569 cricket::AudioOptions options;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100570 options.echo_cancellation = true;
deadbeef757146b2017-02-10 21:26:48 -0800571 auto source = LocalAudioSource::Create(&options);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700572 CreateAudioRtpSender(source.get());
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700573
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100574 EXPECT_EQ(true, voice_media_channel_->options().echo_cancellation);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700575
576 DestroyAudioRtpSender();
577}
578
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700579// Test that the stream is muted when the track is disabled, and unmuted when
580// the track is enabled.
581TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) {
582 CreateAudioRtpSender();
583
584 audio_track_->set_enabled(false);
585 EXPECT_TRUE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
586
587 audio_track_->set_enabled(true);
588 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
589
590 DestroyAudioRtpSender();
591}
592
593// Test that the volume is set to 0 when the track is disabled, and back to
594// 1 when the track is enabled.
deadbeef70ab1a12015-09-28 16:53:55 -0700595TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
596 CreateAudioRtpReceiver();
597
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700598 double volume;
599 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
600 EXPECT_EQ(1, volume);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700601
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700602 audio_track_->set_enabled(false);
603 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
604 EXPECT_EQ(0, volume);
605
deadbeef70ab1a12015-09-28 16:53:55 -0700606 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700607 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
608 EXPECT_EQ(1, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700609
610 DestroyAudioRtpReceiver();
611}
612
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700613// Currently no action is taken when a remote video track is disabled or
614// enabled, so there's nothing to test here, other than what is normally
615// verified in DestroyVideoRtpSender.
deadbeef70ab1a12015-09-28 16:53:55 -0700616TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
617 CreateVideoRtpSender();
618
deadbeef70ab1a12015-09-28 16:53:55 -0700619 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700620 video_track_->set_enabled(true);
621
622 DestroyVideoRtpSender();
623}
624
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700625// Test that the state of the video track created by the VideoRtpReceiver is
626// updated when the receiver is destroyed.
perkjf0dcfe22016-03-10 18:32:00 +0100627TEST_F(RtpSenderReceiverTest, RemoteVideoTrackState) {
628 CreateVideoRtpReceiver();
629
630 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track_->state());
631 EXPECT_EQ(webrtc::MediaSourceInterface::kLive,
632 video_track_->GetSource()->state());
633
634 DestroyVideoRtpReceiver();
635
636 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track_->state());
637 EXPECT_EQ(webrtc::MediaSourceInterface::kEnded,
638 video_track_->GetSource()->state());
639}
640
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700641// Currently no action is taken when a remote video track is disabled or
642// enabled, so there's nothing to test here, other than what is normally
643// verified in DestroyVideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700644TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
645 CreateVideoRtpReceiver();
646
647 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700648 video_track_->set_enabled(true);
649
650 DestroyVideoRtpReceiver();
651}
652
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700653// Test that the AudioRtpReceiver applies volume changes from the track source
654// to the media channel.
deadbeef70ab1a12015-09-28 16:53:55 -0700655TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
656 CreateAudioRtpReceiver();
657
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700658 double volume;
659 audio_track_->GetSource()->SetVolume(0.5);
660 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
661 EXPECT_EQ(0.5, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700662
663 // Disable the audio track, this should prevent setting the volume.
deadbeef70ab1a12015-09-28 16:53:55 -0700664 audio_track_->set_enabled(false);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700665 audio_track_->GetSource()->SetVolume(0.8);
666 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
667 EXPECT_EQ(0, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700668
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700669 // When the track is enabled, the previously set volume should take effect.
deadbeef70ab1a12015-09-28 16:53:55 -0700670 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700671 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
672 EXPECT_EQ(0.8, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700673
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700674 // Try changing volume one more time.
675 audio_track_->GetSource()->SetVolume(0.9);
676 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
677 EXPECT_EQ(0.9, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700678
679 DestroyAudioRtpReceiver();
680}
681
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200682TEST_F(RtpSenderReceiverTest, AudioRtpReceiverDelay) {
683 CreateAudioRtpReceiver();
684 VerifyRtpReceiverDelayBehaviour(voice_media_channel_,
685 audio_rtp_receiver_.get(), kAudioSsrc);
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200686}
687
688TEST_F(RtpSenderReceiverTest, VideoRtpReceiverDelay) {
689 CreateVideoRtpReceiver();
690 VerifyRtpReceiverDelayBehaviour(video_media_channel_,
691 video_rtp_receiver_.get(), kVideoSsrc);
692}
693
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700694// Test that the media channel isn't enabled for sending if the audio sender
695// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800696TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800697 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800698 rtc::scoped_refptr<AudioTrackInterface> track =
699 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700700
701 // Track but no SSRC.
702 EXPECT_TRUE(audio_rtp_sender_->SetTrack(track));
703 VerifyVoiceChannelNoInput();
704
705 // SSRC but no track.
706 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
707 audio_rtp_sender_->SetSsrc(kAudioSsrc);
708 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800709}
710
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700711// Test that the media channel isn't enabled for sending if the video sender
712// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800713TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800714 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700715
716 // Track but no SSRC.
717 EXPECT_TRUE(video_rtp_sender_->SetTrack(video_track_));
718 VerifyVideoChannelNoInput();
719
720 // SSRC but no track.
721 EXPECT_TRUE(video_rtp_sender_->SetTrack(nullptr));
722 video_rtp_sender_->SetSsrc(kVideoSsrc);
723 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800724}
725
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700726// Test that the media channel is enabled for sending when the audio sender
727// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800728TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800729 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800730 rtc::scoped_refptr<AudioTrackInterface> track =
731 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700732 audio_rtp_sender_->SetSsrc(kAudioSsrc);
733 audio_rtp_sender_->SetTrack(track);
734 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800735
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700736 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800737}
738
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700739// Test that the media channel is enabled for sending when the audio sender
740// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800741TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800742 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800743 rtc::scoped_refptr<AudioTrackInterface> track =
744 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700745 audio_rtp_sender_->SetTrack(track);
746 audio_rtp_sender_->SetSsrc(kAudioSsrc);
747 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800748
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700749 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800750}
751
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700752// Test that the media channel is enabled for sending when the video sender
753// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800754TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
nisseaf510af2016-03-21 08:20:42 -0700755 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800756 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700757 video_rtp_sender_->SetSsrc(kVideoSsrc);
758 video_rtp_sender_->SetTrack(video_track_);
759 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800760
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700761 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800762}
763
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700764// Test that the media channel is enabled for sending when the video sender
765// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800766TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
nisseaf510af2016-03-21 08:20:42 -0700767 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800768 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700769 video_rtp_sender_->SetTrack(video_track_);
770 video_rtp_sender_->SetSsrc(kVideoSsrc);
771 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800772
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700773 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800774}
775
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700776// Test that the media channel stops sending when the audio sender's SSRC is set
777// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800778TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700779 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800780
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700781 audio_rtp_sender_->SetSsrc(0);
782 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800783}
784
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700785// Test that the media channel stops sending when the video sender's SSRC is set
786// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800787TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700788 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800789
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700790 audio_rtp_sender_->SetSsrc(0);
791 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800792}
793
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700794// Test that the media channel stops sending when the audio sender's track is
795// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800796TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700797 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800798
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700799 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
800 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800801}
802
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700803// Test that the media channel stops sending when the video sender's track is
804// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800805TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700806 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800807
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700808 video_rtp_sender_->SetSsrc(0);
809 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800810}
811
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700812// Test that when the audio sender's SSRC is changed, the media channel stops
813// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800814TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700815 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800816
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700817 audio_rtp_sender_->SetSsrc(kAudioSsrc2);
818 VerifyVoiceChannelNoInput(kAudioSsrc);
819 VerifyVoiceChannelInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800820
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700821 audio_rtp_sender_ = nullptr;
822 VerifyVoiceChannelNoInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800823}
824
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700825// Test that when the audio sender's SSRC is changed, the media channel stops
826// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800827TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700828 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800829
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700830 video_rtp_sender_->SetSsrc(kVideoSsrc2);
831 VerifyVideoChannelNoInput(kVideoSsrc);
832 VerifyVideoChannelInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800833
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700834 video_rtp_sender_ = nullptr;
835 VerifyVideoChannelNoInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800836}
837
skvladdc1c62c2016-03-16 19:07:43 -0700838TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) {
839 CreateAudioRtpSender();
840
skvladdc1c62c2016-03-16 19:07:43 -0700841 RtpParameters params = audio_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700842 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -0800843 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -0700844
845 DestroyAudioRtpSender();
846}
847
Florent Castelli892acf02018-10-01 22:47:20 +0200848TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParametersBeforeNegotiation) {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800849 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200850 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +0200851
852 RtpParameters params = audio_rtp_sender_->GetParameters();
853 ASSERT_EQ(1u, params.encodings.size());
854 params.encodings[0].max_bitrate_bps = 90000;
855 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
856
857 params = audio_rtp_sender_->GetParameters();
858 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
859 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
860
861 DestroyAudioRtpSender();
862}
863
864TEST_F(RtpSenderReceiverTest, AudioSenderInitParametersMovedAfterNegotiation) {
865 audio_track_ = AudioTrack::Create(kAudioTrackId, nullptr);
866 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
867
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200868 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200869 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200870 audio_rtp_sender_ = AudioRtpSender::Create(
871 worker_thread_, audio_track_->id(), nullptr, set_streams_observer.get());
Florent Castelli892acf02018-10-01 22:47:20 +0200872 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200873 EXPECT_CALL(*set_streams_observer, OnSetStreams());
874 audio_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli892acf02018-10-01 22:47:20 +0200875
876 std::vector<RtpEncodingParameters> init_encodings(1);
877 init_encodings[0].max_bitrate_bps = 60000;
878 audio_rtp_sender_->set_init_send_encodings(init_encodings);
879
880 RtpParameters params = audio_rtp_sender_->GetParameters();
881 ASSERT_EQ(1u, params.encodings.size());
882 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
883
884 // Simulate the setLocalDescription call
885 std::vector<uint32_t> ssrcs(1, 1);
886 cricket::StreamParams stream_params =
887 cricket::CreateSimStreamParams("cname", ssrcs);
888 voice_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800889 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +0200890 audio_rtp_sender_->SetSsrc(1);
891
892 params = audio_rtp_sender_->GetParameters();
893 ASSERT_EQ(1u, params.encodings.size());
894 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
895
896 DestroyAudioRtpSender();
897}
898
899TEST_F(RtpSenderReceiverTest,
900 AudioSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800901 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200902 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +0200903
904 RtpParameters params;
905 RTCError result = audio_rtp_sender_->SetParameters(params);
906 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
907 DestroyAudioRtpSender();
908}
909
Florent Castellicebf50f2018-05-03 15:31:53 +0200910TEST_F(RtpSenderReceiverTest,
911 AudioSenderMustCallGetParametersBeforeSetParameters) {
912 CreateAudioRtpSender();
913
914 RtpParameters params;
915 RTCError result = audio_rtp_sender_->SetParameters(params);
916 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
917
918 DestroyAudioRtpSender();
919}
920
921TEST_F(RtpSenderReceiverTest,
922 AudioSenderSetParametersInvalidatesTransactionId) {
923 CreateAudioRtpSender();
924
925 RtpParameters params = audio_rtp_sender_->GetParameters();
926 EXPECT_EQ(1u, params.encodings.size());
927 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
928 RTCError result = audio_rtp_sender_->SetParameters(params);
929 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
930
931 DestroyAudioRtpSender();
932}
933
934TEST_F(RtpSenderReceiverTest, AudioSenderDetectTransactionIdModification) {
935 CreateAudioRtpSender();
936
937 RtpParameters params = audio_rtp_sender_->GetParameters();
938 params.transaction_id = "";
939 RTCError result = audio_rtp_sender_->SetParameters(params);
940 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
941
942 DestroyAudioRtpSender();
943}
944
945TEST_F(RtpSenderReceiverTest, AudioSenderCheckTransactionIdRefresh) {
946 CreateAudioRtpSender();
947
948 RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200949 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 15:31:53 +0200950 auto saved_transaction_id = params.transaction_id;
951 params = audio_rtp_sender_->GetParameters();
952 EXPECT_NE(saved_transaction_id, params.transaction_id);
953
954 DestroyAudioRtpSender();
955}
956
957TEST_F(RtpSenderReceiverTest, AudioSenderSetParametersOldValueFail) {
958 CreateAudioRtpSender();
959
960 RtpParameters params = audio_rtp_sender_->GetParameters();
961 RtpParameters second_params = audio_rtp_sender_->GetParameters();
962
963 RTCError result = audio_rtp_sender_->SetParameters(params);
964 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
Seth Hampson2d2c8882018-05-16 16:02:32 -0700965 DestroyAudioRtpSender();
966}
967
968TEST_F(RtpSenderReceiverTest, AudioSenderCantSetUnimplementedRtpParameters) {
969 CreateAudioRtpSender();
970 RtpParameters params = audio_rtp_sender_->GetParameters();
971 EXPECT_EQ(1u, params.encodings.size());
972
Florent Castelli87b3c512018-07-18 16:00:28 +0200973 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 16:02:32 -0700974 params.mid = "dummy_mid";
975 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
976 audio_rtp_sender_->SetParameters(params).type());
977 params = audio_rtp_sender_->GetParameters();
978
Seth Hampson2d2c8882018-05-16 16:02:32 -0700979 DestroyAudioRtpSender();
980}
981
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700982TEST_F(RtpSenderReceiverTest, SetAudioMaxSendBitrate) {
983 CreateAudioRtpSender();
984
985 EXPECT_EQ(-1, voice_media_channel_->max_bps());
986 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200987 EXPECT_EQ(1U, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -0800988 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100989 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -0800990 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700991
992 // Read back the parameters and verify they have been changed.
993 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200994 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100995 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700996
997 // Verify that the audio channel received the new parameters.
998 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200999 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001000 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001001
1002 // Verify that the global bitrate limit has not been changed.
1003 EXPECT_EQ(-1, voice_media_channel_->max_bps());
1004
1005 DestroyAudioRtpSender();
1006}
1007
Seth Hampson24722b32017-12-22 09:36:42 -08001008TEST_F(RtpSenderReceiverTest, SetAudioBitratePriority) {
1009 CreateAudioRtpSender();
1010
1011 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001012 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001013 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1014 params.encodings[0].bitrate_priority);
1015 double new_bitrate_priority = 2.0;
1016 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -08001017 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -08001018
1019 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001020 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001021 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1022
1023 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001024 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001025 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1026
1027 DestroyAudioRtpSender();
1028}
1029
skvladdc1c62c2016-03-16 19:07:43 -07001030TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) {
1031 CreateVideoRtpSender();
1032
skvladdc1c62c2016-03-16 19:07:43 -07001033 RtpParameters params = video_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001034 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -08001035 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -07001036
1037 DestroyVideoRtpSender();
1038}
1039
Florent Castelli892acf02018-10-01 22:47:20 +02001040TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParametersBeforeNegotiation) {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001041 video_rtp_sender_ =
1042 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +02001043
1044 RtpParameters params = video_rtp_sender_->GetParameters();
1045 ASSERT_EQ(1u, params.encodings.size());
1046 params.encodings[0].max_bitrate_bps = 90000;
1047 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1048
1049 params = video_rtp_sender_->GetParameters();
1050 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1051 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
1052
1053 DestroyVideoRtpSender();
1054}
1055
1056TEST_F(RtpSenderReceiverTest, VideoSenderInitParametersMovedAfterNegotiation) {
1057 AddVideoTrack(false);
1058
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001059 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001060 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001061 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1062 set_streams_observer.get());
Florent Castelli892acf02018-10-01 22:47:20 +02001063 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001064 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1065 video_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli892acf02018-10-01 22:47:20 +02001066
1067 std::vector<RtpEncodingParameters> init_encodings(2);
1068 init_encodings[0].max_bitrate_bps = 60000;
1069 init_encodings[1].max_bitrate_bps = 900000;
1070 video_rtp_sender_->set_init_send_encodings(init_encodings);
1071
1072 RtpParameters params = video_rtp_sender_->GetParameters();
1073 ASSERT_EQ(2u, params.encodings.size());
1074 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1075 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
1076
1077 // Simulate the setLocalDescription call
1078 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +01001079 ssrcs.reserve(2);
Florent Castelli892acf02018-10-01 22:47:20 +02001080 for (int i = 0; i < 2; ++i)
1081 ssrcs.push_back(kVideoSsrcSimulcast + i);
1082 cricket::StreamParams stream_params =
1083 cricket::CreateSimStreamParams("cname", ssrcs);
1084 video_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -08001085 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +02001086 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
1087
1088 params = video_rtp_sender_->GetParameters();
1089 ASSERT_EQ(2u, params.encodings.size());
1090 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1091 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
1092
1093 DestroyVideoRtpSender();
1094}
1095
1096TEST_F(RtpSenderReceiverTest,
1097 VideoSenderInitParametersMovedAfterManualSimulcastAndNegotiation) {
1098 AddVideoTrack(false);
1099
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001100 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001101 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001102 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1103 set_streams_observer.get());
Florent Castelli892acf02018-10-01 22:47:20 +02001104 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001105 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1106 video_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli892acf02018-10-01 22:47:20 +02001107
1108 std::vector<RtpEncodingParameters> init_encodings(1);
1109 init_encodings[0].max_bitrate_bps = 60000;
1110 video_rtp_sender_->set_init_send_encodings(init_encodings);
1111
1112 RtpParameters params = video_rtp_sender_->GetParameters();
1113 ASSERT_EQ(1u, params.encodings.size());
1114 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1115
1116 // Simulate the setLocalDescription call as if the user used SDP munging
1117 // to enable simulcast
1118 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +01001119 ssrcs.reserve(2);
Florent Castelli892acf02018-10-01 22:47:20 +02001120 for (int i = 0; i < 2; ++i)
1121 ssrcs.push_back(kVideoSsrcSimulcast + i);
1122 cricket::StreamParams stream_params =
1123 cricket::CreateSimStreamParams("cname", ssrcs);
1124 video_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -08001125 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +02001126 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
1127
1128 params = video_rtp_sender_->GetParameters();
1129 ASSERT_EQ(2u, params.encodings.size());
1130 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1131
1132 DestroyVideoRtpSender();
1133}
1134
1135TEST_F(RtpSenderReceiverTest,
1136 VideoSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001137 video_rtp_sender_ =
1138 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +02001139
1140 RtpParameters params;
1141 RTCError result = video_rtp_sender_->SetParameters(params);
1142 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1143 DestroyVideoRtpSender();
1144}
1145
Florent Castellicebf50f2018-05-03 15:31:53 +02001146TEST_F(RtpSenderReceiverTest,
1147 VideoSenderMustCallGetParametersBeforeSetParameters) {
1148 CreateVideoRtpSender();
1149
1150 RtpParameters params;
1151 RTCError result = video_rtp_sender_->SetParameters(params);
1152 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1153
1154 DestroyVideoRtpSender();
1155}
1156
1157TEST_F(RtpSenderReceiverTest,
1158 VideoSenderSetParametersInvalidatesTransactionId) {
1159 CreateVideoRtpSender();
1160
1161 RtpParameters params = video_rtp_sender_->GetParameters();
1162 EXPECT_EQ(1u, params.encodings.size());
1163 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1164 RTCError result = video_rtp_sender_->SetParameters(params);
1165 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1166
1167 DestroyVideoRtpSender();
1168}
1169
1170TEST_F(RtpSenderReceiverTest, VideoSenderDetectTransactionIdModification) {
1171 CreateVideoRtpSender();
1172
1173 RtpParameters params = video_rtp_sender_->GetParameters();
1174 params.transaction_id = "";
1175 RTCError result = video_rtp_sender_->SetParameters(params);
1176 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1177
1178 DestroyVideoRtpSender();
1179}
1180
1181TEST_F(RtpSenderReceiverTest, VideoSenderCheckTransactionIdRefresh) {
1182 CreateVideoRtpSender();
1183
1184 RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001185 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 15:31:53 +02001186 auto saved_transaction_id = params.transaction_id;
1187 params = video_rtp_sender_->GetParameters();
1188 EXPECT_NE(saved_transaction_id, params.transaction_id);
1189
1190 DestroyVideoRtpSender();
1191}
1192
1193TEST_F(RtpSenderReceiverTest, VideoSenderSetParametersOldValueFail) {
1194 CreateVideoRtpSender();
1195
1196 RtpParameters params = video_rtp_sender_->GetParameters();
1197 RtpParameters second_params = video_rtp_sender_->GetParameters();
1198
1199 RTCError result = video_rtp_sender_->SetParameters(params);
1200 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1201
1202 DestroyVideoRtpSender();
1203}
1204
Seth Hampson2d2c8882018-05-16 16:02:32 -07001205TEST_F(RtpSenderReceiverTest, VideoSenderCantSetUnimplementedRtpParameters) {
1206 CreateVideoRtpSender();
1207 RtpParameters params = video_rtp_sender_->GetParameters();
1208 EXPECT_EQ(1u, params.encodings.size());
1209
Florent Castelli87b3c512018-07-18 16:00:28 +02001210 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 16:02:32 -07001211 params.mid = "dummy_mid";
1212 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1213 video_rtp_sender_->SetParameters(params).type());
1214 params = video_rtp_sender_->GetParameters();
1215
Seth Hampson2d2c8882018-05-16 16:02:32 -07001216 DestroyVideoRtpSender();
1217}
1218
Florent Castellic1a0bcb2019-01-29 14:26:48 +01001219TEST_F(RtpSenderReceiverTest, VideoSenderCanSetScaleResolutionDownBy) {
1220 CreateVideoRtpSender();
1221
1222 RtpParameters params = video_rtp_sender_->GetParameters();
1223 params.encodings[0].scale_resolution_down_by = 2;
1224
1225 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1226 params = video_rtp_sender_->GetParameters();
1227 EXPECT_EQ(2, params.encodings[0].scale_resolution_down_by);
1228
1229 DestroyVideoRtpSender();
1230}
1231
1232TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidScaleResolutionDownBy) {
1233 CreateVideoRtpSender();
1234
1235 RtpParameters params = video_rtp_sender_->GetParameters();
1236 params.encodings[0].scale_resolution_down_by = 0.5;
1237 RTCError result = video_rtp_sender_->SetParameters(params);
1238 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1239
1240 DestroyVideoRtpSender();
1241}
1242
Florent Castelli907dc802019-12-06 15:03:19 +01001243TEST_F(RtpSenderReceiverTest, VideoSenderCanSetMaxFramerate) {
1244 CreateVideoRtpSender();
1245
1246 RtpParameters params = video_rtp_sender_->GetParameters();
1247 params.encodings[0].max_framerate = 20;
1248
1249 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1250 params = video_rtp_sender_->GetParameters();
1251 EXPECT_EQ(20., params.encodings[0].max_framerate);
1252
1253 DestroyVideoRtpSender();
1254}
1255
1256TEST_F(RtpSenderReceiverTest, VideoSenderCanSetMaxFramerateZero) {
1257 CreateVideoRtpSender();
1258
1259 RtpParameters params = video_rtp_sender_->GetParameters();
1260 params.encodings[0].max_framerate = 0.;
1261
1262 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1263 params = video_rtp_sender_->GetParameters();
1264 EXPECT_EQ(0., params.encodings[0].max_framerate);
1265
1266 DestroyVideoRtpSender();
1267}
1268
1269TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidMaxFramerate) {
1270 CreateVideoRtpSender();
1271
1272 RtpParameters params = video_rtp_sender_->GetParameters();
1273 params.encodings[0].max_framerate = -5.;
1274 RTCError result = video_rtp_sender_->SetParameters(params);
1275 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1276
1277 DestroyVideoRtpSender();
1278}
1279
Seth Hampson2d2c8882018-05-16 16:02:32 -07001280// A video sender can have multiple simulcast layers, in which case it will
1281// contain multiple RtpEncodingParameters. This tests that if this is the case
1282// (simulcast), then we can't set the bitrate_priority, or max_bitrate_bps
1283// for any encodings besides at index 0, because these are both implemented
1284// "per-sender."
1285TEST_F(RtpSenderReceiverTest, VideoSenderCantSetPerSenderEncodingParameters) {
1286 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001287 CreateVideoRtpSenderWithSimulcast();
Seth Hampson2d2c8882018-05-16 16:02:32 -07001288 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001289 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Seth Hampson2d2c8882018-05-16 16:02:32 -07001290
1291 params.encodings[1].bitrate_priority = 2.0;
1292 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1293 video_rtp_sender_->SetParameters(params).type());
1294 params = video_rtp_sender_->GetParameters();
1295
Seth Hampson2d2c8882018-05-16 16:02:32 -07001296 DestroyVideoRtpSender();
1297}
1298
Florent Castelli892acf02018-10-01 22:47:20 +02001299TEST_F(RtpSenderReceiverTest, VideoSenderCantSetReadOnlyEncodingParameters) {
1300 // Add a simulcast specific send stream that contains 2 encoding parameters.
1301 CreateVideoRtpSenderWithSimulcast();
1302 RtpParameters params = video_rtp_sender_->GetParameters();
1303 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
1304
1305 for (size_t i = 0; i < params.encodings.size(); i++) {
1306 params.encodings[i].ssrc = 1337;
1307 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION,
1308 video_rtp_sender_->SetParameters(params).type());
1309 params = video_rtp_sender_->GetParameters();
1310 }
1311
1312 DestroyVideoRtpSender();
1313}
1314
Ă…sa Persson55659812018-06-18 17:51:32 +02001315TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrate) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001316 CreateVideoRtpSender();
1317
1318 EXPECT_EQ(-1, video_media_channel_->max_bps());
1319 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001320 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001321 EXPECT_FALSE(params.encodings[0].min_bitrate_bps);
deadbeefe702b302017-02-04 12:09:01 -08001322 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Ă…sa Persson55659812018-06-18 17:51:32 +02001323 params.encodings[0].min_bitrate_bps = 100;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001324 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -08001325 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001326
1327 // Read back the parameters and verify they have been changed.
1328 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001329 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001330 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001331 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001332
1333 // Verify that the video channel received the new parameters.
1334 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001335 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001336 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001337 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001338
1339 // Verify that the global bitrate limit has not been changed.
1340 EXPECT_EQ(-1, video_media_channel_->max_bps());
1341
1342 DestroyVideoRtpSender();
1343}
1344
Ă…sa Persson55659812018-06-18 17:51:32 +02001345TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrateSimulcast) {
1346 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001347 CreateVideoRtpSenderWithSimulcast();
Ă…sa Persson55659812018-06-18 17:51:32 +02001348
1349 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001350 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001351 params.encodings[0].min_bitrate_bps = 100;
1352 params.encodings[0].max_bitrate_bps = 1000;
1353 params.encodings[1].min_bitrate_bps = 200;
1354 params.encodings[1].max_bitrate_bps = 2000;
1355 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1356
1357 // Verify that the video channel received the new parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001358 params = video_media_channel_->GetRtpSendParameters(kVideoSsrcSimulcast);
1359 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001360 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
1361 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
1362 EXPECT_EQ(200, params.encodings[1].min_bitrate_bps);
1363 EXPECT_EQ(2000, params.encodings[1].max_bitrate_bps);
1364
1365 DestroyVideoRtpSender();
1366}
1367
Seth Hampson24722b32017-12-22 09:36:42 -08001368TEST_F(RtpSenderReceiverTest, SetVideoBitratePriority) {
1369 CreateVideoRtpSender();
1370
1371 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001372 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001373 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1374 params.encodings[0].bitrate_priority);
1375 double new_bitrate_priority = 2.0;
1376 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -08001377 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -08001378
1379 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001380 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001381 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1382
1383 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001384 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001385 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1386
1387 DestroyVideoRtpSender();
1388}
1389
Florent Castelli38332cd2018-11-20 14:08:06 +01001390TEST_F(RtpSenderReceiverTest, VideoReceiverCanGetParametersWithSimulcast) {
1391 CreateVideoRtpReceiverWithSimulcast({}, 2);
1392
1393 RtpParameters params = video_rtp_receiver_->GetParameters();
1394 EXPECT_EQ(2u, params.encodings.size());
1395
1396 DestroyVideoRtpReceiver();
1397}
1398
pbos5214a0a2016-12-16 15:39:11 -08001399// Test that makes sure that a video track content hint translates to the proper
1400// value for sources that are not screencast.
1401TEST_F(RtpSenderReceiverTest, PropagatesVideoTrackContentHint) {
1402 CreateVideoRtpSender();
1403
1404 video_track_->set_enabled(true);
1405
1406 // |video_track_| is not screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001407 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001408 // No content hint should be set by default.
1409 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1410 video_track_->content_hint());
1411 // Setting detailed should turn a non-screencast source into screencast mode.
1412 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001413 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001414 // Removing the content hint should turn the track back into non-screencast
1415 // mode.
1416 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001417 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001418 // Setting fluid should remain in non-screencast mode (its default).
1419 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001420 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 08:53:10 +02001421 // Setting text should have the same effect as Detailed
1422 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
1423 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001424
1425 DestroyVideoRtpSender();
1426}
1427
1428// Test that makes sure that a video track content hint translates to the proper
1429// value for screencast sources.
1430TEST_F(RtpSenderReceiverTest,
1431 PropagatesVideoTrackContentHintForScreencastSource) {
1432 CreateVideoRtpSender(true);
1433
1434 video_track_->set_enabled(true);
1435
1436 // |video_track_| with a screencast source should be screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001437 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001438 // No content hint should be set by default.
1439 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1440 video_track_->content_hint());
1441 // Setting fluid should turn a screencast source into non-screencast mode.
1442 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001443 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001444 // Removing the content hint should turn the track back into screencast mode.
1445 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001446 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001447 // Setting detailed should still remain in screencast mode (its default).
1448 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001449 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 08:53:10 +02001450 // Setting text should have the same effect as Detailed
1451 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
1452 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001453
1454 DestroyVideoRtpSender();
1455}
1456
1457// Test that makes sure any content hints that are set on a track before
1458// VideoRtpSender is ready to send are still applied when it gets ready to send.
1459TEST_F(RtpSenderReceiverTest,
1460 PropagatesVideoTrackContentHintSetBeforeEnabling) {
1461 AddVideoTrack();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001462 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001463 std::make_unique<MockSetStreamsObserver>();
pbos5214a0a2016-12-16 15:39:11 -08001464 // Setting detailed overrides the default non-screencast mode. This should be
1465 // applied even if the track is set on construction.
1466 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001467 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1468 set_streams_observer.get());
Steve Anton111fdfd2018-06-25 13:03:36 -07001469 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001470 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1471 video_rtp_sender_->SetStreams({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -08001472 video_rtp_sender_->SetMediaChannel(video_media_channel_);
pbos5214a0a2016-12-16 15:39:11 -08001473 video_track_->set_enabled(true);
1474
1475 // Sender is not ready to send (no SSRC) so no option should have been set.
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001476 EXPECT_EQ(absl::nullopt, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001477
1478 // Verify that the content hint is accounted for when video_rtp_sender_ does
1479 // get enabled.
1480 video_rtp_sender_->SetSsrc(kVideoSsrc);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001481 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001482
1483 // And removing the hint should go back to false (to verify that false was
1484 // default correctly).
1485 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001486 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001487
1488 DestroyVideoRtpSender();
1489}
1490
deadbeef20cb0c12017-02-01 20:27:00 -08001491TEST_F(RtpSenderReceiverTest, AudioSenderHasDtmfSender) {
1492 CreateAudioRtpSender();
1493 EXPECT_NE(nullptr, audio_rtp_sender_->GetDtmfSender());
1494}
1495
1496TEST_F(RtpSenderReceiverTest, VideoSenderDoesNotHaveDtmfSender) {
1497 CreateVideoRtpSender();
1498 EXPECT_EQ(nullptr, video_rtp_sender_->GetDtmfSender());
1499}
1500
1501// Test that the DTMF sender is really using |voice_channel_|, and thus returns
1502// true/false from CanSendDtmf based on what |voice_channel_| returns.
1503TEST_F(RtpSenderReceiverTest, CanInsertDtmf) {
1504 AddDtmfCodec();
1505 CreateAudioRtpSender();
1506 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1507 ASSERT_NE(nullptr, dtmf_sender);
1508 EXPECT_TRUE(dtmf_sender->CanInsertDtmf());
1509}
1510
1511TEST_F(RtpSenderReceiverTest, CanNotInsertDtmf) {
1512 CreateAudioRtpSender();
1513 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1514 ASSERT_NE(nullptr, dtmf_sender);
1515 // DTMF codec has not been added, as it was in the above test.
1516 EXPECT_FALSE(dtmf_sender->CanInsertDtmf());
1517}
1518
1519TEST_F(RtpSenderReceiverTest, InsertDtmf) {
1520 AddDtmfCodec();
1521 CreateAudioRtpSender();
1522 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1523 ASSERT_NE(nullptr, dtmf_sender);
1524
1525 EXPECT_EQ(0U, voice_media_channel_->dtmf_info_queue().size());
1526
1527 // Insert DTMF
1528 const int expected_duration = 90;
1529 dtmf_sender->InsertDtmf("012", expected_duration, 100);
1530
1531 // Verify
1532 ASSERT_EQ_WAIT(3U, voice_media_channel_->dtmf_info_queue().size(),
1533 kDefaultTimeout);
1534 const uint32_t send_ssrc =
1535 voice_media_channel_->send_streams()[0].first_ssrc();
1536 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[0],
1537 send_ssrc, 0, expected_duration));
1538 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[1],
1539 send_ssrc, 1, expected_duration));
1540 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[2],
1541 send_ssrc, 2, expected_duration));
1542}
1543
1544// Make sure the signal from "GetOnDestroyedSignal()" fires when the sender is
1545// destroyed, which is needed for the DTMF sender.
1546TEST_F(RtpSenderReceiverTest, TestOnDestroyedSignal) {
1547 CreateAudioRtpSender();
1548 EXPECT_FALSE(audio_sender_destroyed_signal_fired_);
1549 audio_rtp_sender_ = nullptr;
1550 EXPECT_TRUE(audio_sender_destroyed_signal_fired_);
1551}
1552
Benjamin Wright84583f62018-10-04 14:22:34 -07001553// Validate that the default FrameEncryptor setting is nullptr.
1554TEST_F(RtpSenderReceiverTest, AudioSenderCanSetFrameEncryptor) {
1555 CreateAudioRtpSender();
1556 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1557 new FakeFrameEncryptor());
1558 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1559 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1560 EXPECT_EQ(fake_frame_encryptor.get(),
1561 audio_rtp_sender_->GetFrameEncryptor().get());
1562}
1563
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001564// Validate that setting a FrameEncryptor after the send stream is stopped does
1565// nothing.
1566TEST_F(RtpSenderReceiverTest, AudioSenderCannotSetFrameEncryptorAfterStop) {
1567 CreateAudioRtpSender();
1568 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1569 new FakeFrameEncryptor());
1570 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1571 audio_rtp_sender_->Stop();
1572 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1573 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1574}
1575
Benjamin Wright84583f62018-10-04 14:22:34 -07001576// Validate that the default FrameEncryptor setting is nullptr.
1577TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetFrameDecryptor) {
1578 CreateAudioRtpReceiver();
1579 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1580 new FakeFrameDecryptor());
1581 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
1582 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1583 EXPECT_EQ(fake_frame_decryptor.get(),
1584 audio_rtp_receiver_->GetFrameDecryptor().get());
1585}
1586
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001587// Validate that the default FrameEncryptor setting is nullptr.
1588TEST_F(RtpSenderReceiverTest, AudioReceiverCannotSetFrameDecryptorAfterStop) {
1589 CreateAudioRtpReceiver();
1590 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1591 new FakeFrameDecryptor());
1592 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
1593 audio_rtp_receiver_->Stop();
1594 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1595 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1596}
1597
1598// Validate that the default FrameEncryptor setting is nullptr.
1599TEST_F(RtpSenderReceiverTest, VideoSenderCanSetFrameEncryptor) {
1600 CreateVideoRtpSender();
1601 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1602 new FakeFrameEncryptor());
1603 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1604 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1605 EXPECT_EQ(fake_frame_encryptor.get(),
1606 video_rtp_sender_->GetFrameEncryptor().get());
1607}
1608
1609// Validate that setting a FrameEncryptor after the send stream is stopped does
1610// nothing.
1611TEST_F(RtpSenderReceiverTest, VideoSenderCannotSetFrameEncryptorAfterStop) {
1612 CreateVideoRtpSender();
1613 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1614 new FakeFrameEncryptor());
1615 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1616 video_rtp_sender_->Stop();
1617 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1618 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1619}
1620
1621// Validate that the default FrameEncryptor setting is nullptr.
1622TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetFrameDecryptor) {
1623 CreateVideoRtpReceiver();
1624 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1625 new FakeFrameDecryptor());
1626 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
1627 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1628 EXPECT_EQ(fake_frame_decryptor.get(),
1629 video_rtp_receiver_->GetFrameDecryptor().get());
1630}
1631
1632// Validate that the default FrameEncryptor setting is nullptr.
1633TEST_F(RtpSenderReceiverTest, VideoReceiverCannotSetFrameDecryptorAfterStop) {
1634 CreateVideoRtpReceiver();
1635 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1636 new FakeFrameDecryptor());
1637 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
1638 video_rtp_receiver_->Stop();
1639 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1640 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1641}
1642
Amit Hilbuch619b2942019-02-26 15:55:19 -08001643// Checks that calling the internal methods for get/set parameters do not
1644// invalidate any parameters retreived by clients.
1645TEST_F(RtpSenderReceiverTest,
1646 InternalParameterMethodsDoNotInvalidateTransaction) {
1647 CreateVideoRtpSender();
1648 RtpParameters parameters = video_rtp_sender_->GetParameters();
1649 RtpParameters new_parameters = video_rtp_sender_->GetParametersInternal();
1650 new_parameters.encodings[0].active = false;
1651 video_rtp_sender_->SetParametersInternal(new_parameters);
1652 new_parameters.encodings[0].active = true;
1653 video_rtp_sender_->SetParametersInternal(new_parameters);
1654 parameters.encodings[0].active = false;
1655 EXPECT_TRUE(video_rtp_sender_->SetParameters(parameters).ok());
1656}
1657
Amit Hilbuch2297d332019-02-19 12:49:22 -08001658// Helper method for syntactic sugar for accepting a vector with '{}' notation.
1659std::pair<RidList, RidList> CreatePairOfRidVectors(
1660 const std::vector<std::string>& first,
1661 const std::vector<std::string>& second) {
1662 return std::make_pair(first, second);
1663}
1664
1665// These parameters are used to test disabling simulcast layers.
1666const std::pair<RidList, RidList> kDisableSimulcastLayersParameters[] = {
1667 // Tests removing the first layer. This is a special case because
1668 // the first layer's SSRC is also the 'primary' SSRC used to associate the
1669 // parameters to the media channel.
1670 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"1"}),
1671 // Tests removing some layers.
1672 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"2", "4"}),
1673 // Tests simulcast rejected scenario all layers except first are rejected.
1674 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"2", "3", "4"}),
1675 // Tests removing all layers.
1676 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"1", "2", "3", "4"}),
1677};
1678
1679// Runs test for disabling layers on a sender without a media engine set.
1680TEST_P(RtpSenderReceiverTest, DisableSimulcastLayersWithoutMediaEngine) {
1681 auto parameter = GetParam();
1682 RunDisableSimulcastLayersWithoutMediaEngineTest(parameter.first,
1683 parameter.second);
1684}
1685
1686// Runs test for disabling layers on a sender with a media engine set.
1687TEST_P(RtpSenderReceiverTest, DisableSimulcastLayersWithMediaEngine) {
1688 auto parameter = GetParam();
1689 RunDisableSimulcastLayersWithMediaEngineTest(parameter.first,
1690 parameter.second);
1691}
1692
1693INSTANTIATE_TEST_SUITE_P(
1694 DisableSimulcastLayersInSender,
1695 RtpSenderReceiverTest,
1696 ::testing::ValuesIn(kDisableSimulcastLayersParameters));
1697
deadbeef70ab1a12015-09-28 16:53:55 -07001698} // namespace webrtc