blob: 9026cfc20121ef974da3f2ed89e89fa9704a17ba [file] [log] [blame]
deadbeef70ab1a12015-09-28 16:53:55 -07001/*
kjellanderb24317b2016-02-10 07:54:43 -08002 * Copyright 2012 The WebRTC project authors. All Rights Reserved.
deadbeef70ab1a12015-09-28 16:53:55 -07003 *
kjellanderb24317b2016-02-10 07:54:43 -08004 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
deadbeef70ab1a12015-09-28 16:53:55 -07009 */
10
Yves Gerey3e707812018-11-28 16:47:49 +010011#include <stddef.h>
Jonas Olssona4d87372019-07-05 19:08:33 +020012
Yves Gerey3e707812018-11-28 16:47:49 +010013#include <cstdint>
kwibergd1fe2812016-04-27 06:47:29 -070014#include <memory>
deadbeef70ab1a12015-09-28 16:53:55 -070015#include <string>
Tommif888bb52015-12-12 01:37:01 +010016#include <utility>
Yves Gerey3e707812018-11-28 16:47:49 +010017#include <vector>
deadbeef70ab1a12015-09-28 16:53:55 -070018
Amit Hilbuch2297d332019-02-19 12:49:22 -080019#include "absl/algorithm/container.h"
Yves Gerey3e707812018-11-28 16:47:49 +010020#include "absl/memory/memory.h"
21#include "absl/types/optional.h"
22#include "api/audio_options.h"
Steve Anton10542f22019-01-11 09:11:00 -080023#include "api/crypto/crypto_options.h"
24#include "api/crypto/frame_decryptor_interface.h"
25#include "api/crypto/frame_encryptor_interface.h"
26#include "api/dtmf_sender_interface.h"
27#include "api/media_stream_interface.h"
28#include "api/rtc_error.h"
Danil Chapovalov83bbe912019-08-07 12:24:53 +020029#include "api/rtc_event_log/rtc_event_log.h"
Steve Anton10542f22019-01-11 09:11:00 -080030#include "api/rtp_parameters.h"
Mirko Bonadeid9708072019-01-25 20:26:48 +010031#include "api/scoped_refptr.h"
Benjamin Wright84583f62018-10-04 14:22:34 -070032#include "api/test/fake_frame_decryptor.h"
33#include "api/test/fake_frame_encryptor.h"
Jonas Orelanda3aa9bd2019-04-17 07:38:40 +020034#include "api/video/builtin_video_bitrate_allocator_factory.h"
Yves Gerey3e707812018-11-28 16:47:49 +010035#include "media/base/codec.h"
Steve Anton10542f22019-01-11 09:11:00 -080036#include "media/base/fake_media_engine.h"
37#include "media/base/media_channel.h"
38#include "media/base/media_config.h"
39#include "media/base/media_engine.h"
40#include "media/base/rtp_data_engine.h"
41#include "media/base/stream_params.h"
42#include "media/base/test_utils.h"
43#include "media/engine/fake_webrtc_call.h"
44#include "p2p/base/dtls_transport_internal.h"
45#include "p2p/base/fake_dtls_transport.h"
46#include "p2p/base/p2p_constants.h"
Ruslan Burakov501bfba2019-02-11 10:29:19 +010047#include "pc/audio_rtp_receiver.h"
Steve Anton10542f22019-01-11 09:11:00 -080048#include "pc/audio_track.h"
Yves Gerey3e707812018-11-28 16:47:49 +010049#include "pc/channel.h"
Steve Anton10542f22019-01-11 09:11:00 -080050#include "pc/channel_manager.h"
51#include "pc/dtls_srtp_transport.h"
52#include "pc/local_audio_source.h"
53#include "pc/media_stream.h"
Ruslan Burakov7ea46052019-02-16 02:07:05 +010054#include "pc/remote_audio_source.h"
Steve Anton10542f22019-01-11 09:11:00 -080055#include "pc/rtp_receiver.h"
56#include "pc/rtp_sender.h"
57#include "pc/rtp_transport_internal.h"
58#include "pc/test/fake_video_track_source.h"
Ruslan Burakov501bfba2019-02-11 10:29:19 +010059#include "pc/video_rtp_receiver.h"
Steve Anton10542f22019-01-11 09:11:00 -080060#include "pc/video_track.h"
Yves Gerey3e707812018-11-28 16:47:49 +010061#include "rtc_base/checks.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020062#include "rtc_base/gunit.h"
Yves Gerey3e707812018-11-28 16:47:49 +010063#include "rtc_base/third_party/sigslot/sigslot.h"
64#include "rtc_base/thread.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020065#include "test/gmock.h"
66#include "test/gtest.h"
deadbeef70ab1a12015-09-28 16:53:55 -070067
68using ::testing::_;
Amit Hilbuch2297d332019-02-19 12:49:22 -080069using ::testing::ContainerEq;
deadbeef70ab1a12015-09-28 16:53:55 -070070using ::testing::Exactly;
deadbeef5dd42fd2016-05-02 16:20:01 -070071using ::testing::InvokeWithoutArgs;
skvladdc1c62c2016-03-16 19:07:43 -070072using ::testing::Return;
Amit Hilbuch2297d332019-02-19 12:49:22 -080073using RidList = std::vector<std::string>;
deadbeef70ab1a12015-09-28 16:53:55 -070074
deadbeef20cb0c12017-02-01 20:27:00 -080075namespace {
76
Seth Hampson845e8782018-03-02 11:34:10 -080077static const char kStreamId1[] = "local_stream_1";
deadbeef70ab1a12015-09-28 16:53:55 -070078static const char kVideoTrackId[] = "video_1";
79static const char kAudioTrackId[] = "audio_1";
Peter Boström0c4e06b2015-10-07 12:23:21 +020080static const uint32_t kVideoSsrc = 98;
deadbeeffac06552015-11-25 11:26:01 -080081static const uint32_t kVideoSsrc2 = 100;
Peter Boström0c4e06b2015-10-07 12:23:21 +020082static const uint32_t kAudioSsrc = 99;
deadbeeffac06552015-11-25 11:26:01 -080083static const uint32_t kAudioSsrc2 = 101;
Florent Castelli892acf02018-10-01 22:47:20 +020084static const uint32_t kVideoSsrcSimulcast = 102;
85static const uint32_t kVideoSimulcastLayerCount = 2;
deadbeef20cb0c12017-02-01 20:27:00 -080086static const int kDefaultTimeout = 10000; // 10 seconds.
Guido Urdaneta1ff16c82019-05-20 19:31:53 +020087
88class MockSetStreamsObserver
89 : public webrtc::RtpSenderBase::SetStreamsObserver {
90 public:
91 MOCK_METHOD0(OnSetStreams, void());
92};
93
deadbeef20cb0c12017-02-01 20:27:00 -080094} // namespace
deadbeef70ab1a12015-09-28 16:53:55 -070095
96namespace webrtc {
97
Amit Hilbuch2297d332019-02-19 12:49:22 -080098class RtpSenderReceiverTest
Mirko Bonadei6a489f22019-04-09 15:11:12 +020099 : public ::testing::Test,
100 public ::testing::WithParamInterface<std::pair<RidList, RidList>>,
Amit Hilbuch2297d332019-02-19 12:49:22 -0800101 public sigslot::has_slots<> {
tkchin3784b4a2016-06-24 19:31:47 -0700102 public:
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700103 RtpSenderReceiverTest()
Steve Anton47136dd2018-01-12 10:49:35 -0800104 : network_thread_(rtc::Thread::Current()),
105 worker_thread_(rtc::Thread::Current()),
Jonas Orelanda3aa9bd2019-04-17 07:38:40 +0200106 video_bitrate_allocator_factory_(
107 webrtc::CreateBuiltinVideoBitrateAllocatorFactory()),
Steve Anton47136dd2018-01-12 10:49:35 -0800108 // Create fake media engine/etc. so we can create channels to use to
109 // test RtpSenders/RtpReceivers.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700110 media_engine_(new cricket::FakeMediaEngine()),
Karl Wiberg918f50c2018-07-05 11:40:33 +0200111 channel_manager_(absl::WrapUnique(media_engine_),
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200112 std::make_unique<cricket::RtpDataEngine>(),
Steve Anton47136dd2018-01-12 10:49:35 -0800113 worker_thread_,
114 network_thread_),
Sebastian Jansson8f83b422018-02-21 13:07:13 +0100115 fake_call_(),
Seth Hampson845e8782018-03-02 11:34:10 -0800116 local_stream_(MediaStream::Create(kStreamId1)) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700117 // Create channels to be used by the RtpSenders and RtpReceivers.
118 channel_manager_.Init();
deadbeef7af91dd2016-12-13 11:29:11 -0800119 bool srtp_required = true;
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200120 rtp_dtls_transport_ = std::make_unique<cricket::FakeDtlsTransport>(
Zhi Huange830e682018-03-30 10:48:35 -0700121 "fake_dtls_transport", cricket::ICE_CANDIDATE_COMPONENT_RTP);
122 rtp_transport_ = CreateDtlsSrtpTransport();
123
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700124 voice_channel_ = channel_manager_.CreateVoiceChannel(
Zhi Huange830e682018-03-30 10:48:35 -0700125 &fake_call_, cricket::MediaConfig(), rtp_transport_.get(),
Anton Sukhanov4f08faa2019-05-21 11:12:57 -0700126 MediaTransportConfig(), rtc::Thread::Current(), cricket::CN_AUDIO,
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800127 srtp_required, webrtc::CryptoOptions(), &ssrc_generator_,
128 cricket::AudioOptions());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700129 video_channel_ = channel_manager_.CreateVideoChannel(
Zhi Huange830e682018-03-30 10:48:35 -0700130 &fake_call_, cricket::MediaConfig(), rtp_transport_.get(),
Anton Sukhanov4f08faa2019-05-21 11:12:57 -0700131 MediaTransportConfig(), rtc::Thread::Current(), cricket::CN_VIDEO,
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800132 srtp_required, webrtc::CryptoOptions(), &ssrc_generator_,
Jonas Orelanda3aa9bd2019-04-17 07:38:40 +0200133 cricket::VideoOptions(), video_bitrate_allocator_factory_.get());
deadbeef20cb0c12017-02-01 20:27:00 -0800134 voice_channel_->Enable(true);
135 video_channel_->Enable(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700136 voice_media_channel_ = media_engine_->GetVoiceChannel(0);
137 video_media_channel_ = media_engine_->GetVideoChannel(0);
138 RTC_CHECK(voice_channel_);
139 RTC_CHECK(video_channel_);
140 RTC_CHECK(voice_media_channel_);
141 RTC_CHECK(video_media_channel_);
142
143 // Create streams for predefined SSRCs. Streams need to exist in order
144 // for the senders and receievers to apply parameters to them.
145 // Normally these would be created by SetLocalDescription and
146 // SetRemoteDescription.
147 voice_media_channel_->AddSendStream(
148 cricket::StreamParams::CreateLegacy(kAudioSsrc));
149 voice_media_channel_->AddRecvStream(
150 cricket::StreamParams::CreateLegacy(kAudioSsrc));
151 voice_media_channel_->AddSendStream(
152 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
153 voice_media_channel_->AddRecvStream(
154 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
155 video_media_channel_->AddSendStream(
156 cricket::StreamParams::CreateLegacy(kVideoSsrc));
157 video_media_channel_->AddRecvStream(
158 cricket::StreamParams::CreateLegacy(kVideoSsrc));
159 video_media_channel_->AddSendStream(
160 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
161 video_media_channel_->AddRecvStream(
162 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
tkchin3784b4a2016-06-24 19:31:47 -0700163 }
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700164
Zhi Huange830e682018-03-30 10:48:35 -0700165 std::unique_ptr<webrtc::RtpTransportInternal> CreateDtlsSrtpTransport() {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200166 auto dtls_srtp_transport = std::make_unique<webrtc::DtlsSrtpTransport>(
Karl Wiberg918f50c2018-07-05 11:40:33 +0200167 /*rtcp_mux_required=*/true);
Zhi Huange830e682018-03-30 10:48:35 -0700168 dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport_.get(),
169 /*rtcp_dtls_transport=*/nullptr);
170 return dtls_srtp_transport;
171 }
172
deadbeef20cb0c12017-02-01 20:27:00 -0800173 // Needed to use DTMF sender.
174 void AddDtmfCodec() {
175 cricket::AudioSendParameters params;
176 const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000,
177 0, 1);
178 params.codecs.push_back(kTelephoneEventCodec);
179 voice_media_channel_->SetSendParameters(params);
180 }
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700181
pbos5214a0a2016-12-16 15:39:11 -0800182 void AddVideoTrack() { AddVideoTrack(false); }
183
184 void AddVideoTrack(bool is_screencast) {
perkja3ede6c2016-03-08 01:27:48 +0100185 rtc::scoped_refptr<VideoTrackSourceInterface> source(
pbos5214a0a2016-12-16 15:39:11 -0800186 FakeVideoTrackSource::Create(is_screencast));
perkj773be362017-07-31 23:22:01 -0700187 video_track_ =
188 VideoTrack::Create(kVideoTrackId, source, rtc::Thread::Current());
deadbeefe814a0d2017-02-25 18:15:09 -0800189 EXPECT_TRUE(local_stream_->AddTrack(video_track_));
deadbeef70ab1a12015-09-28 16:53:55 -0700190 }
191
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700192 void CreateAudioRtpSender() { CreateAudioRtpSender(nullptr); }
193
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +0100194 void CreateAudioRtpSender(
195 const rtc::scoped_refptr<LocalAudioSource>& source) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700196 audio_track_ = AudioTrack::Create(kAudioTrackId, source);
deadbeefe814a0d2017-02-25 18:15:09 -0800197 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200198 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200199 std::make_unique<MockSetStreamsObserver>();
Steve Anton47136dd2018-01-12 10:49:35 -0800200 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200201 AudioRtpSender::Create(worker_thread_, audio_track_->id(), nullptr,
202 set_streams_observer.get());
Steve Anton111fdfd2018-06-25 13:03:36 -0700203 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200204 EXPECT_CALL(*set_streams_observer, OnSetStreams());
205 audio_rtp_sender_->SetStreams({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800206 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
deadbeeffac06552015-11-25 11:26:01 -0800207 audio_rtp_sender_->SetSsrc(kAudioSsrc);
deadbeef20cb0c12017-02-01 20:27:00 -0800208 audio_rtp_sender_->GetOnDestroyedSignal()->connect(
209 this, &RtpSenderReceiverTest::OnAudioSenderDestroyed);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700210 VerifyVoiceChannelInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700211 }
212
Steve Anton02ee47c2018-01-10 16:26:06 -0800213 void CreateAudioRtpSenderWithNoTrack() {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800214 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200215 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800216 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
Steve Anton02ee47c2018-01-10 16:26:06 -0800217 }
218
deadbeef20cb0c12017-02-01 20:27:00 -0800219 void OnAudioSenderDestroyed() { audio_sender_destroyed_signal_fired_ = true; }
220
Seth Hampson2d2c8882018-05-16 16:02:32 -0700221 void CreateVideoRtpSender(uint32_t ssrc) {
222 CreateVideoRtpSender(false, ssrc);
223 }
224
pbos5214a0a2016-12-16 15:39:11 -0800225 void CreateVideoRtpSender() { CreateVideoRtpSender(false); }
226
Amit Hilbuch2297d332019-02-19 12:49:22 -0800227 cricket::StreamParams CreateSimulcastStreamParams(int num_layers) {
Florent Castelli892acf02018-10-01 22:47:20 +0200228 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +0100229 ssrcs.reserve(num_layers);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800230 for (int i = 0; i < num_layers; ++i) {
Florent Castelli892acf02018-10-01 22:47:20 +0200231 ssrcs.push_back(kVideoSsrcSimulcast + i);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800232 }
233 return cricket::CreateSimStreamParams("cname", ssrcs);
234 }
235
236 uint32_t CreateVideoRtpSender(const cricket::StreamParams& stream_params) {
Florent Castelli892acf02018-10-01 22:47:20 +0200237 video_media_channel_->AddSendStream(stream_params);
238 uint32_t primary_ssrc = stream_params.first_ssrc();
239 CreateVideoRtpSender(primary_ssrc);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800240 return primary_ssrc;
241 }
242
243 uint32_t CreateVideoRtpSenderWithSimulcast(
244 int num_layers = kVideoSimulcastLayerCount) {
245 return CreateVideoRtpSender(CreateSimulcastStreamParams(num_layers));
246 }
247
248 uint32_t CreateVideoRtpSenderWithSimulcast(
249 const std::vector<std::string>& rids) {
250 cricket::StreamParams stream_params =
251 CreateSimulcastStreamParams(rids.size());
252 std::vector<cricket::RidDescription> rid_descriptions;
253 absl::c_transform(
254 rids, std::back_inserter(rid_descriptions), [](const std::string& rid) {
255 return cricket::RidDescription(rid, cricket::RidDirection::kSend);
256 });
257 stream_params.set_rids(rid_descriptions);
258 return CreateVideoRtpSender(stream_params);
Florent Castelli892acf02018-10-01 22:47:20 +0200259 }
260
Seth Hampson2d2c8882018-05-16 16:02:32 -0700261 void CreateVideoRtpSender(bool is_screencast, uint32_t ssrc = kVideoSsrc) {
pbos5214a0a2016-12-16 15:39:11 -0800262 AddVideoTrack(is_screencast);
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200263 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200264 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200265 video_rtp_sender_ = VideoRtpSender::Create(
266 worker_thread_, video_track_->id(), set_streams_observer.get());
Steve Anton111fdfd2018-06-25 13:03:36 -0700267 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200268 EXPECT_CALL(*set_streams_observer, OnSetStreams());
269 video_rtp_sender_->SetStreams({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800270 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Seth Hampson2d2c8882018-05-16 16:02:32 -0700271 video_rtp_sender_->SetSsrc(ssrc);
272 VerifyVideoChannelInput(ssrc);
deadbeef70ab1a12015-09-28 16:53:55 -0700273 }
Steve Anton02ee47c2018-01-10 16:26:06 -0800274 void CreateVideoRtpSenderWithNoTrack() {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200275 video_rtp_sender_ =
276 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800277 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Steve Anton02ee47c2018-01-10 16:26:06 -0800278 }
279
deadbeef70ab1a12015-09-28 16:53:55 -0700280 void DestroyAudioRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700281 audio_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700282 VerifyVoiceChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700283 }
284
285 void DestroyVideoRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700286 video_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700287 VerifyVideoChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700288 }
289
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100290 void CreateAudioRtpReceiver(
291 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
Mirko Bonadei05cf6be2019-01-31 21:38:12 +0100292 audio_rtp_receiver_ =
293 new AudioRtpReceiver(rtc::Thread::Current(), kAudioTrackId, streams);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800294 audio_rtp_receiver_->SetMediaChannel(voice_media_channel_);
Steve Antond3679212018-01-17 17:41:02 -0800295 audio_rtp_receiver_->SetupMediaChannel(kAudioSsrc);
perkjd61bf802016-03-24 03:16:19 -0700296 audio_track_ = audio_rtp_receiver_->audio_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700297 VerifyVoiceChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700298 }
299
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100300 void CreateVideoRtpReceiver(
301 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
Mirko Bonadei05cf6be2019-01-31 21:38:12 +0100302 video_rtp_receiver_ =
303 new VideoRtpReceiver(rtc::Thread::Current(), kVideoTrackId, streams);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800304 video_rtp_receiver_->SetMediaChannel(video_media_channel_);
Steve Antond3679212018-01-17 17:41:02 -0800305 video_rtp_receiver_->SetupMediaChannel(kVideoSsrc);
perkjf0dcfe22016-03-10 18:32:00 +0100306 video_track_ = video_rtp_receiver_->video_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700307 VerifyVideoChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700308 }
309
Florent Castelli38332cd2018-11-20 14:08:06 +0100310 void CreateVideoRtpReceiverWithSimulcast(
311 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {},
312 int num_layers = kVideoSimulcastLayerCount) {
313 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +0100314 ssrcs.reserve(num_layers);
Florent Castelli38332cd2018-11-20 14:08:06 +0100315 for (int i = 0; i < num_layers; ++i)
316 ssrcs.push_back(kVideoSsrcSimulcast + i);
317 cricket::StreamParams stream_params =
318 cricket::CreateSimStreamParams("cname", ssrcs);
319 video_media_channel_->AddRecvStream(stream_params);
320 uint32_t primary_ssrc = stream_params.first_ssrc();
321
Mirko Bonadei05cf6be2019-01-31 21:38:12 +0100322 video_rtp_receiver_ =
323 new VideoRtpReceiver(rtc::Thread::Current(), kVideoTrackId, streams);
Florent Castelli38332cd2018-11-20 14:08:06 +0100324 video_rtp_receiver_->SetMediaChannel(video_media_channel_);
325 video_rtp_receiver_->SetupMediaChannel(primary_ssrc);
326 video_track_ = video_rtp_receiver_->video_track();
327 }
328
deadbeef70ab1a12015-09-28 16:53:55 -0700329 void DestroyAudioRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700330 audio_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700331 VerifyVoiceChannelNoOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700332 }
333
334 void DestroyVideoRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700335 video_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700336 VerifyVideoChannelNoOutput();
337 }
338
339 void VerifyVoiceChannelInput() { VerifyVoiceChannelInput(kAudioSsrc); }
340
341 void VerifyVoiceChannelInput(uint32_t ssrc) {
342 // Verify that the media channel has an audio source, and the stream isn't
343 // muted.
344 EXPECT_TRUE(voice_media_channel_->HasSource(ssrc));
345 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(ssrc));
346 }
347
348 void VerifyVideoChannelInput() { VerifyVideoChannelInput(kVideoSsrc); }
349
350 void VerifyVideoChannelInput(uint32_t ssrc) {
351 // Verify that the media channel has a video source,
352 EXPECT_TRUE(video_media_channel_->HasSource(ssrc));
353 }
354
355 void VerifyVoiceChannelNoInput() { VerifyVoiceChannelNoInput(kAudioSsrc); }
356
357 void VerifyVoiceChannelNoInput(uint32_t ssrc) {
358 // Verify that the media channel's source is reset.
359 EXPECT_FALSE(voice_media_channel_->HasSource(ssrc));
360 }
361
362 void VerifyVideoChannelNoInput() { VerifyVideoChannelNoInput(kVideoSsrc); }
363
364 void VerifyVideoChannelNoInput(uint32_t ssrc) {
365 // Verify that the media channel's source is reset.
366 EXPECT_FALSE(video_media_channel_->HasSource(ssrc));
367 }
368
369 void VerifyVoiceChannelOutput() {
370 // Verify that the volume is initialized to 1.
371 double volume;
372 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
373 EXPECT_EQ(1, volume);
374 }
375
376 void VerifyVideoChannelOutput() {
377 // Verify that the media channel has a sink.
378 EXPECT_TRUE(video_media_channel_->HasSink(kVideoSsrc));
379 }
380
381 void VerifyVoiceChannelNoOutput() {
382 // Verify that the volume is reset to 0.
383 double volume;
384 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
385 EXPECT_EQ(0, volume);
386 }
387
388 void VerifyVideoChannelNoOutput() {
389 // Verify that the media channel's sink is reset.
390 EXPECT_FALSE(video_media_channel_->HasSink(kVideoSsrc));
deadbeef70ab1a12015-09-28 16:53:55 -0700391 }
392
Amit Hilbuch2297d332019-02-19 12:49:22 -0800393 // Verifies that the encoding layers contain the specified RIDs.
394 bool VerifyEncodingLayers(const VideoRtpSender& sender,
395 const std::vector<std::string>& rids) {
396 bool has_failure = HasFailure();
397 RtpParameters parameters = sender.GetParameters();
398 std::vector<std::string> encoding_rids;
399 absl::c_transform(
400 parameters.encodings, std::back_inserter(encoding_rids),
401 [](const RtpEncodingParameters& encoding) { return encoding.rid; });
402 EXPECT_THAT(rids, ContainerEq(encoding_rids));
403 return has_failure || !HasFailure();
404 }
405
406 // Runs a test for disabling the encoding layers on the specified sender.
407 void RunDisableEncodingLayersTest(
408 const std::vector<std::string>& all_layers,
409 const std::vector<std::string>& disabled_layers,
410 VideoRtpSender* sender) {
411 std::vector<std::string> expected;
412 absl::c_copy_if(all_layers, std::back_inserter(expected),
413 [&disabled_layers](const std::string& rid) {
414 return !absl::c_linear_search(disabled_layers, rid);
415 });
416
417 EXPECT_TRUE(VerifyEncodingLayers(*sender, all_layers));
418 sender->DisableEncodingLayers(disabled_layers);
419 EXPECT_TRUE(VerifyEncodingLayers(*sender, expected));
420 }
421
422 // Runs a test for setting an encoding layer as inactive.
423 // This test assumes that some layers have already been disabled.
424 void RunSetLastLayerAsInactiveTest(VideoRtpSender* sender) {
425 auto parameters = sender->GetParameters();
426 if (parameters.encodings.size() == 0) {
427 return;
428 }
429
430 RtpEncodingParameters& encoding = parameters.encodings.back();
431 auto rid = encoding.rid;
432 EXPECT_TRUE(encoding.active);
433 encoding.active = false;
434 auto error = sender->SetParameters(parameters);
435 ASSERT_TRUE(error.ok());
436 parameters = sender->GetParameters();
437 RtpEncodingParameters& result_encoding = parameters.encodings.back();
438 EXPECT_EQ(rid, result_encoding.rid);
439 EXPECT_FALSE(result_encoding.active);
440 }
441
442 // Runs a test for disabling the encoding layers on a sender without a media
443 // channel.
444 void RunDisableSimulcastLayersWithoutMediaEngineTest(
445 const std::vector<std::string>& all_layers,
446 const std::vector<std::string>& disabled_layers) {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200447 auto sender = VideoRtpSender::Create(rtc::Thread::Current(), "1", nullptr);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800448 RtpParameters parameters;
449 parameters.encodings.resize(all_layers.size());
450 for (size_t i = 0; i < all_layers.size(); ++i) {
451 parameters.encodings[i].rid = all_layers[i];
452 }
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800453 sender->set_init_send_encodings(parameters.encodings);
454 RunDisableEncodingLayersTest(all_layers, disabled_layers, sender.get());
455 RunSetLastLayerAsInactiveTest(sender.get());
Amit Hilbuch2297d332019-02-19 12:49:22 -0800456 }
457
458 // Runs a test for disabling the encoding layers on a sender with a media
459 // channel.
460 void RunDisableSimulcastLayersWithMediaEngineTest(
461 const std::vector<std::string>& all_layers,
462 const std::vector<std::string>& disabled_layers) {
463 uint32_t ssrc = CreateVideoRtpSenderWithSimulcast(all_layers);
464 RunDisableEncodingLayersTest(all_layers, disabled_layers,
465 video_rtp_sender_.get());
466
467 auto channel_parameters = video_media_channel_->GetRtpSendParameters(ssrc);
468 ASSERT_EQ(channel_parameters.encodings.size(), all_layers.size());
469 for (size_t i = 0; i < all_layers.size(); ++i) {
470 EXPECT_EQ(all_layers[i], channel_parameters.encodings[i].rid);
471 bool is_active = !absl::c_linear_search(disabled_layers, all_layers[i]);
472 EXPECT_EQ(is_active, channel_parameters.encodings[i].active);
473 }
474
475 RunSetLastLayerAsInactiveTest(video_rtp_sender_.get());
476 }
477
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200478 // Check that minimum Jitter Buffer delay is propagated to the underlying
479 // |media_channel|.
480 void VerifyRtpReceiverDelayBehaviour(cricket::Delayable* media_channel,
481 RtpReceiverInterface* receiver,
482 uint32_t ssrc) {
483 receiver->SetJitterBufferMinimumDelay(/*delay_seconds=*/0.5);
484 absl::optional<int> delay_ms =
485 media_channel->GetBaseMinimumPlayoutDelayMs(ssrc); // In milliseconds.
486 EXPECT_DOUBLE_EQ(0.5, delay_ms.value_or(0) / 1000.0);
487 }
488
deadbeef70ab1a12015-09-28 16:53:55 -0700489 protected:
Steve Anton47136dd2018-01-12 10:49:35 -0800490 rtc::Thread* const network_thread_;
491 rtc::Thread* const worker_thread_;
Danil Chapovalov83bbe912019-08-07 12:24:53 +0200492 webrtc::RtcEventLogNull event_log_;
Zhi Huange830e682018-03-30 10:48:35 -0700493 // The |rtp_dtls_transport_| and |rtp_transport_| should be destroyed after
494 // the |channel_manager|.
495 std::unique_ptr<cricket::DtlsTransportInternal> rtp_dtls_transport_;
496 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport_;
Jonas Orelanda3aa9bd2019-04-17 07:38:40 +0200497 std::unique_ptr<webrtc::VideoBitrateAllocatorFactory>
498 video_bitrate_allocator_factory_;
deadbeef112b2e92017-02-10 20:13:37 -0800499 // |media_engine_| is actually owned by |channel_manager_|.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700500 cricket::FakeMediaEngine* media_engine_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700501 cricket::ChannelManager channel_manager_;
502 cricket::FakeCall fake_call_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700503 cricket::VoiceChannel* voice_channel_;
504 cricket::VideoChannel* video_channel_;
505 cricket::FakeVoiceMediaChannel* voice_media_channel_;
506 cricket::FakeVideoMediaChannel* video_media_channel_;
deadbeef70ab1a12015-09-28 16:53:55 -0700507 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
508 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
509 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
510 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
deadbeefe814a0d2017-02-25 18:15:09 -0800511 rtc::scoped_refptr<MediaStreamInterface> local_stream_;
deadbeef70ab1a12015-09-28 16:53:55 -0700512 rtc::scoped_refptr<VideoTrackInterface> video_track_;
513 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
deadbeef20cb0c12017-02-01 20:27:00 -0800514 bool audio_sender_destroyed_signal_fired_ = false;
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800515 rtc::UniqueRandomIdGenerator ssrc_generator_;
deadbeef70ab1a12015-09-28 16:53:55 -0700516};
517
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700518// Test that |voice_channel_| is updated when an audio track is associated
deadbeef70ab1a12015-09-28 16:53:55 -0700519// and disassociated with an AudioRtpSender.
520TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
521 CreateAudioRtpSender();
522 DestroyAudioRtpSender();
523}
524
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700525// Test that |video_channel_| is updated when a video track is associated and
deadbeef70ab1a12015-09-28 16:53:55 -0700526// disassociated with a VideoRtpSender.
527TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
528 CreateVideoRtpSender();
529 DestroyVideoRtpSender();
530}
531
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700532// Test that |voice_channel_| is updated when a remote audio track is
deadbeef70ab1a12015-09-28 16:53:55 -0700533// associated and disassociated with an AudioRtpReceiver.
534TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
535 CreateAudioRtpReceiver();
536 DestroyAudioRtpReceiver();
537}
538
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700539// Test that |video_channel_| is updated when a remote video track is
540// associated and disassociated with a VideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700541TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
542 CreateVideoRtpReceiver();
543 DestroyVideoRtpReceiver();
544}
545
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100546TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiverWithStreams) {
547 CreateAudioRtpReceiver({local_stream_});
548 DestroyAudioRtpReceiver();
549}
550
551TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiverWithStreams) {
552 CreateVideoRtpReceiver({local_stream_});
553 DestroyVideoRtpReceiver();
554}
555
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700556// Test that the AudioRtpSender applies options from the local audio source.
557TEST_F(RtpSenderReceiverTest, LocalAudioSourceOptionsApplied) {
558 cricket::AudioOptions options;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100559 options.echo_cancellation = true;
deadbeef757146b2017-02-10 21:26:48 -0800560 auto source = LocalAudioSource::Create(&options);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700561 CreateAudioRtpSender(source.get());
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700562
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100563 EXPECT_EQ(true, voice_media_channel_->options().echo_cancellation);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700564
565 DestroyAudioRtpSender();
566}
567
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700568// Test that the stream is muted when the track is disabled, and unmuted when
569// the track is enabled.
570TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) {
571 CreateAudioRtpSender();
572
573 audio_track_->set_enabled(false);
574 EXPECT_TRUE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
575
576 audio_track_->set_enabled(true);
577 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
578
579 DestroyAudioRtpSender();
580}
581
582// Test that the volume is set to 0 when the track is disabled, and back to
583// 1 when the track is enabled.
deadbeef70ab1a12015-09-28 16:53:55 -0700584TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
585 CreateAudioRtpReceiver();
586
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700587 double volume;
588 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
589 EXPECT_EQ(1, volume);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700590
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700591 audio_track_->set_enabled(false);
592 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
593 EXPECT_EQ(0, volume);
594
deadbeef70ab1a12015-09-28 16:53:55 -0700595 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700596 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
597 EXPECT_EQ(1, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700598
599 DestroyAudioRtpReceiver();
600}
601
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700602// Currently no action is taken when a remote video track is disabled or
603// enabled, so there's nothing to test here, other than what is normally
604// verified in DestroyVideoRtpSender.
deadbeef70ab1a12015-09-28 16:53:55 -0700605TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
606 CreateVideoRtpSender();
607
deadbeef70ab1a12015-09-28 16:53:55 -0700608 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700609 video_track_->set_enabled(true);
610
611 DestroyVideoRtpSender();
612}
613
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700614// Test that the state of the video track created by the VideoRtpReceiver is
615// updated when the receiver is destroyed.
perkjf0dcfe22016-03-10 18:32:00 +0100616TEST_F(RtpSenderReceiverTest, RemoteVideoTrackState) {
617 CreateVideoRtpReceiver();
618
619 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track_->state());
620 EXPECT_EQ(webrtc::MediaSourceInterface::kLive,
621 video_track_->GetSource()->state());
622
623 DestroyVideoRtpReceiver();
624
625 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track_->state());
626 EXPECT_EQ(webrtc::MediaSourceInterface::kEnded,
627 video_track_->GetSource()->state());
628}
629
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700630// Currently no action is taken when a remote video track is disabled or
631// enabled, so there's nothing to test here, other than what is normally
632// verified in DestroyVideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700633TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
634 CreateVideoRtpReceiver();
635
636 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700637 video_track_->set_enabled(true);
638
639 DestroyVideoRtpReceiver();
640}
641
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700642// Test that the AudioRtpReceiver applies volume changes from the track source
643// to the media channel.
deadbeef70ab1a12015-09-28 16:53:55 -0700644TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
645 CreateAudioRtpReceiver();
646
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700647 double volume;
648 audio_track_->GetSource()->SetVolume(0.5);
649 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
650 EXPECT_EQ(0.5, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700651
652 // Disable the audio track, this should prevent setting the volume.
deadbeef70ab1a12015-09-28 16:53:55 -0700653 audio_track_->set_enabled(false);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700654 audio_track_->GetSource()->SetVolume(0.8);
655 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
656 EXPECT_EQ(0, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700657
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700658 // When the track is enabled, the previously set volume should take effect.
deadbeef70ab1a12015-09-28 16:53:55 -0700659 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700660 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
661 EXPECT_EQ(0.8, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700662
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700663 // Try changing volume one more time.
664 audio_track_->GetSource()->SetVolume(0.9);
665 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
666 EXPECT_EQ(0.9, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700667
668 DestroyAudioRtpReceiver();
669}
670
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200671TEST_F(RtpSenderReceiverTest, AudioRtpReceiverDelay) {
672 CreateAudioRtpReceiver();
673 VerifyRtpReceiverDelayBehaviour(voice_media_channel_,
674 audio_rtp_receiver_.get(), kAudioSsrc);
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200675}
676
677TEST_F(RtpSenderReceiverTest, VideoRtpReceiverDelay) {
678 CreateVideoRtpReceiver();
679 VerifyRtpReceiverDelayBehaviour(video_media_channel_,
680 video_rtp_receiver_.get(), kVideoSsrc);
681}
682
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700683// Test that the media channel isn't enabled for sending if the audio sender
684// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800685TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800686 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800687 rtc::scoped_refptr<AudioTrackInterface> track =
688 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700689
690 // Track but no SSRC.
691 EXPECT_TRUE(audio_rtp_sender_->SetTrack(track));
692 VerifyVoiceChannelNoInput();
693
694 // SSRC but no track.
695 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
696 audio_rtp_sender_->SetSsrc(kAudioSsrc);
697 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800698}
699
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700700// Test that the media channel isn't enabled for sending if the video sender
701// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800702TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800703 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700704
705 // Track but no SSRC.
706 EXPECT_TRUE(video_rtp_sender_->SetTrack(video_track_));
707 VerifyVideoChannelNoInput();
708
709 // SSRC but no track.
710 EXPECT_TRUE(video_rtp_sender_->SetTrack(nullptr));
711 video_rtp_sender_->SetSsrc(kVideoSsrc);
712 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800713}
714
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700715// Test that the media channel is enabled for sending when the audio sender
716// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800717TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800718 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800719 rtc::scoped_refptr<AudioTrackInterface> track =
720 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700721 audio_rtp_sender_->SetSsrc(kAudioSsrc);
722 audio_rtp_sender_->SetTrack(track);
723 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800724
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700725 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800726}
727
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700728// Test that the media channel is enabled for sending when the audio sender
729// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800730TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800731 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800732 rtc::scoped_refptr<AudioTrackInterface> track =
733 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700734 audio_rtp_sender_->SetTrack(track);
735 audio_rtp_sender_->SetSsrc(kAudioSsrc);
736 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800737
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700738 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800739}
740
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700741// Test that the media channel is enabled for sending when the video sender
742// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800743TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
nisseaf510af2016-03-21 08:20:42 -0700744 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800745 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700746 video_rtp_sender_->SetSsrc(kVideoSsrc);
747 video_rtp_sender_->SetTrack(video_track_);
748 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800749
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700750 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800751}
752
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700753// Test that the media channel is enabled for sending when the video sender
754// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800755TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
nisseaf510af2016-03-21 08:20:42 -0700756 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800757 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700758 video_rtp_sender_->SetTrack(video_track_);
759 video_rtp_sender_->SetSsrc(kVideoSsrc);
760 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800761
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700762 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800763}
764
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700765// Test that the media channel stops sending when the audio sender's SSRC is set
766// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800767TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700768 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800769
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700770 audio_rtp_sender_->SetSsrc(0);
771 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800772}
773
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700774// Test that the media channel stops sending when the video sender's SSRC is set
775// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800776TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700777 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800778
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700779 audio_rtp_sender_->SetSsrc(0);
780 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800781}
782
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700783// Test that the media channel stops sending when the audio sender's track is
784// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800785TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700786 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800787
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700788 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
789 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800790}
791
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700792// Test that the media channel stops sending when the video sender's track is
793// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800794TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700795 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800796
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700797 video_rtp_sender_->SetSsrc(0);
798 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800799}
800
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700801// Test that when the audio sender's SSRC is changed, the media channel stops
802// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800803TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700804 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800805
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700806 audio_rtp_sender_->SetSsrc(kAudioSsrc2);
807 VerifyVoiceChannelNoInput(kAudioSsrc);
808 VerifyVoiceChannelInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800809
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700810 audio_rtp_sender_ = nullptr;
811 VerifyVoiceChannelNoInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800812}
813
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700814// Test that when the audio sender's SSRC is changed, the media channel stops
815// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800816TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700817 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800818
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700819 video_rtp_sender_->SetSsrc(kVideoSsrc2);
820 VerifyVideoChannelNoInput(kVideoSsrc);
821 VerifyVideoChannelInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800822
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700823 video_rtp_sender_ = nullptr;
824 VerifyVideoChannelNoInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800825}
826
skvladdc1c62c2016-03-16 19:07:43 -0700827TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) {
828 CreateAudioRtpSender();
829
skvladdc1c62c2016-03-16 19:07:43 -0700830 RtpParameters params = audio_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700831 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -0800832 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -0700833
834 DestroyAudioRtpSender();
835}
836
Florent Castelli892acf02018-10-01 22:47:20 +0200837TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParametersBeforeNegotiation) {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800838 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200839 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +0200840
841 RtpParameters params = audio_rtp_sender_->GetParameters();
842 ASSERT_EQ(1u, params.encodings.size());
843 params.encodings[0].max_bitrate_bps = 90000;
844 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
845
846 params = audio_rtp_sender_->GetParameters();
847 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
848 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
849
850 DestroyAudioRtpSender();
851}
852
853TEST_F(RtpSenderReceiverTest, AudioSenderInitParametersMovedAfterNegotiation) {
854 audio_track_ = AudioTrack::Create(kAudioTrackId, nullptr);
855 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
856
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200857 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200858 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200859 audio_rtp_sender_ = AudioRtpSender::Create(
860 worker_thread_, audio_track_->id(), nullptr, set_streams_observer.get());
Florent Castelli892acf02018-10-01 22:47:20 +0200861 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200862 EXPECT_CALL(*set_streams_observer, OnSetStreams());
863 audio_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli892acf02018-10-01 22:47:20 +0200864
865 std::vector<RtpEncodingParameters> init_encodings(1);
866 init_encodings[0].max_bitrate_bps = 60000;
867 audio_rtp_sender_->set_init_send_encodings(init_encodings);
868
869 RtpParameters params = audio_rtp_sender_->GetParameters();
870 ASSERT_EQ(1u, params.encodings.size());
871 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
872
873 // Simulate the setLocalDescription call
874 std::vector<uint32_t> ssrcs(1, 1);
875 cricket::StreamParams stream_params =
876 cricket::CreateSimStreamParams("cname", ssrcs);
877 voice_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800878 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +0200879 audio_rtp_sender_->SetSsrc(1);
880
881 params = audio_rtp_sender_->GetParameters();
882 ASSERT_EQ(1u, params.encodings.size());
883 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
884
885 DestroyAudioRtpSender();
886}
887
888TEST_F(RtpSenderReceiverTest,
889 AudioSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800890 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200891 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +0200892
893 RtpParameters params;
894 RTCError result = audio_rtp_sender_->SetParameters(params);
895 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
896 DestroyAudioRtpSender();
897}
898
Florent Castellicebf50f2018-05-03 15:31:53 +0200899TEST_F(RtpSenderReceiverTest,
900 AudioSenderMustCallGetParametersBeforeSetParameters) {
901 CreateAudioRtpSender();
902
903 RtpParameters params;
904 RTCError result = audio_rtp_sender_->SetParameters(params);
905 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
906
907 DestroyAudioRtpSender();
908}
909
910TEST_F(RtpSenderReceiverTest,
911 AudioSenderSetParametersInvalidatesTransactionId) {
912 CreateAudioRtpSender();
913
914 RtpParameters params = audio_rtp_sender_->GetParameters();
915 EXPECT_EQ(1u, params.encodings.size());
916 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
917 RTCError result = audio_rtp_sender_->SetParameters(params);
918 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
919
920 DestroyAudioRtpSender();
921}
922
923TEST_F(RtpSenderReceiverTest, AudioSenderDetectTransactionIdModification) {
924 CreateAudioRtpSender();
925
926 RtpParameters params = audio_rtp_sender_->GetParameters();
927 params.transaction_id = "";
928 RTCError result = audio_rtp_sender_->SetParameters(params);
929 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
930
931 DestroyAudioRtpSender();
932}
933
934TEST_F(RtpSenderReceiverTest, AudioSenderCheckTransactionIdRefresh) {
935 CreateAudioRtpSender();
936
937 RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200938 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 15:31:53 +0200939 auto saved_transaction_id = params.transaction_id;
940 params = audio_rtp_sender_->GetParameters();
941 EXPECT_NE(saved_transaction_id, params.transaction_id);
942
943 DestroyAudioRtpSender();
944}
945
946TEST_F(RtpSenderReceiverTest, AudioSenderSetParametersOldValueFail) {
947 CreateAudioRtpSender();
948
949 RtpParameters params = audio_rtp_sender_->GetParameters();
950 RtpParameters second_params = audio_rtp_sender_->GetParameters();
951
952 RTCError result = audio_rtp_sender_->SetParameters(params);
953 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
Seth Hampson2d2c8882018-05-16 16:02:32 -0700954 DestroyAudioRtpSender();
955}
956
957TEST_F(RtpSenderReceiverTest, AudioSenderCantSetUnimplementedRtpParameters) {
958 CreateAudioRtpSender();
959 RtpParameters params = audio_rtp_sender_->GetParameters();
960 EXPECT_EQ(1u, params.encodings.size());
961
Florent Castelli87b3c512018-07-18 16:00:28 +0200962 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 16:02:32 -0700963 params.mid = "dummy_mid";
964 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
965 audio_rtp_sender_->SetParameters(params).type());
966 params = audio_rtp_sender_->GetParameters();
967
Seth Hampson2d2c8882018-05-16 16:02:32 -0700968 DestroyAudioRtpSender();
969}
970
971TEST_F(RtpSenderReceiverTest,
972 AudioSenderCantSetUnimplementedRtpEncodingParameters) {
973 CreateAudioRtpSender();
974 RtpParameters params = audio_rtp_sender_->GetParameters();
975 EXPECT_EQ(1u, params.encodings.size());
976
Henrik Grunelle1301a82018-12-13 12:13:22 +0000977 // Unimplemented RtpParameters: codec_payload_type, fec, rtx, dtx, ptime,
Amit Hilbuchaa584152019-02-06 17:09:52 -0800978 // scale_framerate_down_by, dependency_rids.
Henrik Grunelle1301a82018-12-13 12:13:22 +0000979 params.encodings[0].codec_payload_type = 1;
980 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
981 audio_rtp_sender_->SetParameters(params).type());
982 params = audio_rtp_sender_->GetParameters();
983
Seth Hampson2d2c8882018-05-16 16:02:32 -0700984 params.encodings[0].fec = RtpFecParameters();
985 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
986 audio_rtp_sender_->SetParameters(params).type());
987 params = audio_rtp_sender_->GetParameters();
988
989 params.encodings[0].rtx = RtpRtxParameters();
990 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
991 audio_rtp_sender_->SetParameters(params).type());
992 params = audio_rtp_sender_->GetParameters();
993
994 params.encodings[0].dtx = DtxStatus::ENABLED;
995 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
996 audio_rtp_sender_->SetParameters(params).type());
997 params = audio_rtp_sender_->GetParameters();
998
999 params.encodings[0].ptime = 1;
1000 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1001 audio_rtp_sender_->SetParameters(params).type());
1002 params = audio_rtp_sender_->GetParameters();
1003
Seth Hampson2d2c8882018-05-16 16:02:32 -07001004 params.encodings[0].dependency_rids.push_back("dummy_rid");
1005 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1006 audio_rtp_sender_->SetParameters(params).type());
Florent Castellicebf50f2018-05-03 15:31:53 +02001007
1008 DestroyAudioRtpSender();
1009}
1010
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001011TEST_F(RtpSenderReceiverTest, SetAudioMaxSendBitrate) {
1012 CreateAudioRtpSender();
1013
1014 EXPECT_EQ(-1, voice_media_channel_->max_bps());
1015 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001016 EXPECT_EQ(1U, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -08001017 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001018 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -08001019 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001020
1021 // Read back the parameters and verify they have been changed.
1022 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001023 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001024 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001025
1026 // Verify that the audio channel received the new parameters.
1027 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001028 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001029 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001030
1031 // Verify that the global bitrate limit has not been changed.
1032 EXPECT_EQ(-1, voice_media_channel_->max_bps());
1033
1034 DestroyAudioRtpSender();
1035}
1036
Seth Hampson24722b32017-12-22 09:36:42 -08001037TEST_F(RtpSenderReceiverTest, SetAudioBitratePriority) {
1038 CreateAudioRtpSender();
1039
1040 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001041 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001042 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1043 params.encodings[0].bitrate_priority);
1044 double new_bitrate_priority = 2.0;
1045 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -08001046 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -08001047
1048 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001049 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001050 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1051
1052 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001053 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001054 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1055
1056 DestroyAudioRtpSender();
1057}
1058
skvladdc1c62c2016-03-16 19:07:43 -07001059TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) {
1060 CreateVideoRtpSender();
1061
skvladdc1c62c2016-03-16 19:07:43 -07001062 RtpParameters params = video_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001063 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -08001064 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -07001065
1066 DestroyVideoRtpSender();
1067}
1068
Florent Castelli892acf02018-10-01 22:47:20 +02001069TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParametersBeforeNegotiation) {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001070 video_rtp_sender_ =
1071 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +02001072
1073 RtpParameters params = video_rtp_sender_->GetParameters();
1074 ASSERT_EQ(1u, params.encodings.size());
1075 params.encodings[0].max_bitrate_bps = 90000;
1076 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1077
1078 params = video_rtp_sender_->GetParameters();
1079 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1080 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
1081
1082 DestroyVideoRtpSender();
1083}
1084
1085TEST_F(RtpSenderReceiverTest, VideoSenderInitParametersMovedAfterNegotiation) {
1086 AddVideoTrack(false);
1087
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001088 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001089 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001090 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1091 set_streams_observer.get());
Florent Castelli892acf02018-10-01 22:47:20 +02001092 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001093 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1094 video_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli892acf02018-10-01 22:47:20 +02001095
1096 std::vector<RtpEncodingParameters> init_encodings(2);
1097 init_encodings[0].max_bitrate_bps = 60000;
1098 init_encodings[1].max_bitrate_bps = 900000;
1099 video_rtp_sender_->set_init_send_encodings(init_encodings);
1100
1101 RtpParameters params = video_rtp_sender_->GetParameters();
1102 ASSERT_EQ(2u, params.encodings.size());
1103 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1104 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
1105
1106 // Simulate the setLocalDescription call
1107 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +01001108 ssrcs.reserve(2);
Florent Castelli892acf02018-10-01 22:47:20 +02001109 for (int i = 0; i < 2; ++i)
1110 ssrcs.push_back(kVideoSsrcSimulcast + i);
1111 cricket::StreamParams stream_params =
1112 cricket::CreateSimStreamParams("cname", ssrcs);
1113 video_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -08001114 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +02001115 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
1116
1117 params = video_rtp_sender_->GetParameters();
1118 ASSERT_EQ(2u, params.encodings.size());
1119 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1120 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
1121
1122 DestroyVideoRtpSender();
1123}
1124
1125TEST_F(RtpSenderReceiverTest,
1126 VideoSenderInitParametersMovedAfterManualSimulcastAndNegotiation) {
1127 AddVideoTrack(false);
1128
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001129 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001130 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001131 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1132 set_streams_observer.get());
Florent Castelli892acf02018-10-01 22:47:20 +02001133 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001134 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1135 video_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli892acf02018-10-01 22:47:20 +02001136
1137 std::vector<RtpEncodingParameters> init_encodings(1);
1138 init_encodings[0].max_bitrate_bps = 60000;
1139 video_rtp_sender_->set_init_send_encodings(init_encodings);
1140
1141 RtpParameters params = video_rtp_sender_->GetParameters();
1142 ASSERT_EQ(1u, params.encodings.size());
1143 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1144
1145 // Simulate the setLocalDescription call as if the user used SDP munging
1146 // to enable simulcast
1147 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +01001148 ssrcs.reserve(2);
Florent Castelli892acf02018-10-01 22:47:20 +02001149 for (int i = 0; i < 2; ++i)
1150 ssrcs.push_back(kVideoSsrcSimulcast + i);
1151 cricket::StreamParams stream_params =
1152 cricket::CreateSimStreamParams("cname", ssrcs);
1153 video_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -08001154 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +02001155 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
1156
1157 params = video_rtp_sender_->GetParameters();
1158 ASSERT_EQ(2u, params.encodings.size());
1159 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1160
1161 DestroyVideoRtpSender();
1162}
1163
1164TEST_F(RtpSenderReceiverTest,
1165 VideoSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001166 video_rtp_sender_ =
1167 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +02001168
1169 RtpParameters params;
1170 RTCError result = video_rtp_sender_->SetParameters(params);
1171 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1172 DestroyVideoRtpSender();
1173}
1174
Florent Castellicebf50f2018-05-03 15:31:53 +02001175TEST_F(RtpSenderReceiverTest,
1176 VideoSenderMustCallGetParametersBeforeSetParameters) {
1177 CreateVideoRtpSender();
1178
1179 RtpParameters params;
1180 RTCError result = video_rtp_sender_->SetParameters(params);
1181 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1182
1183 DestroyVideoRtpSender();
1184}
1185
1186TEST_F(RtpSenderReceiverTest,
1187 VideoSenderSetParametersInvalidatesTransactionId) {
1188 CreateVideoRtpSender();
1189
1190 RtpParameters params = video_rtp_sender_->GetParameters();
1191 EXPECT_EQ(1u, params.encodings.size());
1192 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1193 RTCError result = video_rtp_sender_->SetParameters(params);
1194 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1195
1196 DestroyVideoRtpSender();
1197}
1198
1199TEST_F(RtpSenderReceiverTest, VideoSenderDetectTransactionIdModification) {
1200 CreateVideoRtpSender();
1201
1202 RtpParameters params = video_rtp_sender_->GetParameters();
1203 params.transaction_id = "";
1204 RTCError result = video_rtp_sender_->SetParameters(params);
1205 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1206
1207 DestroyVideoRtpSender();
1208}
1209
1210TEST_F(RtpSenderReceiverTest, VideoSenderCheckTransactionIdRefresh) {
1211 CreateVideoRtpSender();
1212
1213 RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001214 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 15:31:53 +02001215 auto saved_transaction_id = params.transaction_id;
1216 params = video_rtp_sender_->GetParameters();
1217 EXPECT_NE(saved_transaction_id, params.transaction_id);
1218
1219 DestroyVideoRtpSender();
1220}
1221
1222TEST_F(RtpSenderReceiverTest, VideoSenderSetParametersOldValueFail) {
1223 CreateVideoRtpSender();
1224
1225 RtpParameters params = video_rtp_sender_->GetParameters();
1226 RtpParameters second_params = video_rtp_sender_->GetParameters();
1227
1228 RTCError result = video_rtp_sender_->SetParameters(params);
1229 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1230
1231 DestroyVideoRtpSender();
1232}
1233
Seth Hampson2d2c8882018-05-16 16:02:32 -07001234TEST_F(RtpSenderReceiverTest, VideoSenderCantSetUnimplementedRtpParameters) {
1235 CreateVideoRtpSender();
1236 RtpParameters params = video_rtp_sender_->GetParameters();
1237 EXPECT_EQ(1u, params.encodings.size());
1238
Florent Castelli87b3c512018-07-18 16:00:28 +02001239 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 16:02:32 -07001240 params.mid = "dummy_mid";
1241 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1242 video_rtp_sender_->SetParameters(params).type());
1243 params = video_rtp_sender_->GetParameters();
1244
Seth Hampson2d2c8882018-05-16 16:02:32 -07001245 DestroyVideoRtpSender();
1246}
1247
1248TEST_F(RtpSenderReceiverTest,
1249 VideoSenderCantSetUnimplementedEncodingParameters) {
1250 CreateVideoRtpSender();
1251 RtpParameters params = video_rtp_sender_->GetParameters();
1252 EXPECT_EQ(1u, params.encodings.size());
1253
Henrik Grunelle1301a82018-12-13 12:13:22 +00001254 // Unimplemented RtpParameters: codec_payload_type, fec, rtx, dtx, ptime,
Amit Hilbuchaa584152019-02-06 17:09:52 -08001255 // scale_framerate_down_by, dependency_rids.
Henrik Grunelle1301a82018-12-13 12:13:22 +00001256 params.encodings[0].codec_payload_type = 1;
1257 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1258 video_rtp_sender_->SetParameters(params).type());
1259 params = video_rtp_sender_->GetParameters();
1260
Seth Hampson2d2c8882018-05-16 16:02:32 -07001261 params.encodings[0].fec = RtpFecParameters();
1262 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1263 video_rtp_sender_->SetParameters(params).type());
1264 params = video_rtp_sender_->GetParameters();
1265
1266 params.encodings[0].rtx = RtpRtxParameters();
1267 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1268 video_rtp_sender_->SetParameters(params).type());
1269 params = video_rtp_sender_->GetParameters();
1270
1271 params.encodings[0].dtx = DtxStatus::ENABLED;
1272 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1273 video_rtp_sender_->SetParameters(params).type());
1274 params = video_rtp_sender_->GetParameters();
1275
1276 params.encodings[0].ptime = 1;
1277 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1278 video_rtp_sender_->SetParameters(params).type());
1279 params = video_rtp_sender_->GetParameters();
1280
Seth Hampson2d2c8882018-05-16 16:02:32 -07001281 params.encodings[0].dependency_rids.push_back("dummy_rid");
1282 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1283 video_rtp_sender_->SetParameters(params).type());
1284
1285 DestroyVideoRtpSender();
1286}
1287
Florent Castellic1a0bcb2019-01-29 14:26:48 +01001288TEST_F(RtpSenderReceiverTest, VideoSenderCanSetScaleResolutionDownBy) {
1289 CreateVideoRtpSender();
1290
1291 RtpParameters params = video_rtp_sender_->GetParameters();
1292 params.encodings[0].scale_resolution_down_by = 2;
1293
1294 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1295 params = video_rtp_sender_->GetParameters();
1296 EXPECT_EQ(2, params.encodings[0].scale_resolution_down_by);
1297
1298 DestroyVideoRtpSender();
1299}
1300
1301TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidScaleResolutionDownBy) {
1302 CreateVideoRtpSender();
1303
1304 RtpParameters params = video_rtp_sender_->GetParameters();
1305 params.encodings[0].scale_resolution_down_by = 0.5;
1306 RTCError result = video_rtp_sender_->SetParameters(params);
1307 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1308
1309 DestroyVideoRtpSender();
1310}
1311
Florent Castelli892acf02018-10-01 22:47:20 +02001312TEST_F(RtpSenderReceiverTest,
1313 VideoSenderCantSetUnimplementedEncodingParametersWithSimulcast) {
1314 CreateVideoRtpSenderWithSimulcast();
1315 RtpParameters params = video_rtp_sender_->GetParameters();
1316 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
1317
Henrik Grunelle1301a82018-12-13 12:13:22 +00001318 // Unimplemented RtpParameters: codec_payload_type, fec, rtx, dtx, ptime,
Amit Hilbuchaa584152019-02-06 17:09:52 -08001319 // scale_framerate_down_by, dependency_rids.
Florent Castelli892acf02018-10-01 22:47:20 +02001320 for (size_t i = 0; i < params.encodings.size(); i++) {
Henrik Grunelle1301a82018-12-13 12:13:22 +00001321 params.encodings[i].codec_payload_type = 1;
1322 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1323 video_rtp_sender_->SetParameters(params).type());
1324 params = video_rtp_sender_->GetParameters();
1325
Florent Castelli892acf02018-10-01 22:47:20 +02001326 params.encodings[i].fec = RtpFecParameters();
1327 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1328 video_rtp_sender_->SetParameters(params).type());
1329 params = video_rtp_sender_->GetParameters();
1330
1331 params.encodings[i].rtx = RtpRtxParameters();
1332 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1333 video_rtp_sender_->SetParameters(params).type());
1334 params = video_rtp_sender_->GetParameters();
1335
1336 params.encodings[i].dtx = DtxStatus::ENABLED;
1337 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1338 video_rtp_sender_->SetParameters(params).type());
1339 params = video_rtp_sender_->GetParameters();
1340
1341 params.encodings[i].ptime = 1;
1342 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1343 video_rtp_sender_->SetParameters(params).type());
1344 params = video_rtp_sender_->GetParameters();
1345
Florent Castelli892acf02018-10-01 22:47:20 +02001346 params.encodings[i].dependency_rids.push_back("dummy_rid");
1347 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1348 video_rtp_sender_->SetParameters(params).type());
Amit Hilbuch619b2942019-02-26 15:55:19 -08001349 params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001350 }
1351
1352 DestroyVideoRtpSender();
1353}
1354
Seth Hampson2d2c8882018-05-16 16:02:32 -07001355// A video sender can have multiple simulcast layers, in which case it will
1356// contain multiple RtpEncodingParameters. This tests that if this is the case
1357// (simulcast), then we can't set the bitrate_priority, or max_bitrate_bps
1358// for any encodings besides at index 0, because these are both implemented
1359// "per-sender."
1360TEST_F(RtpSenderReceiverTest, VideoSenderCantSetPerSenderEncodingParameters) {
1361 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001362 CreateVideoRtpSenderWithSimulcast();
Seth Hampson2d2c8882018-05-16 16:02:32 -07001363 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001364 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Seth Hampson2d2c8882018-05-16 16:02:32 -07001365
1366 params.encodings[1].bitrate_priority = 2.0;
1367 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1368 video_rtp_sender_->SetParameters(params).type());
1369 params = video_rtp_sender_->GetParameters();
1370
Seth Hampson2d2c8882018-05-16 16:02:32 -07001371 DestroyVideoRtpSender();
1372}
1373
Florent Castelli892acf02018-10-01 22:47:20 +02001374TEST_F(RtpSenderReceiverTest, VideoSenderCantSetReadOnlyEncodingParameters) {
1375 // Add a simulcast specific send stream that contains 2 encoding parameters.
1376 CreateVideoRtpSenderWithSimulcast();
1377 RtpParameters params = video_rtp_sender_->GetParameters();
1378 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
1379
1380 for (size_t i = 0; i < params.encodings.size(); i++) {
1381 params.encodings[i].ssrc = 1337;
1382 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION,
1383 video_rtp_sender_->SetParameters(params).type());
1384 params = video_rtp_sender_->GetParameters();
1385 }
1386
1387 DestroyVideoRtpSender();
1388}
1389
Ă…sa Persson55659812018-06-18 17:51:32 +02001390TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrate) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001391 CreateVideoRtpSender();
1392
1393 EXPECT_EQ(-1, video_media_channel_->max_bps());
1394 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001395 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001396 EXPECT_FALSE(params.encodings[0].min_bitrate_bps);
deadbeefe702b302017-02-04 12:09:01 -08001397 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Ă…sa Persson55659812018-06-18 17:51:32 +02001398 params.encodings[0].min_bitrate_bps = 100;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001399 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -08001400 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001401
1402 // Read back the parameters and verify they have been changed.
1403 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001404 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001405 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001406 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001407
1408 // Verify that the video channel received the new parameters.
1409 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001410 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001411 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001412 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001413
1414 // Verify that the global bitrate limit has not been changed.
1415 EXPECT_EQ(-1, video_media_channel_->max_bps());
1416
1417 DestroyVideoRtpSender();
1418}
1419
Ă…sa Persson55659812018-06-18 17:51:32 +02001420TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrateSimulcast) {
1421 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001422 CreateVideoRtpSenderWithSimulcast();
Ă…sa Persson55659812018-06-18 17:51:32 +02001423
1424 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001425 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001426 params.encodings[0].min_bitrate_bps = 100;
1427 params.encodings[0].max_bitrate_bps = 1000;
1428 params.encodings[1].min_bitrate_bps = 200;
1429 params.encodings[1].max_bitrate_bps = 2000;
1430 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1431
1432 // Verify that the video channel received the new parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001433 params = video_media_channel_->GetRtpSendParameters(kVideoSsrcSimulcast);
1434 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001435 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
1436 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
1437 EXPECT_EQ(200, params.encodings[1].min_bitrate_bps);
1438 EXPECT_EQ(2000, params.encodings[1].max_bitrate_bps);
1439
1440 DestroyVideoRtpSender();
1441}
1442
Seth Hampson24722b32017-12-22 09:36:42 -08001443TEST_F(RtpSenderReceiverTest, SetVideoBitratePriority) {
1444 CreateVideoRtpSender();
1445
1446 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001447 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001448 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1449 params.encodings[0].bitrate_priority);
1450 double new_bitrate_priority = 2.0;
1451 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -08001452 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -08001453
1454 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001455 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001456 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1457
1458 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001459 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001460 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1461
1462 DestroyVideoRtpSender();
1463}
1464
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001465TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetParameters) {
1466 CreateAudioRtpReceiver();
1467
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001468 RtpParameters params = audio_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001469 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001470 EXPECT_TRUE(audio_rtp_receiver_->SetParameters(params));
1471
1472 DestroyAudioRtpReceiver();
1473}
1474
1475TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetParameters) {
1476 CreateVideoRtpReceiver();
1477
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001478 RtpParameters params = video_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001479 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001480 EXPECT_TRUE(video_rtp_receiver_->SetParameters(params));
1481
1482 DestroyVideoRtpReceiver();
1483}
1484
Florent Castelli38332cd2018-11-20 14:08:06 +01001485TEST_F(RtpSenderReceiverTest, VideoReceiverCanGetParametersWithSimulcast) {
1486 CreateVideoRtpReceiverWithSimulcast({}, 2);
1487
1488 RtpParameters params = video_rtp_receiver_->GetParameters();
1489 EXPECT_EQ(2u, params.encodings.size());
1490
1491 DestroyVideoRtpReceiver();
1492}
1493
pbos5214a0a2016-12-16 15:39:11 -08001494// Test that makes sure that a video track content hint translates to the proper
1495// value for sources that are not screencast.
1496TEST_F(RtpSenderReceiverTest, PropagatesVideoTrackContentHint) {
1497 CreateVideoRtpSender();
1498
1499 video_track_->set_enabled(true);
1500
1501 // |video_track_| is not screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001502 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001503 // No content hint should be set by default.
1504 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1505 video_track_->content_hint());
1506 // Setting detailed should turn a non-screencast source into screencast mode.
1507 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001508 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001509 // Removing the content hint should turn the track back into non-screencast
1510 // mode.
1511 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001512 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001513 // Setting fluid should remain in non-screencast mode (its default).
1514 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001515 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 08:53:10 +02001516 // Setting text should have the same effect as Detailed
1517 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
1518 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001519
1520 DestroyVideoRtpSender();
1521}
1522
1523// Test that makes sure that a video track content hint translates to the proper
1524// value for screencast sources.
1525TEST_F(RtpSenderReceiverTest,
1526 PropagatesVideoTrackContentHintForScreencastSource) {
1527 CreateVideoRtpSender(true);
1528
1529 video_track_->set_enabled(true);
1530
1531 // |video_track_| with a screencast source should be screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001532 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001533 // No content hint should be set by default.
1534 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1535 video_track_->content_hint());
1536 // Setting fluid should turn a screencast source into non-screencast mode.
1537 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001538 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001539 // Removing the content hint should turn the track back into screencast mode.
1540 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001541 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001542 // Setting detailed should still remain in screencast mode (its default).
1543 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001544 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 08:53:10 +02001545 // Setting text should have the same effect as Detailed
1546 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
1547 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001548
1549 DestroyVideoRtpSender();
1550}
1551
1552// Test that makes sure any content hints that are set on a track before
1553// VideoRtpSender is ready to send are still applied when it gets ready to send.
1554TEST_F(RtpSenderReceiverTest,
1555 PropagatesVideoTrackContentHintSetBeforeEnabling) {
1556 AddVideoTrack();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001557 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001558 std::make_unique<MockSetStreamsObserver>();
pbos5214a0a2016-12-16 15:39:11 -08001559 // Setting detailed overrides the default non-screencast mode. This should be
1560 // applied even if the track is set on construction.
1561 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001562 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1563 set_streams_observer.get());
Steve Anton111fdfd2018-06-25 13:03:36 -07001564 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001565 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1566 video_rtp_sender_->SetStreams({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -08001567 video_rtp_sender_->SetMediaChannel(video_media_channel_);
pbos5214a0a2016-12-16 15:39:11 -08001568 video_track_->set_enabled(true);
1569
1570 // Sender is not ready to send (no SSRC) so no option should have been set.
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001571 EXPECT_EQ(absl::nullopt, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001572
1573 // Verify that the content hint is accounted for when video_rtp_sender_ does
1574 // get enabled.
1575 video_rtp_sender_->SetSsrc(kVideoSsrc);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001576 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001577
1578 // And removing the hint should go back to false (to verify that false was
1579 // default correctly).
1580 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001581 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001582
1583 DestroyVideoRtpSender();
1584}
1585
deadbeef20cb0c12017-02-01 20:27:00 -08001586TEST_F(RtpSenderReceiverTest, AudioSenderHasDtmfSender) {
1587 CreateAudioRtpSender();
1588 EXPECT_NE(nullptr, audio_rtp_sender_->GetDtmfSender());
1589}
1590
1591TEST_F(RtpSenderReceiverTest, VideoSenderDoesNotHaveDtmfSender) {
1592 CreateVideoRtpSender();
1593 EXPECT_EQ(nullptr, video_rtp_sender_->GetDtmfSender());
1594}
1595
1596// Test that the DTMF sender is really using |voice_channel_|, and thus returns
1597// true/false from CanSendDtmf based on what |voice_channel_| returns.
1598TEST_F(RtpSenderReceiverTest, CanInsertDtmf) {
1599 AddDtmfCodec();
1600 CreateAudioRtpSender();
1601 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1602 ASSERT_NE(nullptr, dtmf_sender);
1603 EXPECT_TRUE(dtmf_sender->CanInsertDtmf());
1604}
1605
1606TEST_F(RtpSenderReceiverTest, CanNotInsertDtmf) {
1607 CreateAudioRtpSender();
1608 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1609 ASSERT_NE(nullptr, dtmf_sender);
1610 // DTMF codec has not been added, as it was in the above test.
1611 EXPECT_FALSE(dtmf_sender->CanInsertDtmf());
1612}
1613
1614TEST_F(RtpSenderReceiverTest, InsertDtmf) {
1615 AddDtmfCodec();
1616 CreateAudioRtpSender();
1617 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1618 ASSERT_NE(nullptr, dtmf_sender);
1619
1620 EXPECT_EQ(0U, voice_media_channel_->dtmf_info_queue().size());
1621
1622 // Insert DTMF
1623 const int expected_duration = 90;
1624 dtmf_sender->InsertDtmf("012", expected_duration, 100);
1625
1626 // Verify
1627 ASSERT_EQ_WAIT(3U, voice_media_channel_->dtmf_info_queue().size(),
1628 kDefaultTimeout);
1629 const uint32_t send_ssrc =
1630 voice_media_channel_->send_streams()[0].first_ssrc();
1631 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[0],
1632 send_ssrc, 0, expected_duration));
1633 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[1],
1634 send_ssrc, 1, expected_duration));
1635 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[2],
1636 send_ssrc, 2, expected_duration));
1637}
1638
1639// Make sure the signal from "GetOnDestroyedSignal()" fires when the sender is
1640// destroyed, which is needed for the DTMF sender.
1641TEST_F(RtpSenderReceiverTest, TestOnDestroyedSignal) {
1642 CreateAudioRtpSender();
1643 EXPECT_FALSE(audio_sender_destroyed_signal_fired_);
1644 audio_rtp_sender_ = nullptr;
1645 EXPECT_TRUE(audio_sender_destroyed_signal_fired_);
1646}
1647
Benjamin Wright84583f62018-10-04 14:22:34 -07001648// Validate that the default FrameEncryptor setting is nullptr.
1649TEST_F(RtpSenderReceiverTest, AudioSenderCanSetFrameEncryptor) {
1650 CreateAudioRtpSender();
1651 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1652 new FakeFrameEncryptor());
1653 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1654 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1655 EXPECT_EQ(fake_frame_encryptor.get(),
1656 audio_rtp_sender_->GetFrameEncryptor().get());
1657}
1658
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001659// Validate that setting a FrameEncryptor after the send stream is stopped does
1660// nothing.
1661TEST_F(RtpSenderReceiverTest, AudioSenderCannotSetFrameEncryptorAfterStop) {
1662 CreateAudioRtpSender();
1663 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1664 new FakeFrameEncryptor());
1665 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1666 audio_rtp_sender_->Stop();
1667 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1668 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1669}
1670
Benjamin Wright84583f62018-10-04 14:22:34 -07001671// Validate that the default FrameEncryptor setting is nullptr.
1672TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetFrameDecryptor) {
1673 CreateAudioRtpReceiver();
1674 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1675 new FakeFrameDecryptor());
1676 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
1677 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1678 EXPECT_EQ(fake_frame_decryptor.get(),
1679 audio_rtp_receiver_->GetFrameDecryptor().get());
1680}
1681
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001682// Validate that the default FrameEncryptor setting is nullptr.
1683TEST_F(RtpSenderReceiverTest, AudioReceiverCannotSetFrameDecryptorAfterStop) {
1684 CreateAudioRtpReceiver();
1685 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1686 new FakeFrameDecryptor());
1687 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
1688 audio_rtp_receiver_->Stop();
1689 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1690 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1691}
1692
1693// Validate that the default FrameEncryptor setting is nullptr.
1694TEST_F(RtpSenderReceiverTest, VideoSenderCanSetFrameEncryptor) {
1695 CreateVideoRtpSender();
1696 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1697 new FakeFrameEncryptor());
1698 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1699 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1700 EXPECT_EQ(fake_frame_encryptor.get(),
1701 video_rtp_sender_->GetFrameEncryptor().get());
1702}
1703
1704// Validate that setting a FrameEncryptor after the send stream is stopped does
1705// nothing.
1706TEST_F(RtpSenderReceiverTest, VideoSenderCannotSetFrameEncryptorAfterStop) {
1707 CreateVideoRtpSender();
1708 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1709 new FakeFrameEncryptor());
1710 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1711 video_rtp_sender_->Stop();
1712 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1713 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1714}
1715
1716// Validate that the default FrameEncryptor setting is nullptr.
1717TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetFrameDecryptor) {
1718 CreateVideoRtpReceiver();
1719 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1720 new FakeFrameDecryptor());
1721 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
1722 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1723 EXPECT_EQ(fake_frame_decryptor.get(),
1724 video_rtp_receiver_->GetFrameDecryptor().get());
1725}
1726
1727// Validate that the default FrameEncryptor setting is nullptr.
1728TEST_F(RtpSenderReceiverTest, VideoReceiverCannotSetFrameDecryptorAfterStop) {
1729 CreateVideoRtpReceiver();
1730 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1731 new FakeFrameDecryptor());
1732 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
1733 video_rtp_receiver_->Stop();
1734 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1735 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1736}
1737
Amit Hilbuch619b2942019-02-26 15:55:19 -08001738// Checks that calling the internal methods for get/set parameters do not
1739// invalidate any parameters retreived by clients.
1740TEST_F(RtpSenderReceiverTest,
1741 InternalParameterMethodsDoNotInvalidateTransaction) {
1742 CreateVideoRtpSender();
1743 RtpParameters parameters = video_rtp_sender_->GetParameters();
1744 RtpParameters new_parameters = video_rtp_sender_->GetParametersInternal();
1745 new_parameters.encodings[0].active = false;
1746 video_rtp_sender_->SetParametersInternal(new_parameters);
1747 new_parameters.encodings[0].active = true;
1748 video_rtp_sender_->SetParametersInternal(new_parameters);
1749 parameters.encodings[0].active = false;
1750 EXPECT_TRUE(video_rtp_sender_->SetParameters(parameters).ok());
1751}
1752
Amit Hilbuch2297d332019-02-19 12:49:22 -08001753// Helper method for syntactic sugar for accepting a vector with '{}' notation.
1754std::pair<RidList, RidList> CreatePairOfRidVectors(
1755 const std::vector<std::string>& first,
1756 const std::vector<std::string>& second) {
1757 return std::make_pair(first, second);
1758}
1759
1760// These parameters are used to test disabling simulcast layers.
1761const std::pair<RidList, RidList> kDisableSimulcastLayersParameters[] = {
1762 // Tests removing the first layer. This is a special case because
1763 // the first layer's SSRC is also the 'primary' SSRC used to associate the
1764 // parameters to the media channel.
1765 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"1"}),
1766 // Tests removing some layers.
1767 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"2", "4"}),
1768 // Tests simulcast rejected scenario all layers except first are rejected.
1769 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"2", "3", "4"}),
1770 // Tests removing all layers.
1771 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"1", "2", "3", "4"}),
1772};
1773
1774// Runs test for disabling layers on a sender without a media engine set.
1775TEST_P(RtpSenderReceiverTest, DisableSimulcastLayersWithoutMediaEngine) {
1776 auto parameter = GetParam();
1777 RunDisableSimulcastLayersWithoutMediaEngineTest(parameter.first,
1778 parameter.second);
1779}
1780
1781// Runs test for disabling layers on a sender with a media engine set.
1782TEST_P(RtpSenderReceiverTest, DisableSimulcastLayersWithMediaEngine) {
1783 auto parameter = GetParam();
1784 RunDisableSimulcastLayersWithMediaEngineTest(parameter.first,
1785 parameter.second);
1786}
1787
1788INSTANTIATE_TEST_SUITE_P(
1789 DisableSimulcastLayersInSender,
1790 RtpSenderReceiverTest,
1791 ::testing::ValuesIn(kDisableSimulcastLayersParameters));
1792
deadbeef70ab1a12015-09-28 16:53:55 -07001793} // namespace webrtc