blob: a303d6f6b2a4945eda08ec1f401bebf9b854c836 [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>
12#include <cstdint>
kwibergd1fe2812016-04-27 06:47:29 -070013#include <memory>
deadbeef70ab1a12015-09-28 16:53:55 -070014#include <string>
Tommif888bb52015-12-12 01:37:01 +010015#include <utility>
Yves Gerey3e707812018-11-28 16:47:49 +010016#include <vector>
deadbeef70ab1a12015-09-28 16:53:55 -070017
Amit Hilbuch2297d332019-02-19 12:49:22 -080018#include "absl/algorithm/container.h"
Yves Gerey3e707812018-11-28 16:47:49 +010019#include "absl/memory/memory.h"
20#include "absl/types/optional.h"
21#include "api/audio_options.h"
Steve Anton10542f22019-01-11 09:11:00 -080022#include "api/crypto/crypto_options.h"
23#include "api/crypto/frame_decryptor_interface.h"
24#include "api/crypto/frame_encryptor_interface.h"
25#include "api/dtmf_sender_interface.h"
26#include "api/media_stream_interface.h"
27#include "api/rtc_error.h"
28#include "api/rtp_parameters.h"
Mirko Bonadeid9708072019-01-25 20:26:48 +010029#include "api/scoped_refptr.h"
Benjamin Wright84583f62018-10-04 14:22:34 -070030#include "api/test/fake_frame_decryptor.h"
31#include "api/test/fake_frame_encryptor.h"
Jonas Orelanda3aa9bd2019-04-17 07:38:40 +020032#include "api/video/builtin_video_bitrate_allocator_factory.h"
Yves Gerey3e707812018-11-28 16:47:49 +010033#include "logging/rtc_event_log/rtc_event_log.h"
34#include "media/base/codec.h"
Steve Anton10542f22019-01-11 09:11:00 -080035#include "media/base/fake_media_engine.h"
36#include "media/base/media_channel.h"
37#include "media/base/media_config.h"
38#include "media/base/media_engine.h"
39#include "media/base/rtp_data_engine.h"
40#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:
90 MOCK_METHOD0(OnSetStreams, void());
91};
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()),
Karl Wiberg918f50c2018-07-05 11:40:33 +0200110 channel_manager_(absl::WrapUnique(media_engine_),
111 absl::make_unique<cricket::RtpDataEngine>(),
Steve Anton47136dd2018-01-12 10:49:35 -0800112 worker_thread_,
113 network_thread_),
Sebastian Jansson8f83b422018-02-21 13:07:13 +0100114 fake_call_(),
Seth Hampson845e8782018-03-02 11:34:10 -0800115 local_stream_(MediaStream::Create(kStreamId1)) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700116 // Create channels to be used by the RtpSenders and RtpReceivers.
117 channel_manager_.Init();
deadbeef7af91dd2016-12-13 11:29:11 -0800118 bool srtp_required = true;
Karl Wiberg918f50c2018-07-05 11:40:33 +0200119 rtp_dtls_transport_ = absl::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
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700123 voice_channel_ = channel_manager_.CreateVoiceChannel(
Zhi Huange830e682018-03-30 10:48:35 -0700124 &fake_call_, cricket::MediaConfig(), rtp_transport_.get(),
Anton Sukhanov4f08faa2019-05-21 11:12:57 -0700125 MediaTransportConfig(), rtc::Thread::Current(), cricket::CN_AUDIO,
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800126 srtp_required, webrtc::CryptoOptions(), &ssrc_generator_,
127 cricket::AudioOptions());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700128 video_channel_ = channel_manager_.CreateVideoChannel(
Zhi Huange830e682018-03-30 10:48:35 -0700129 &fake_call_, cricket::MediaConfig(), rtp_transport_.get(),
Anton Sukhanov4f08faa2019-05-21 11:12:57 -0700130 MediaTransportConfig(), rtc::Thread::Current(), cricket::CN_VIDEO,
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800131 srtp_required, webrtc::CryptoOptions(), &ssrc_generator_,
Jonas Orelanda3aa9bd2019-04-17 07:38:40 +0200132 cricket::VideoOptions(), video_bitrate_allocator_factory_.get());
deadbeef20cb0c12017-02-01 20:27:00 -0800133 voice_channel_->Enable(true);
134 video_channel_->Enable(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700135 voice_media_channel_ = media_engine_->GetVoiceChannel(0);
136 video_media_channel_ = media_engine_->GetVideoChannel(0);
137 RTC_CHECK(voice_channel_);
138 RTC_CHECK(video_channel_);
139 RTC_CHECK(voice_media_channel_);
140 RTC_CHECK(video_media_channel_);
141
142 // Create streams for predefined SSRCs. Streams need to exist in order
143 // for the senders and receievers to apply parameters to them.
144 // Normally these would be created by SetLocalDescription and
145 // SetRemoteDescription.
146 voice_media_channel_->AddSendStream(
147 cricket::StreamParams::CreateLegacy(kAudioSsrc));
148 voice_media_channel_->AddRecvStream(
149 cricket::StreamParams::CreateLegacy(kAudioSsrc));
150 voice_media_channel_->AddSendStream(
151 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
152 voice_media_channel_->AddRecvStream(
153 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
154 video_media_channel_->AddSendStream(
155 cricket::StreamParams::CreateLegacy(kVideoSsrc));
156 video_media_channel_->AddRecvStream(
157 cricket::StreamParams::CreateLegacy(kVideoSsrc));
158 video_media_channel_->AddSendStream(
159 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
160 video_media_channel_->AddRecvStream(
161 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
tkchin3784b4a2016-06-24 19:31:47 -0700162 }
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700163
Zhi Huange830e682018-03-30 10:48:35 -0700164 std::unique_ptr<webrtc::RtpTransportInternal> CreateDtlsSrtpTransport() {
Karl Wiberg918f50c2018-07-05 11:40:33 +0200165 auto dtls_srtp_transport = absl::make_unique<webrtc::DtlsSrtpTransport>(
166 /*rtcp_mux_required=*/true);
Zhi Huange830e682018-03-30 10:48:35 -0700167 dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport_.get(),
168 /*rtcp_dtls_transport=*/nullptr);
169 return dtls_srtp_transport;
170 }
171
deadbeef20cb0c12017-02-01 20:27:00 -0800172 // Needed to use DTMF sender.
173 void AddDtmfCodec() {
174 cricket::AudioSendParameters params;
175 const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000,
176 0, 1);
177 params.codecs.push_back(kTelephoneEventCodec);
178 voice_media_channel_->SetSendParameters(params);
179 }
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700180
pbos5214a0a2016-12-16 15:39:11 -0800181 void AddVideoTrack() { AddVideoTrack(false); }
182
183 void AddVideoTrack(bool is_screencast) {
perkja3ede6c2016-03-08 01:27:48 +0100184 rtc::scoped_refptr<VideoTrackSourceInterface> source(
pbos5214a0a2016-12-16 15:39:11 -0800185 FakeVideoTrackSource::Create(is_screencast));
perkj773be362017-07-31 23:22:01 -0700186 video_track_ =
187 VideoTrack::Create(kVideoTrackId, source, rtc::Thread::Current());
deadbeefe814a0d2017-02-25 18:15:09 -0800188 EXPECT_TRUE(local_stream_->AddTrack(video_track_));
deadbeef70ab1a12015-09-28 16:53:55 -0700189 }
190
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700191 void CreateAudioRtpSender() { CreateAudioRtpSender(nullptr); }
192
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +0100193 void CreateAudioRtpSender(
194 const rtc::scoped_refptr<LocalAudioSource>& source) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700195 audio_track_ = AudioTrack::Create(kAudioTrackId, source);
deadbeefe814a0d2017-02-25 18:15:09 -0800196 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200197 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
198 absl::make_unique<MockSetStreamsObserver>();
Steve Anton47136dd2018-01-12 10:49:35 -0800199 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200200 AudioRtpSender::Create(worker_thread_, audio_track_->id(), nullptr,
201 set_streams_observer.get());
Steve Anton111fdfd2018-06-25 13:03:36 -0700202 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200203 EXPECT_CALL(*set_streams_observer, OnSetStreams());
204 audio_rtp_sender_->SetStreams({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800205 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
deadbeeffac06552015-11-25 11:26:01 -0800206 audio_rtp_sender_->SetSsrc(kAudioSsrc);
deadbeef20cb0c12017-02-01 20:27:00 -0800207 audio_rtp_sender_->GetOnDestroyedSignal()->connect(
208 this, &RtpSenderReceiverTest::OnAudioSenderDestroyed);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700209 VerifyVoiceChannelInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700210 }
211
Steve Anton02ee47c2018-01-10 16:26:06 -0800212 void CreateAudioRtpSenderWithNoTrack() {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800213 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200214 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800215 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
Steve Anton02ee47c2018-01-10 16:26:06 -0800216 }
217
deadbeef20cb0c12017-02-01 20:27:00 -0800218 void OnAudioSenderDestroyed() { audio_sender_destroyed_signal_fired_ = true; }
219
Seth Hampson2d2c8882018-05-16 16:02:32 -0700220 void CreateVideoRtpSender(uint32_t ssrc) {
221 CreateVideoRtpSender(false, ssrc);
222 }
223
pbos5214a0a2016-12-16 15:39:11 -0800224 void CreateVideoRtpSender() { CreateVideoRtpSender(false); }
225
Amit Hilbuch2297d332019-02-19 12:49:22 -0800226 cricket::StreamParams CreateSimulcastStreamParams(int num_layers) {
Florent Castelli892acf02018-10-01 22:47:20 +0200227 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +0100228 ssrcs.reserve(num_layers);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800229 for (int i = 0; i < num_layers; ++i) {
Florent Castelli892acf02018-10-01 22:47:20 +0200230 ssrcs.push_back(kVideoSsrcSimulcast + i);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800231 }
232 return cricket::CreateSimStreamParams("cname", ssrcs);
233 }
234
235 uint32_t CreateVideoRtpSender(const cricket::StreamParams& stream_params) {
Florent Castelli892acf02018-10-01 22:47:20 +0200236 video_media_channel_->AddSendStream(stream_params);
237 uint32_t primary_ssrc = stream_params.first_ssrc();
238 CreateVideoRtpSender(primary_ssrc);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800239 return primary_ssrc;
240 }
241
242 uint32_t CreateVideoRtpSenderWithSimulcast(
243 int num_layers = kVideoSimulcastLayerCount) {
244 return CreateVideoRtpSender(CreateSimulcastStreamParams(num_layers));
245 }
246
247 uint32_t CreateVideoRtpSenderWithSimulcast(
248 const std::vector<std::string>& rids) {
249 cricket::StreamParams stream_params =
250 CreateSimulcastStreamParams(rids.size());
251 std::vector<cricket::RidDescription> rid_descriptions;
252 absl::c_transform(
253 rids, std::back_inserter(rid_descriptions), [](const std::string& rid) {
254 return cricket::RidDescription(rid, cricket::RidDirection::kSend);
255 });
256 stream_params.set_rids(rid_descriptions);
257 return CreateVideoRtpSender(stream_params);
Florent Castelli892acf02018-10-01 22:47:20 +0200258 }
259
Seth Hampson2d2c8882018-05-16 16:02:32 -0700260 void CreateVideoRtpSender(bool is_screencast, uint32_t ssrc = kVideoSsrc) {
pbos5214a0a2016-12-16 15:39:11 -0800261 AddVideoTrack(is_screencast);
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200262 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
263 absl::make_unique<MockSetStreamsObserver>();
264 video_rtp_sender_ = VideoRtpSender::Create(
265 worker_thread_, video_track_->id(), set_streams_observer.get());
Steve Anton111fdfd2018-06-25 13:03:36 -0700266 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200267 EXPECT_CALL(*set_streams_observer, OnSetStreams());
268 video_rtp_sender_->SetStreams({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800269 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Seth Hampson2d2c8882018-05-16 16:02:32 -0700270 video_rtp_sender_->SetSsrc(ssrc);
271 VerifyVideoChannelInput(ssrc);
deadbeef70ab1a12015-09-28 16:53:55 -0700272 }
Steve Anton02ee47c2018-01-10 16:26:06 -0800273 void CreateVideoRtpSenderWithNoTrack() {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200274 video_rtp_sender_ =
275 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800276 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Steve Anton02ee47c2018-01-10 16:26:06 -0800277 }
278
deadbeef70ab1a12015-09-28 16:53:55 -0700279 void DestroyAudioRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700280 audio_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700281 VerifyVoiceChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700282 }
283
284 void DestroyVideoRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700285 video_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700286 VerifyVideoChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700287 }
288
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100289 void CreateAudioRtpReceiver(
290 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
Mirko Bonadei05cf6be2019-01-31 21:38:12 +0100291 audio_rtp_receiver_ =
292 new AudioRtpReceiver(rtc::Thread::Current(), kAudioTrackId, streams);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800293 audio_rtp_receiver_->SetMediaChannel(voice_media_channel_);
Steve Antond3679212018-01-17 17:41:02 -0800294 audio_rtp_receiver_->SetupMediaChannel(kAudioSsrc);
perkjd61bf802016-03-24 03:16:19 -0700295 audio_track_ = audio_rtp_receiver_->audio_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700296 VerifyVoiceChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700297 }
298
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100299 void CreateVideoRtpReceiver(
300 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
Mirko Bonadei05cf6be2019-01-31 21:38:12 +0100301 video_rtp_receiver_ =
302 new VideoRtpReceiver(rtc::Thread::Current(), kVideoTrackId, streams);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800303 video_rtp_receiver_->SetMediaChannel(video_media_channel_);
Steve Antond3679212018-01-17 17:41:02 -0800304 video_rtp_receiver_->SetupMediaChannel(kVideoSsrc);
perkjf0dcfe22016-03-10 18:32:00 +0100305 video_track_ = video_rtp_receiver_->video_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700306 VerifyVideoChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700307 }
308
Florent Castelli38332cd2018-11-20 14:08:06 +0100309 void CreateVideoRtpReceiverWithSimulcast(
310 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {},
311 int num_layers = kVideoSimulcastLayerCount) {
312 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +0100313 ssrcs.reserve(num_layers);
Florent Castelli38332cd2018-11-20 14:08:06 +0100314 for (int i = 0; i < num_layers; ++i)
315 ssrcs.push_back(kVideoSsrcSimulcast + i);
316 cricket::StreamParams stream_params =
317 cricket::CreateSimStreamParams("cname", ssrcs);
318 video_media_channel_->AddRecvStream(stream_params);
319 uint32_t primary_ssrc = stream_params.first_ssrc();
320
Mirko Bonadei05cf6be2019-01-31 21:38:12 +0100321 video_rtp_receiver_ =
322 new VideoRtpReceiver(rtc::Thread::Current(), kVideoTrackId, streams);
Florent Castelli38332cd2018-11-20 14:08:06 +0100323 video_rtp_receiver_->SetMediaChannel(video_media_channel_);
324 video_rtp_receiver_->SetupMediaChannel(primary_ssrc);
325 video_track_ = video_rtp_receiver_->video_track();
326 }
327
deadbeef70ab1a12015-09-28 16:53:55 -0700328 void DestroyAudioRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700329 audio_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700330 VerifyVoiceChannelNoOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700331 }
332
333 void DestroyVideoRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700334 video_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700335 VerifyVideoChannelNoOutput();
336 }
337
338 void VerifyVoiceChannelInput() { VerifyVoiceChannelInput(kAudioSsrc); }
339
340 void VerifyVoiceChannelInput(uint32_t ssrc) {
341 // Verify that the media channel has an audio source, and the stream isn't
342 // muted.
343 EXPECT_TRUE(voice_media_channel_->HasSource(ssrc));
344 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(ssrc));
345 }
346
347 void VerifyVideoChannelInput() { VerifyVideoChannelInput(kVideoSsrc); }
348
349 void VerifyVideoChannelInput(uint32_t ssrc) {
350 // Verify that the media channel has a video source,
351 EXPECT_TRUE(video_media_channel_->HasSource(ssrc));
352 }
353
354 void VerifyVoiceChannelNoInput() { VerifyVoiceChannelNoInput(kAudioSsrc); }
355
356 void VerifyVoiceChannelNoInput(uint32_t ssrc) {
357 // Verify that the media channel's source is reset.
358 EXPECT_FALSE(voice_media_channel_->HasSource(ssrc));
359 }
360
361 void VerifyVideoChannelNoInput() { VerifyVideoChannelNoInput(kVideoSsrc); }
362
363 void VerifyVideoChannelNoInput(uint32_t ssrc) {
364 // Verify that the media channel's source is reset.
365 EXPECT_FALSE(video_media_channel_->HasSource(ssrc));
366 }
367
368 void VerifyVoiceChannelOutput() {
369 // Verify that the volume is initialized to 1.
370 double volume;
371 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
372 EXPECT_EQ(1, volume);
373 }
374
375 void VerifyVideoChannelOutput() {
376 // Verify that the media channel has a sink.
377 EXPECT_TRUE(video_media_channel_->HasSink(kVideoSsrc));
378 }
379
380 void VerifyVoiceChannelNoOutput() {
381 // Verify that the volume is reset to 0.
382 double volume;
383 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
384 EXPECT_EQ(0, volume);
385 }
386
387 void VerifyVideoChannelNoOutput() {
388 // Verify that the media channel's sink is reset.
389 EXPECT_FALSE(video_media_channel_->HasSink(kVideoSsrc));
deadbeef70ab1a12015-09-28 16:53:55 -0700390 }
391
Amit Hilbuch2297d332019-02-19 12:49:22 -0800392 // Verifies that the encoding layers contain the specified RIDs.
393 bool VerifyEncodingLayers(const VideoRtpSender& sender,
394 const std::vector<std::string>& rids) {
395 bool has_failure = HasFailure();
396 RtpParameters parameters = sender.GetParameters();
397 std::vector<std::string> encoding_rids;
398 absl::c_transform(
399 parameters.encodings, std::back_inserter(encoding_rids),
400 [](const RtpEncodingParameters& encoding) { return encoding.rid; });
401 EXPECT_THAT(rids, ContainerEq(encoding_rids));
402 return has_failure || !HasFailure();
403 }
404
405 // Runs a test for disabling the encoding layers on the specified sender.
406 void RunDisableEncodingLayersTest(
407 const std::vector<std::string>& all_layers,
408 const std::vector<std::string>& disabled_layers,
409 VideoRtpSender* sender) {
410 std::vector<std::string> expected;
411 absl::c_copy_if(all_layers, std::back_inserter(expected),
412 [&disabled_layers](const std::string& rid) {
413 return !absl::c_linear_search(disabled_layers, rid);
414 });
415
416 EXPECT_TRUE(VerifyEncodingLayers(*sender, all_layers));
417 sender->DisableEncodingLayers(disabled_layers);
418 EXPECT_TRUE(VerifyEncodingLayers(*sender, expected));
419 }
420
421 // Runs a test for setting an encoding layer as inactive.
422 // This test assumes that some layers have already been disabled.
423 void RunSetLastLayerAsInactiveTest(VideoRtpSender* sender) {
424 auto parameters = sender->GetParameters();
425 if (parameters.encodings.size() == 0) {
426 return;
427 }
428
429 RtpEncodingParameters& encoding = parameters.encodings.back();
430 auto rid = encoding.rid;
431 EXPECT_TRUE(encoding.active);
432 encoding.active = false;
433 auto error = sender->SetParameters(parameters);
434 ASSERT_TRUE(error.ok());
435 parameters = sender->GetParameters();
436 RtpEncodingParameters& result_encoding = parameters.encodings.back();
437 EXPECT_EQ(rid, result_encoding.rid);
438 EXPECT_FALSE(result_encoding.active);
439 }
440
441 // Runs a test for disabling the encoding layers on a sender without a media
442 // channel.
443 void RunDisableSimulcastLayersWithoutMediaEngineTest(
444 const std::vector<std::string>& all_layers,
445 const std::vector<std::string>& disabled_layers) {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200446 auto sender = VideoRtpSender::Create(rtc::Thread::Current(), "1", nullptr);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800447 RtpParameters parameters;
448 parameters.encodings.resize(all_layers.size());
449 for (size_t i = 0; i < all_layers.size(); ++i) {
450 parameters.encodings[i].rid = all_layers[i];
451 }
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800452 sender->set_init_send_encodings(parameters.encodings);
453 RunDisableEncodingLayersTest(all_layers, disabled_layers, sender.get());
454 RunSetLastLayerAsInactiveTest(sender.get());
Amit Hilbuch2297d332019-02-19 12:49:22 -0800455 }
456
457 // Runs a test for disabling the encoding layers on a sender with a media
458 // channel.
459 void RunDisableSimulcastLayersWithMediaEngineTest(
460 const std::vector<std::string>& all_layers,
461 const std::vector<std::string>& disabled_layers) {
462 uint32_t ssrc = CreateVideoRtpSenderWithSimulcast(all_layers);
463 RunDisableEncodingLayersTest(all_layers, disabled_layers,
464 video_rtp_sender_.get());
465
466 auto channel_parameters = video_media_channel_->GetRtpSendParameters(ssrc);
467 ASSERT_EQ(channel_parameters.encodings.size(), all_layers.size());
468 for (size_t i = 0; i < all_layers.size(); ++i) {
469 EXPECT_EQ(all_layers[i], channel_parameters.encodings[i].rid);
470 bool is_active = !absl::c_linear_search(disabled_layers, all_layers[i]);
471 EXPECT_EQ(is_active, channel_parameters.encodings[i].active);
472 }
473
474 RunSetLastLayerAsInactiveTest(video_rtp_sender_.get());
475 }
476
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200477 // Check that minimum Jitter Buffer delay is propagated to the underlying
478 // |media_channel|.
479 void VerifyRtpReceiverDelayBehaviour(cricket::Delayable* media_channel,
480 RtpReceiverInterface* receiver,
481 uint32_t ssrc) {
482 receiver->SetJitterBufferMinimumDelay(/*delay_seconds=*/0.5);
483 absl::optional<int> delay_ms =
484 media_channel->GetBaseMinimumPlayoutDelayMs(ssrc); // In milliseconds.
485 EXPECT_DOUBLE_EQ(0.5, delay_ms.value_or(0) / 1000.0);
486 }
487
deadbeef70ab1a12015-09-28 16:53:55 -0700488 protected:
Steve Anton47136dd2018-01-12 10:49:35 -0800489 rtc::Thread* const network_thread_;
490 rtc::Thread* const worker_thread_;
skvlad11a9cbf2016-10-07 11:53:05 -0700491 webrtc::RtcEventLogNullImpl event_log_;
Zhi Huange830e682018-03-30 10:48:35 -0700492 // The |rtp_dtls_transport_| and |rtp_transport_| should be destroyed after
493 // the |channel_manager|.
494 std::unique_ptr<cricket::DtlsTransportInternal> rtp_dtls_transport_;
495 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport_;
Jonas Orelanda3aa9bd2019-04-17 07:38:40 +0200496 std::unique_ptr<webrtc::VideoBitrateAllocatorFactory>
497 video_bitrate_allocator_factory_;
deadbeef112b2e92017-02-10 20:13:37 -0800498 // |media_engine_| is actually owned by |channel_manager_|.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700499 cricket::FakeMediaEngine* media_engine_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700500 cricket::ChannelManager channel_manager_;
501 cricket::FakeCall fake_call_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700502 cricket::VoiceChannel* voice_channel_;
503 cricket::VideoChannel* video_channel_;
504 cricket::FakeVoiceMediaChannel* voice_media_channel_;
505 cricket::FakeVideoMediaChannel* video_media_channel_;
deadbeef70ab1a12015-09-28 16:53:55 -0700506 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
507 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
508 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
509 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
deadbeefe814a0d2017-02-25 18:15:09 -0800510 rtc::scoped_refptr<MediaStreamInterface> local_stream_;
deadbeef70ab1a12015-09-28 16:53:55 -0700511 rtc::scoped_refptr<VideoTrackInterface> video_track_;
512 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
deadbeef20cb0c12017-02-01 20:27:00 -0800513 bool audio_sender_destroyed_signal_fired_ = false;
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800514 rtc::UniqueRandomIdGenerator ssrc_generator_;
deadbeef70ab1a12015-09-28 16:53:55 -0700515};
516
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700517// Test that |voice_channel_| is updated when an audio track is associated
deadbeef70ab1a12015-09-28 16:53:55 -0700518// and disassociated with an AudioRtpSender.
519TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
520 CreateAudioRtpSender();
521 DestroyAudioRtpSender();
522}
523
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700524// Test that |video_channel_| is updated when a video track is associated and
deadbeef70ab1a12015-09-28 16:53:55 -0700525// disassociated with a VideoRtpSender.
526TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
527 CreateVideoRtpSender();
528 DestroyVideoRtpSender();
529}
530
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700531// Test that |voice_channel_| is updated when a remote audio track is
deadbeef70ab1a12015-09-28 16:53:55 -0700532// associated and disassociated with an AudioRtpReceiver.
533TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
534 CreateAudioRtpReceiver();
535 DestroyAudioRtpReceiver();
536}
537
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700538// Test that |video_channel_| is updated when a remote video track is
539// associated and disassociated with a VideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700540TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
541 CreateVideoRtpReceiver();
542 DestroyVideoRtpReceiver();
543}
544
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100545TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiverWithStreams) {
546 CreateAudioRtpReceiver({local_stream_});
547 DestroyAudioRtpReceiver();
548}
549
550TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiverWithStreams) {
551 CreateVideoRtpReceiver({local_stream_});
552 DestroyVideoRtpReceiver();
553}
554
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700555// Test that the AudioRtpSender applies options from the local audio source.
556TEST_F(RtpSenderReceiverTest, LocalAudioSourceOptionsApplied) {
557 cricket::AudioOptions options;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100558 options.echo_cancellation = true;
deadbeef757146b2017-02-10 21:26:48 -0800559 auto source = LocalAudioSource::Create(&options);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700560 CreateAudioRtpSender(source.get());
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700561
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100562 EXPECT_EQ(true, voice_media_channel_->options().echo_cancellation);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700563
564 DestroyAudioRtpSender();
565}
566
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700567// Test that the stream is muted when the track is disabled, and unmuted when
568// the track is enabled.
569TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) {
570 CreateAudioRtpSender();
571
572 audio_track_->set_enabled(false);
573 EXPECT_TRUE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
574
575 audio_track_->set_enabled(true);
576 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
577
578 DestroyAudioRtpSender();
579}
580
581// Test that the volume is set to 0 when the track is disabled, and back to
582// 1 when the track is enabled.
deadbeef70ab1a12015-09-28 16:53:55 -0700583TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
584 CreateAudioRtpReceiver();
585
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700586 double volume;
587 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
588 EXPECT_EQ(1, volume);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700589
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700590 audio_track_->set_enabled(false);
591 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
592 EXPECT_EQ(0, volume);
593
deadbeef70ab1a12015-09-28 16:53:55 -0700594 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700595 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
596 EXPECT_EQ(1, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700597
598 DestroyAudioRtpReceiver();
599}
600
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700601// Currently no action is taken when a remote video track is disabled or
602// enabled, so there's nothing to test here, other than what is normally
603// verified in DestroyVideoRtpSender.
deadbeef70ab1a12015-09-28 16:53:55 -0700604TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
605 CreateVideoRtpSender();
606
deadbeef70ab1a12015-09-28 16:53:55 -0700607 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700608 video_track_->set_enabled(true);
609
610 DestroyVideoRtpSender();
611}
612
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700613// Test that the state of the video track created by the VideoRtpReceiver is
614// updated when the receiver is destroyed.
perkjf0dcfe22016-03-10 18:32:00 +0100615TEST_F(RtpSenderReceiverTest, RemoteVideoTrackState) {
616 CreateVideoRtpReceiver();
617
618 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track_->state());
619 EXPECT_EQ(webrtc::MediaSourceInterface::kLive,
620 video_track_->GetSource()->state());
621
622 DestroyVideoRtpReceiver();
623
624 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track_->state());
625 EXPECT_EQ(webrtc::MediaSourceInterface::kEnded,
626 video_track_->GetSource()->state());
627}
628
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700629// Currently no action is taken when a remote video track is disabled or
630// enabled, so there's nothing to test here, other than what is normally
631// verified in DestroyVideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700632TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
633 CreateVideoRtpReceiver();
634
635 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700636 video_track_->set_enabled(true);
637
638 DestroyVideoRtpReceiver();
639}
640
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700641// Test that the AudioRtpReceiver applies volume changes from the track source
642// to the media channel.
deadbeef70ab1a12015-09-28 16:53:55 -0700643TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
644 CreateAudioRtpReceiver();
645
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700646 double volume;
647 audio_track_->GetSource()->SetVolume(0.5);
648 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
649 EXPECT_EQ(0.5, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700650
651 // Disable the audio track, this should prevent setting the volume.
deadbeef70ab1a12015-09-28 16:53:55 -0700652 audio_track_->set_enabled(false);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700653 audio_track_->GetSource()->SetVolume(0.8);
654 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
655 EXPECT_EQ(0, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700656
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700657 // When the track is enabled, the previously set volume should take effect.
deadbeef70ab1a12015-09-28 16:53:55 -0700658 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700659 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
660 EXPECT_EQ(0.8, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700661
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700662 // Try changing volume one more time.
663 audio_track_->GetSource()->SetVolume(0.9);
664 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
665 EXPECT_EQ(0.9, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700666
667 DestroyAudioRtpReceiver();
668}
669
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200670TEST_F(RtpSenderReceiverTest, AudioRtpReceiverDelay) {
671 CreateAudioRtpReceiver();
672 VerifyRtpReceiverDelayBehaviour(voice_media_channel_,
673 audio_rtp_receiver_.get(), kAudioSsrc);
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200674}
675
676TEST_F(RtpSenderReceiverTest, VideoRtpReceiverDelay) {
677 CreateVideoRtpReceiver();
678 VerifyRtpReceiverDelayBehaviour(video_media_channel_,
679 video_rtp_receiver_.get(), kVideoSsrc);
680}
681
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700682// Test that the media channel isn't enabled for sending if the audio sender
683// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800684TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800685 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800686 rtc::scoped_refptr<AudioTrackInterface> track =
687 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700688
689 // Track but no SSRC.
690 EXPECT_TRUE(audio_rtp_sender_->SetTrack(track));
691 VerifyVoiceChannelNoInput();
692
693 // SSRC but no track.
694 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
695 audio_rtp_sender_->SetSsrc(kAudioSsrc);
696 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800697}
698
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700699// Test that the media channel isn't enabled for sending if the video sender
700// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800701TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800702 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700703
704 // Track but no SSRC.
705 EXPECT_TRUE(video_rtp_sender_->SetTrack(video_track_));
706 VerifyVideoChannelNoInput();
707
708 // SSRC but no track.
709 EXPECT_TRUE(video_rtp_sender_->SetTrack(nullptr));
710 video_rtp_sender_->SetSsrc(kVideoSsrc);
711 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800712}
713
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700714// Test that the media channel is enabled for sending when the audio sender
715// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800716TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800717 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800718 rtc::scoped_refptr<AudioTrackInterface> track =
719 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700720 audio_rtp_sender_->SetSsrc(kAudioSsrc);
721 audio_rtp_sender_->SetTrack(track);
722 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800723
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700724 DestroyAudioRtpSender();
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 last.
deadbeeffac06552015-11-25 11:26:01 -0800729TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
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_->SetTrack(track);
734 audio_rtp_sender_->SetSsrc(kAudioSsrc);
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 video sender
741// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800742TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
nisseaf510af2016-03-21 08:20:42 -0700743 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800744 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700745 video_rtp_sender_->SetSsrc(kVideoSsrc);
746 video_rtp_sender_->SetTrack(video_track_);
747 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800748
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700749 DestroyVideoRtpSender();
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 last.
deadbeeffac06552015-11-25 11:26:01 -0800754TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
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_->SetTrack(video_track_);
758 video_rtp_sender_->SetSsrc(kVideoSsrc);
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 stops sending when the audio sender's SSRC is set
765// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800766TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700767 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800768
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700769 audio_rtp_sender_->SetSsrc(0);
770 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800771}
772
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700773// Test that the media channel stops sending when the video sender's SSRC is set
774// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800775TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700776 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800777
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700778 audio_rtp_sender_->SetSsrc(0);
779 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800780}
781
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700782// Test that the media channel stops sending when the audio sender's track is
783// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800784TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700785 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800786
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700787 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
788 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800789}
790
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700791// Test that the media channel stops sending when the video sender's track is
792// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800793TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700794 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800795
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700796 video_rtp_sender_->SetSsrc(0);
797 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800798}
799
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700800// Test that when the audio sender's SSRC is changed, the media channel stops
801// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800802TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700803 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800804
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700805 audio_rtp_sender_->SetSsrc(kAudioSsrc2);
806 VerifyVoiceChannelNoInput(kAudioSsrc);
807 VerifyVoiceChannelInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800808
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700809 audio_rtp_sender_ = nullptr;
810 VerifyVoiceChannelNoInput(kAudioSsrc2);
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, VideoSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700816 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800817
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700818 video_rtp_sender_->SetSsrc(kVideoSsrc2);
819 VerifyVideoChannelNoInput(kVideoSsrc);
820 VerifyVideoChannelInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800821
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700822 video_rtp_sender_ = nullptr;
823 VerifyVideoChannelNoInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800824}
825
skvladdc1c62c2016-03-16 19:07:43 -0700826TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) {
827 CreateAudioRtpSender();
828
skvladdc1c62c2016-03-16 19:07:43 -0700829 RtpParameters params = audio_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700830 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -0800831 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -0700832
833 DestroyAudioRtpSender();
834}
835
Florent Castelli892acf02018-10-01 22:47:20 +0200836TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParametersBeforeNegotiation) {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800837 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200838 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +0200839
840 RtpParameters params = audio_rtp_sender_->GetParameters();
841 ASSERT_EQ(1u, params.encodings.size());
842 params.encodings[0].max_bitrate_bps = 90000;
843 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
844
845 params = audio_rtp_sender_->GetParameters();
846 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
847 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
848
849 DestroyAudioRtpSender();
850}
851
852TEST_F(RtpSenderReceiverTest, AudioSenderInitParametersMovedAfterNegotiation) {
853 audio_track_ = AudioTrack::Create(kAudioTrackId, nullptr);
854 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
855
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200856 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
857 absl::make_unique<MockSetStreamsObserver>();
858 audio_rtp_sender_ = AudioRtpSender::Create(
859 worker_thread_, audio_track_->id(), nullptr, set_streams_observer.get());
Florent Castelli892acf02018-10-01 22:47:20 +0200860 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200861 EXPECT_CALL(*set_streams_observer, OnSetStreams());
862 audio_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli892acf02018-10-01 22:47:20 +0200863
864 std::vector<RtpEncodingParameters> init_encodings(1);
865 init_encodings[0].max_bitrate_bps = 60000;
866 audio_rtp_sender_->set_init_send_encodings(init_encodings);
867
868 RtpParameters params = audio_rtp_sender_->GetParameters();
869 ASSERT_EQ(1u, params.encodings.size());
870 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
871
872 // Simulate the setLocalDescription call
873 std::vector<uint32_t> ssrcs(1, 1);
874 cricket::StreamParams stream_params =
875 cricket::CreateSimStreamParams("cname", ssrcs);
876 voice_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800877 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +0200878 audio_rtp_sender_->SetSsrc(1);
879
880 params = audio_rtp_sender_->GetParameters();
881 ASSERT_EQ(1u, params.encodings.size());
882 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
883
884 DestroyAudioRtpSender();
885}
886
887TEST_F(RtpSenderReceiverTest,
888 AudioSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800889 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200890 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +0200891
892 RtpParameters params;
893 RTCError result = audio_rtp_sender_->SetParameters(params);
894 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
895 DestroyAudioRtpSender();
896}
897
Florent Castellicebf50f2018-05-03 15:31:53 +0200898TEST_F(RtpSenderReceiverTest,
899 AudioSenderMustCallGetParametersBeforeSetParameters) {
900 CreateAudioRtpSender();
901
902 RtpParameters params;
903 RTCError result = audio_rtp_sender_->SetParameters(params);
904 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
905
906 DestroyAudioRtpSender();
907}
908
909TEST_F(RtpSenderReceiverTest,
910 AudioSenderSetParametersInvalidatesTransactionId) {
911 CreateAudioRtpSender();
912
913 RtpParameters params = audio_rtp_sender_->GetParameters();
914 EXPECT_EQ(1u, params.encodings.size());
915 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
916 RTCError result = audio_rtp_sender_->SetParameters(params);
917 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
918
919 DestroyAudioRtpSender();
920}
921
922TEST_F(RtpSenderReceiverTest, AudioSenderDetectTransactionIdModification) {
923 CreateAudioRtpSender();
924
925 RtpParameters params = audio_rtp_sender_->GetParameters();
926 params.transaction_id = "";
927 RTCError result = audio_rtp_sender_->SetParameters(params);
928 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
929
930 DestroyAudioRtpSender();
931}
932
933TEST_F(RtpSenderReceiverTest, AudioSenderCheckTransactionIdRefresh) {
934 CreateAudioRtpSender();
935
936 RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200937 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 15:31:53 +0200938 auto saved_transaction_id = params.transaction_id;
939 params = audio_rtp_sender_->GetParameters();
940 EXPECT_NE(saved_transaction_id, params.transaction_id);
941
942 DestroyAudioRtpSender();
943}
944
945TEST_F(RtpSenderReceiverTest, AudioSenderSetParametersOldValueFail) {
946 CreateAudioRtpSender();
947
948 RtpParameters params = audio_rtp_sender_->GetParameters();
949 RtpParameters second_params = audio_rtp_sender_->GetParameters();
950
951 RTCError result = audio_rtp_sender_->SetParameters(params);
952 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
Seth Hampson2d2c8882018-05-16 16:02:32 -0700953 DestroyAudioRtpSender();
954}
955
956TEST_F(RtpSenderReceiverTest, AudioSenderCantSetUnimplementedRtpParameters) {
957 CreateAudioRtpSender();
958 RtpParameters params = audio_rtp_sender_->GetParameters();
959 EXPECT_EQ(1u, params.encodings.size());
960
Florent Castelli87b3c512018-07-18 16:00:28 +0200961 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 16:02:32 -0700962 params.mid = "dummy_mid";
963 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
964 audio_rtp_sender_->SetParameters(params).type());
965 params = audio_rtp_sender_->GetParameters();
966
Seth Hampson2d2c8882018-05-16 16:02:32 -0700967 DestroyAudioRtpSender();
968}
969
970TEST_F(RtpSenderReceiverTest,
971 AudioSenderCantSetUnimplementedRtpEncodingParameters) {
972 CreateAudioRtpSender();
973 RtpParameters params = audio_rtp_sender_->GetParameters();
974 EXPECT_EQ(1u, params.encodings.size());
975
Henrik Grunelle1301a82018-12-13 12:13:22 +0000976 // Unimplemented RtpParameters: codec_payload_type, fec, rtx, dtx, ptime,
Amit Hilbuchaa584152019-02-06 17:09:52 -0800977 // scale_framerate_down_by, dependency_rids.
Henrik Grunelle1301a82018-12-13 12:13:22 +0000978 params.encodings[0].codec_payload_type = 1;
979 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
980 audio_rtp_sender_->SetParameters(params).type());
981 params = audio_rtp_sender_->GetParameters();
982
Seth Hampson2d2c8882018-05-16 16:02:32 -0700983 params.encodings[0].fec = RtpFecParameters();
984 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
985 audio_rtp_sender_->SetParameters(params).type());
986 params = audio_rtp_sender_->GetParameters();
987
988 params.encodings[0].rtx = RtpRtxParameters();
989 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
990 audio_rtp_sender_->SetParameters(params).type());
991 params = audio_rtp_sender_->GetParameters();
992
993 params.encodings[0].dtx = DtxStatus::ENABLED;
994 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
995 audio_rtp_sender_->SetParameters(params).type());
996 params = audio_rtp_sender_->GetParameters();
997
998 params.encodings[0].ptime = 1;
999 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1000 audio_rtp_sender_->SetParameters(params).type());
1001 params = audio_rtp_sender_->GetParameters();
1002
Seth Hampson2d2c8882018-05-16 16:02:32 -07001003 params.encodings[0].dependency_rids.push_back("dummy_rid");
1004 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1005 audio_rtp_sender_->SetParameters(params).type());
Florent Castellicebf50f2018-05-03 15:31:53 +02001006
1007 DestroyAudioRtpSender();
1008}
1009
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001010TEST_F(RtpSenderReceiverTest, SetAudioMaxSendBitrate) {
1011 CreateAudioRtpSender();
1012
1013 EXPECT_EQ(-1, voice_media_channel_->max_bps());
1014 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001015 EXPECT_EQ(1U, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -08001016 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001017 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -08001018 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001019
1020 // Read back the parameters and verify they have been changed.
1021 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001022 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001023 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001024
1025 // Verify that the audio channel received the new parameters.
1026 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001027 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001028 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001029
1030 // Verify that the global bitrate limit has not been changed.
1031 EXPECT_EQ(-1, voice_media_channel_->max_bps());
1032
1033 DestroyAudioRtpSender();
1034}
1035
Seth Hampson24722b32017-12-22 09:36:42 -08001036TEST_F(RtpSenderReceiverTest, SetAudioBitratePriority) {
1037 CreateAudioRtpSender();
1038
1039 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001040 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001041 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1042 params.encodings[0].bitrate_priority);
1043 double new_bitrate_priority = 2.0;
1044 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -08001045 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -08001046
1047 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001048 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001049 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1050
1051 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001052 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001053 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1054
1055 DestroyAudioRtpSender();
1056}
1057
skvladdc1c62c2016-03-16 19:07:43 -07001058TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) {
1059 CreateVideoRtpSender();
1060
skvladdc1c62c2016-03-16 19:07:43 -07001061 RtpParameters params = video_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001062 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -08001063 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -07001064
1065 DestroyVideoRtpSender();
1066}
1067
Florent Castelli892acf02018-10-01 22:47:20 +02001068TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParametersBeforeNegotiation) {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001069 video_rtp_sender_ =
1070 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +02001071
1072 RtpParameters params = video_rtp_sender_->GetParameters();
1073 ASSERT_EQ(1u, params.encodings.size());
1074 params.encodings[0].max_bitrate_bps = 90000;
1075 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1076
1077 params = video_rtp_sender_->GetParameters();
1078 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1079 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
1080
1081 DestroyVideoRtpSender();
1082}
1083
1084TEST_F(RtpSenderReceiverTest, VideoSenderInitParametersMovedAfterNegotiation) {
1085 AddVideoTrack(false);
1086
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001087 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
1088 absl::make_unique<MockSetStreamsObserver>();
1089 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1090 set_streams_observer.get());
Florent Castelli892acf02018-10-01 22:47:20 +02001091 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001092 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1093 video_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli892acf02018-10-01 22:47:20 +02001094
1095 std::vector<RtpEncodingParameters> init_encodings(2);
1096 init_encodings[0].max_bitrate_bps = 60000;
1097 init_encodings[1].max_bitrate_bps = 900000;
1098 video_rtp_sender_->set_init_send_encodings(init_encodings);
1099
1100 RtpParameters params = video_rtp_sender_->GetParameters();
1101 ASSERT_EQ(2u, params.encodings.size());
1102 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1103 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
1104
1105 // Simulate the setLocalDescription call
1106 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +01001107 ssrcs.reserve(2);
Florent Castelli892acf02018-10-01 22:47:20 +02001108 for (int i = 0; i < 2; ++i)
1109 ssrcs.push_back(kVideoSsrcSimulcast + i);
1110 cricket::StreamParams stream_params =
1111 cricket::CreateSimStreamParams("cname", ssrcs);
1112 video_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -08001113 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +02001114 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
1115
1116 params = video_rtp_sender_->GetParameters();
1117 ASSERT_EQ(2u, params.encodings.size());
1118 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1119 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
1120
1121 DestroyVideoRtpSender();
1122}
1123
1124TEST_F(RtpSenderReceiverTest,
1125 VideoSenderInitParametersMovedAfterManualSimulcastAndNegotiation) {
1126 AddVideoTrack(false);
1127
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001128 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
1129 absl::make_unique<MockSetStreamsObserver>();
1130 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1131 set_streams_observer.get());
Florent Castelli892acf02018-10-01 22:47:20 +02001132 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001133 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1134 video_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli892acf02018-10-01 22:47:20 +02001135
1136 std::vector<RtpEncodingParameters> init_encodings(1);
1137 init_encodings[0].max_bitrate_bps = 60000;
1138 video_rtp_sender_->set_init_send_encodings(init_encodings);
1139
1140 RtpParameters params = video_rtp_sender_->GetParameters();
1141 ASSERT_EQ(1u, params.encodings.size());
1142 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1143
1144 // Simulate the setLocalDescription call as if the user used SDP munging
1145 // to enable simulcast
1146 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +01001147 ssrcs.reserve(2);
Florent Castelli892acf02018-10-01 22:47:20 +02001148 for (int i = 0; i < 2; ++i)
1149 ssrcs.push_back(kVideoSsrcSimulcast + i);
1150 cricket::StreamParams stream_params =
1151 cricket::CreateSimStreamParams("cname", ssrcs);
1152 video_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -08001153 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +02001154 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
1155
1156 params = video_rtp_sender_->GetParameters();
1157 ASSERT_EQ(2u, params.encodings.size());
1158 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1159
1160 DestroyVideoRtpSender();
1161}
1162
1163TEST_F(RtpSenderReceiverTest,
1164 VideoSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001165 video_rtp_sender_ =
1166 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +02001167
1168 RtpParameters params;
1169 RTCError result = video_rtp_sender_->SetParameters(params);
1170 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1171 DestroyVideoRtpSender();
1172}
1173
Florent Castellicebf50f2018-05-03 15:31:53 +02001174TEST_F(RtpSenderReceiverTest,
1175 VideoSenderMustCallGetParametersBeforeSetParameters) {
1176 CreateVideoRtpSender();
1177
1178 RtpParameters params;
1179 RTCError result = video_rtp_sender_->SetParameters(params);
1180 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1181
1182 DestroyVideoRtpSender();
1183}
1184
1185TEST_F(RtpSenderReceiverTest,
1186 VideoSenderSetParametersInvalidatesTransactionId) {
1187 CreateVideoRtpSender();
1188
1189 RtpParameters params = video_rtp_sender_->GetParameters();
1190 EXPECT_EQ(1u, params.encodings.size());
1191 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1192 RTCError result = video_rtp_sender_->SetParameters(params);
1193 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1194
1195 DestroyVideoRtpSender();
1196}
1197
1198TEST_F(RtpSenderReceiverTest, VideoSenderDetectTransactionIdModification) {
1199 CreateVideoRtpSender();
1200
1201 RtpParameters params = video_rtp_sender_->GetParameters();
1202 params.transaction_id = "";
1203 RTCError result = video_rtp_sender_->SetParameters(params);
1204 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1205
1206 DestroyVideoRtpSender();
1207}
1208
1209TEST_F(RtpSenderReceiverTest, VideoSenderCheckTransactionIdRefresh) {
1210 CreateVideoRtpSender();
1211
1212 RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001213 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 15:31:53 +02001214 auto saved_transaction_id = params.transaction_id;
1215 params = video_rtp_sender_->GetParameters();
1216 EXPECT_NE(saved_transaction_id, params.transaction_id);
1217
1218 DestroyVideoRtpSender();
1219}
1220
1221TEST_F(RtpSenderReceiverTest, VideoSenderSetParametersOldValueFail) {
1222 CreateVideoRtpSender();
1223
1224 RtpParameters params = video_rtp_sender_->GetParameters();
1225 RtpParameters second_params = video_rtp_sender_->GetParameters();
1226
1227 RTCError result = video_rtp_sender_->SetParameters(params);
1228 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1229
1230 DestroyVideoRtpSender();
1231}
1232
Seth Hampson2d2c8882018-05-16 16:02:32 -07001233TEST_F(RtpSenderReceiverTest, VideoSenderCantSetUnimplementedRtpParameters) {
1234 CreateVideoRtpSender();
1235 RtpParameters params = video_rtp_sender_->GetParameters();
1236 EXPECT_EQ(1u, params.encodings.size());
1237
Florent Castelli87b3c512018-07-18 16:00:28 +02001238 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 16:02:32 -07001239 params.mid = "dummy_mid";
1240 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1241 video_rtp_sender_->SetParameters(params).type());
1242 params = video_rtp_sender_->GetParameters();
1243
Seth Hampson2d2c8882018-05-16 16:02:32 -07001244 DestroyVideoRtpSender();
1245}
1246
1247TEST_F(RtpSenderReceiverTest,
1248 VideoSenderCantSetUnimplementedEncodingParameters) {
1249 CreateVideoRtpSender();
1250 RtpParameters params = video_rtp_sender_->GetParameters();
1251 EXPECT_EQ(1u, params.encodings.size());
1252
Henrik Grunelle1301a82018-12-13 12:13:22 +00001253 // Unimplemented RtpParameters: codec_payload_type, fec, rtx, dtx, ptime,
Amit Hilbuchaa584152019-02-06 17:09:52 -08001254 // scale_framerate_down_by, dependency_rids.
Henrik Grunelle1301a82018-12-13 12:13:22 +00001255 params.encodings[0].codec_payload_type = 1;
1256 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1257 video_rtp_sender_->SetParameters(params).type());
1258 params = video_rtp_sender_->GetParameters();
1259
Seth Hampson2d2c8882018-05-16 16:02:32 -07001260 params.encodings[0].fec = RtpFecParameters();
1261 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1262 video_rtp_sender_->SetParameters(params).type());
1263 params = video_rtp_sender_->GetParameters();
1264
1265 params.encodings[0].rtx = RtpRtxParameters();
1266 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1267 video_rtp_sender_->SetParameters(params).type());
1268 params = video_rtp_sender_->GetParameters();
1269
1270 params.encodings[0].dtx = DtxStatus::ENABLED;
1271 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1272 video_rtp_sender_->SetParameters(params).type());
1273 params = video_rtp_sender_->GetParameters();
1274
1275 params.encodings[0].ptime = 1;
1276 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1277 video_rtp_sender_->SetParameters(params).type());
1278 params = video_rtp_sender_->GetParameters();
1279
Seth Hampson2d2c8882018-05-16 16:02:32 -07001280 params.encodings[0].dependency_rids.push_back("dummy_rid");
1281 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1282 video_rtp_sender_->SetParameters(params).type());
1283
1284 DestroyVideoRtpSender();
1285}
1286
Florent Castellic1a0bcb2019-01-29 14:26:48 +01001287TEST_F(RtpSenderReceiverTest, VideoSenderCanSetScaleResolutionDownBy) {
1288 CreateVideoRtpSender();
1289
1290 RtpParameters params = video_rtp_sender_->GetParameters();
1291 params.encodings[0].scale_resolution_down_by = 2;
1292
1293 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1294 params = video_rtp_sender_->GetParameters();
1295 EXPECT_EQ(2, params.encodings[0].scale_resolution_down_by);
1296
1297 DestroyVideoRtpSender();
1298}
1299
1300TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidScaleResolutionDownBy) {
1301 CreateVideoRtpSender();
1302
1303 RtpParameters params = video_rtp_sender_->GetParameters();
1304 params.encodings[0].scale_resolution_down_by = 0.5;
1305 RTCError result = video_rtp_sender_->SetParameters(params);
1306 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1307
1308 DestroyVideoRtpSender();
1309}
1310
Florent Castelli892acf02018-10-01 22:47:20 +02001311TEST_F(RtpSenderReceiverTest,
1312 VideoSenderCantSetUnimplementedEncodingParametersWithSimulcast) {
1313 CreateVideoRtpSenderWithSimulcast();
1314 RtpParameters params = video_rtp_sender_->GetParameters();
1315 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
1316
Henrik Grunelle1301a82018-12-13 12:13:22 +00001317 // Unimplemented RtpParameters: codec_payload_type, fec, rtx, dtx, ptime,
Amit Hilbuchaa584152019-02-06 17:09:52 -08001318 // scale_framerate_down_by, dependency_rids.
Florent Castelli892acf02018-10-01 22:47:20 +02001319 for (size_t i = 0; i < params.encodings.size(); i++) {
Henrik Grunelle1301a82018-12-13 12:13:22 +00001320 params.encodings[i].codec_payload_type = 1;
1321 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1322 video_rtp_sender_->SetParameters(params).type());
1323 params = video_rtp_sender_->GetParameters();
1324
Florent Castelli892acf02018-10-01 22:47:20 +02001325 params.encodings[i].fec = RtpFecParameters();
1326 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1327 video_rtp_sender_->SetParameters(params).type());
1328 params = video_rtp_sender_->GetParameters();
1329
1330 params.encodings[i].rtx = RtpRtxParameters();
1331 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1332 video_rtp_sender_->SetParameters(params).type());
1333 params = video_rtp_sender_->GetParameters();
1334
1335 params.encodings[i].dtx = DtxStatus::ENABLED;
1336 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1337 video_rtp_sender_->SetParameters(params).type());
1338 params = video_rtp_sender_->GetParameters();
1339
1340 params.encodings[i].ptime = 1;
1341 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1342 video_rtp_sender_->SetParameters(params).type());
1343 params = video_rtp_sender_->GetParameters();
1344
Florent Castelli892acf02018-10-01 22:47:20 +02001345 params.encodings[i].dependency_rids.push_back("dummy_rid");
1346 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1347 video_rtp_sender_->SetParameters(params).type());
Amit Hilbuch619b2942019-02-26 15:55:19 -08001348 params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001349 }
1350
1351 DestroyVideoRtpSender();
1352}
1353
Seth Hampson2d2c8882018-05-16 16:02:32 -07001354// A video sender can have multiple simulcast layers, in which case it will
1355// contain multiple RtpEncodingParameters. This tests that if this is the case
1356// (simulcast), then we can't set the bitrate_priority, or max_bitrate_bps
1357// for any encodings besides at index 0, because these are both implemented
1358// "per-sender."
1359TEST_F(RtpSenderReceiverTest, VideoSenderCantSetPerSenderEncodingParameters) {
1360 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001361 CreateVideoRtpSenderWithSimulcast();
Seth Hampson2d2c8882018-05-16 16:02:32 -07001362 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001363 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Seth Hampson2d2c8882018-05-16 16:02:32 -07001364
1365 params.encodings[1].bitrate_priority = 2.0;
1366 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1367 video_rtp_sender_->SetParameters(params).type());
1368 params = video_rtp_sender_->GetParameters();
1369
Seth Hampson2d2c8882018-05-16 16:02:32 -07001370 DestroyVideoRtpSender();
1371}
1372
Florent Castelli892acf02018-10-01 22:47:20 +02001373TEST_F(RtpSenderReceiverTest, VideoSenderCantSetReadOnlyEncodingParameters) {
1374 // Add a simulcast specific send stream that contains 2 encoding parameters.
1375 CreateVideoRtpSenderWithSimulcast();
1376 RtpParameters params = video_rtp_sender_->GetParameters();
1377 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
1378
1379 for (size_t i = 0; i < params.encodings.size(); i++) {
1380 params.encodings[i].ssrc = 1337;
1381 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION,
1382 video_rtp_sender_->SetParameters(params).type());
1383 params = video_rtp_sender_->GetParameters();
1384 }
1385
1386 DestroyVideoRtpSender();
1387}
1388
Ă…sa Persson55659812018-06-18 17:51:32 +02001389TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrate) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001390 CreateVideoRtpSender();
1391
1392 EXPECT_EQ(-1, video_media_channel_->max_bps());
1393 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001394 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001395 EXPECT_FALSE(params.encodings[0].min_bitrate_bps);
deadbeefe702b302017-02-04 12:09:01 -08001396 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Ă…sa Persson55659812018-06-18 17:51:32 +02001397 params.encodings[0].min_bitrate_bps = 100;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001398 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -08001399 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001400
1401 // Read back the parameters and verify they have been changed.
1402 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001403 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001404 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001405 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001406
1407 // Verify that the video channel received the new parameters.
1408 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001409 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001410 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001411 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001412
1413 // Verify that the global bitrate limit has not been changed.
1414 EXPECT_EQ(-1, video_media_channel_->max_bps());
1415
1416 DestroyVideoRtpSender();
1417}
1418
Ă…sa Persson55659812018-06-18 17:51:32 +02001419TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrateSimulcast) {
1420 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001421 CreateVideoRtpSenderWithSimulcast();
Ă…sa Persson55659812018-06-18 17:51:32 +02001422
1423 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001424 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001425 params.encodings[0].min_bitrate_bps = 100;
1426 params.encodings[0].max_bitrate_bps = 1000;
1427 params.encodings[1].min_bitrate_bps = 200;
1428 params.encodings[1].max_bitrate_bps = 2000;
1429 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1430
1431 // Verify that the video channel received the new parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001432 params = video_media_channel_->GetRtpSendParameters(kVideoSsrcSimulcast);
1433 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001434 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
1435 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
1436 EXPECT_EQ(200, params.encodings[1].min_bitrate_bps);
1437 EXPECT_EQ(2000, params.encodings[1].max_bitrate_bps);
1438
1439 DestroyVideoRtpSender();
1440}
1441
Seth Hampson24722b32017-12-22 09:36:42 -08001442TEST_F(RtpSenderReceiverTest, SetVideoBitratePriority) {
1443 CreateVideoRtpSender();
1444
1445 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001446 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001447 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1448 params.encodings[0].bitrate_priority);
1449 double new_bitrate_priority = 2.0;
1450 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -08001451 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -08001452
1453 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001454 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001455 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1456
1457 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001458 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001459 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1460
1461 DestroyVideoRtpSender();
1462}
1463
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001464TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetParameters) {
1465 CreateAudioRtpReceiver();
1466
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001467 RtpParameters params = audio_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001468 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001469 EXPECT_TRUE(audio_rtp_receiver_->SetParameters(params));
1470
1471 DestroyAudioRtpReceiver();
1472}
1473
1474TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetParameters) {
1475 CreateVideoRtpReceiver();
1476
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001477 RtpParameters params = video_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001478 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001479 EXPECT_TRUE(video_rtp_receiver_->SetParameters(params));
1480
1481 DestroyVideoRtpReceiver();
1482}
1483
Florent Castelli38332cd2018-11-20 14:08:06 +01001484TEST_F(RtpSenderReceiverTest, VideoReceiverCanGetParametersWithSimulcast) {
1485 CreateVideoRtpReceiverWithSimulcast({}, 2);
1486
1487 RtpParameters params = video_rtp_receiver_->GetParameters();
1488 EXPECT_EQ(2u, params.encodings.size());
1489
1490 DestroyVideoRtpReceiver();
1491}
1492
pbos5214a0a2016-12-16 15:39:11 -08001493// Test that makes sure that a video track content hint translates to the proper
1494// value for sources that are not screencast.
1495TEST_F(RtpSenderReceiverTest, PropagatesVideoTrackContentHint) {
1496 CreateVideoRtpSender();
1497
1498 video_track_->set_enabled(true);
1499
1500 // |video_track_| is not screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001501 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001502 // No content hint should be set by default.
1503 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1504 video_track_->content_hint());
1505 // Setting detailed should turn a non-screencast source into screencast mode.
1506 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001507 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001508 // Removing the content hint should turn the track back into non-screencast
1509 // mode.
1510 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001511 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001512 // Setting fluid should remain in non-screencast mode (its default).
1513 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001514 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 08:53:10 +02001515 // Setting text should have the same effect as Detailed
1516 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
1517 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001518
1519 DestroyVideoRtpSender();
1520}
1521
1522// Test that makes sure that a video track content hint translates to the proper
1523// value for screencast sources.
1524TEST_F(RtpSenderReceiverTest,
1525 PropagatesVideoTrackContentHintForScreencastSource) {
1526 CreateVideoRtpSender(true);
1527
1528 video_track_->set_enabled(true);
1529
1530 // |video_track_| with a screencast source should be screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001531 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001532 // No content hint should be set by default.
1533 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1534 video_track_->content_hint());
1535 // Setting fluid should turn a screencast source into non-screencast mode.
1536 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001537 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001538 // Removing the content hint should turn the track back into screencast mode.
1539 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001540 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001541 // Setting detailed should still remain in screencast mode (its default).
1542 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001543 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 08:53:10 +02001544 // Setting text should have the same effect as Detailed
1545 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
1546 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001547
1548 DestroyVideoRtpSender();
1549}
1550
1551// Test that makes sure any content hints that are set on a track before
1552// VideoRtpSender is ready to send are still applied when it gets ready to send.
1553TEST_F(RtpSenderReceiverTest,
1554 PropagatesVideoTrackContentHintSetBeforeEnabling) {
1555 AddVideoTrack();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001556 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
1557 absl::make_unique<MockSetStreamsObserver>();
pbos5214a0a2016-12-16 15:39:11 -08001558 // Setting detailed overrides the default non-screencast mode. This should be
1559 // applied even if the track is set on construction.
1560 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001561 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1562 set_streams_observer.get());
Steve Anton111fdfd2018-06-25 13:03:36 -07001563 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001564 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1565 video_rtp_sender_->SetStreams({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -08001566 video_rtp_sender_->SetMediaChannel(video_media_channel_);
pbos5214a0a2016-12-16 15:39:11 -08001567 video_track_->set_enabled(true);
1568
1569 // Sender is not ready to send (no SSRC) so no option should have been set.
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001570 EXPECT_EQ(absl::nullopt, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001571
1572 // Verify that the content hint is accounted for when video_rtp_sender_ does
1573 // get enabled.
1574 video_rtp_sender_->SetSsrc(kVideoSsrc);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001575 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001576
1577 // And removing the hint should go back to false (to verify that false was
1578 // default correctly).
1579 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001580 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001581
1582 DestroyVideoRtpSender();
1583}
1584
deadbeef20cb0c12017-02-01 20:27:00 -08001585TEST_F(RtpSenderReceiverTest, AudioSenderHasDtmfSender) {
1586 CreateAudioRtpSender();
1587 EXPECT_NE(nullptr, audio_rtp_sender_->GetDtmfSender());
1588}
1589
1590TEST_F(RtpSenderReceiverTest, VideoSenderDoesNotHaveDtmfSender) {
1591 CreateVideoRtpSender();
1592 EXPECT_EQ(nullptr, video_rtp_sender_->GetDtmfSender());
1593}
1594
1595// Test that the DTMF sender is really using |voice_channel_|, and thus returns
1596// true/false from CanSendDtmf based on what |voice_channel_| returns.
1597TEST_F(RtpSenderReceiverTest, CanInsertDtmf) {
1598 AddDtmfCodec();
1599 CreateAudioRtpSender();
1600 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1601 ASSERT_NE(nullptr, dtmf_sender);
1602 EXPECT_TRUE(dtmf_sender->CanInsertDtmf());
1603}
1604
1605TEST_F(RtpSenderReceiverTest, CanNotInsertDtmf) {
1606 CreateAudioRtpSender();
1607 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1608 ASSERT_NE(nullptr, dtmf_sender);
1609 // DTMF codec has not been added, as it was in the above test.
1610 EXPECT_FALSE(dtmf_sender->CanInsertDtmf());
1611}
1612
1613TEST_F(RtpSenderReceiverTest, InsertDtmf) {
1614 AddDtmfCodec();
1615 CreateAudioRtpSender();
1616 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1617 ASSERT_NE(nullptr, dtmf_sender);
1618
1619 EXPECT_EQ(0U, voice_media_channel_->dtmf_info_queue().size());
1620
1621 // Insert DTMF
1622 const int expected_duration = 90;
1623 dtmf_sender->InsertDtmf("012", expected_duration, 100);
1624
1625 // Verify
1626 ASSERT_EQ_WAIT(3U, voice_media_channel_->dtmf_info_queue().size(),
1627 kDefaultTimeout);
1628 const uint32_t send_ssrc =
1629 voice_media_channel_->send_streams()[0].first_ssrc();
1630 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[0],
1631 send_ssrc, 0, expected_duration));
1632 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[1],
1633 send_ssrc, 1, expected_duration));
1634 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[2],
1635 send_ssrc, 2, expected_duration));
1636}
1637
1638// Make sure the signal from "GetOnDestroyedSignal()" fires when the sender is
1639// destroyed, which is needed for the DTMF sender.
1640TEST_F(RtpSenderReceiverTest, TestOnDestroyedSignal) {
1641 CreateAudioRtpSender();
1642 EXPECT_FALSE(audio_sender_destroyed_signal_fired_);
1643 audio_rtp_sender_ = nullptr;
1644 EXPECT_TRUE(audio_sender_destroyed_signal_fired_);
1645}
1646
Benjamin Wright84583f62018-10-04 14:22:34 -07001647// Validate that the default FrameEncryptor setting is nullptr.
1648TEST_F(RtpSenderReceiverTest, AudioSenderCanSetFrameEncryptor) {
1649 CreateAudioRtpSender();
1650 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1651 new FakeFrameEncryptor());
1652 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1653 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1654 EXPECT_EQ(fake_frame_encryptor.get(),
1655 audio_rtp_sender_->GetFrameEncryptor().get());
1656}
1657
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001658// Validate that setting a FrameEncryptor after the send stream is stopped does
1659// nothing.
1660TEST_F(RtpSenderReceiverTest, AudioSenderCannotSetFrameEncryptorAfterStop) {
1661 CreateAudioRtpSender();
1662 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1663 new FakeFrameEncryptor());
1664 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1665 audio_rtp_sender_->Stop();
1666 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1667 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1668}
1669
Benjamin Wright84583f62018-10-04 14:22:34 -07001670// Validate that the default FrameEncryptor setting is nullptr.
1671TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetFrameDecryptor) {
1672 CreateAudioRtpReceiver();
1673 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1674 new FakeFrameDecryptor());
1675 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
1676 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1677 EXPECT_EQ(fake_frame_decryptor.get(),
1678 audio_rtp_receiver_->GetFrameDecryptor().get());
1679}
1680
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001681// Validate that the default FrameEncryptor setting is nullptr.
1682TEST_F(RtpSenderReceiverTest, AudioReceiverCannotSetFrameDecryptorAfterStop) {
1683 CreateAudioRtpReceiver();
1684 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1685 new FakeFrameDecryptor());
1686 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
1687 audio_rtp_receiver_->Stop();
1688 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1689 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1690}
1691
1692// Validate that the default FrameEncryptor setting is nullptr.
1693TEST_F(RtpSenderReceiverTest, VideoSenderCanSetFrameEncryptor) {
1694 CreateVideoRtpSender();
1695 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1696 new FakeFrameEncryptor());
1697 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1698 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1699 EXPECT_EQ(fake_frame_encryptor.get(),
1700 video_rtp_sender_->GetFrameEncryptor().get());
1701}
1702
1703// Validate that setting a FrameEncryptor after the send stream is stopped does
1704// nothing.
1705TEST_F(RtpSenderReceiverTest, VideoSenderCannotSetFrameEncryptorAfterStop) {
1706 CreateVideoRtpSender();
1707 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1708 new FakeFrameEncryptor());
1709 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1710 video_rtp_sender_->Stop();
1711 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1712 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1713}
1714
1715// Validate that the default FrameEncryptor setting is nullptr.
1716TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetFrameDecryptor) {
1717 CreateVideoRtpReceiver();
1718 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1719 new FakeFrameDecryptor());
1720 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
1721 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1722 EXPECT_EQ(fake_frame_decryptor.get(),
1723 video_rtp_receiver_->GetFrameDecryptor().get());
1724}
1725
1726// Validate that the default FrameEncryptor setting is nullptr.
1727TEST_F(RtpSenderReceiverTest, VideoReceiverCannotSetFrameDecryptorAfterStop) {
1728 CreateVideoRtpReceiver();
1729 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1730 new FakeFrameDecryptor());
1731 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
1732 video_rtp_receiver_->Stop();
1733 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1734 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1735}
1736
Amit Hilbuch619b2942019-02-26 15:55:19 -08001737// Checks that calling the internal methods for get/set parameters do not
1738// invalidate any parameters retreived by clients.
1739TEST_F(RtpSenderReceiverTest,
1740 InternalParameterMethodsDoNotInvalidateTransaction) {
1741 CreateVideoRtpSender();
1742 RtpParameters parameters = video_rtp_sender_->GetParameters();
1743 RtpParameters new_parameters = video_rtp_sender_->GetParametersInternal();
1744 new_parameters.encodings[0].active = false;
1745 video_rtp_sender_->SetParametersInternal(new_parameters);
1746 new_parameters.encodings[0].active = true;
1747 video_rtp_sender_->SetParametersInternal(new_parameters);
1748 parameters.encodings[0].active = false;
1749 EXPECT_TRUE(video_rtp_sender_->SetParameters(parameters).ok());
1750}
1751
Amit Hilbuch2297d332019-02-19 12:49:22 -08001752// Helper method for syntactic sugar for accepting a vector with '{}' notation.
1753std::pair<RidList, RidList> CreatePairOfRidVectors(
1754 const std::vector<std::string>& first,
1755 const std::vector<std::string>& second) {
1756 return std::make_pair(first, second);
1757}
1758
1759// These parameters are used to test disabling simulcast layers.
1760const std::pair<RidList, RidList> kDisableSimulcastLayersParameters[] = {
1761 // Tests removing the first layer. This is a special case because
1762 // the first layer's SSRC is also the 'primary' SSRC used to associate the
1763 // parameters to the media channel.
1764 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"1"}),
1765 // Tests removing some layers.
1766 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"2", "4"}),
1767 // Tests simulcast rejected scenario all layers except first are rejected.
1768 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"2", "3", "4"}),
1769 // Tests removing all layers.
1770 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"1", "2", "3", "4"}),
1771};
1772
1773// Runs test for disabling layers on a sender without a media engine set.
1774TEST_P(RtpSenderReceiverTest, DisableSimulcastLayersWithoutMediaEngine) {
1775 auto parameter = GetParam();
1776 RunDisableSimulcastLayersWithoutMediaEngineTest(parameter.first,
1777 parameter.second);
1778}
1779
1780// Runs test for disabling layers on a sender with a media engine set.
1781TEST_P(RtpSenderReceiverTest, DisableSimulcastLayersWithMediaEngine) {
1782 auto parameter = GetParam();
1783 RunDisableSimulcastLayersWithMediaEngineTest(parameter.first,
1784 parameter.second);
1785}
1786
1787INSTANTIATE_TEST_SUITE_P(
1788 DisableSimulcastLayersInSender,
1789 RtpSenderReceiverTest,
1790 ::testing::ValuesIn(kDisableSimulcastLayersParameters));
1791
deadbeef70ab1a12015-09-28 16:53:55 -07001792} // namespace webrtc