blob: 364e87a89f36e9e5146e5b359b8bc006b420049b [file] [log] [blame]
deadbeef70ab1a12015-09-28 16:53:55 -07001/*
kjellanderb24317b2016-02-10 07:54:43 -08002 * Copyright 2012 The WebRTC project authors. All Rights Reserved.
deadbeef70ab1a12015-09-28 16:53:55 -07003 *
kjellanderb24317b2016-02-10 07:54:43 -08004 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
deadbeef70ab1a12015-09-28 16:53:55 -07009 */
10
Yves Gerey3e707812018-11-28 16:47:49 +010011#include <stddef.h>
Jonas Olssona4d87372019-07-05 19:08:33 +020012
Yves Gerey3e707812018-11-28 16:47:49 +010013#include <cstdint>
kwibergd1fe2812016-04-27 06:47:29 -070014#include <memory>
deadbeef70ab1a12015-09-28 16:53:55 -070015#include <string>
Tommif888bb52015-12-12 01:37:01 +010016#include <utility>
Yves Gerey3e707812018-11-28 16:47:49 +010017#include <vector>
deadbeef70ab1a12015-09-28 16:53:55 -070018
Amit Hilbuch2297d332019-02-19 12:49:22 -080019#include "absl/algorithm/container.h"
Yves Gerey3e707812018-11-28 16:47:49 +010020#include "absl/memory/memory.h"
21#include "absl/types/optional.h"
22#include "api/audio_options.h"
Steve Anton10542f22019-01-11 09:11:00 -080023#include "api/crypto/crypto_options.h"
24#include "api/crypto/frame_decryptor_interface.h"
25#include "api/crypto/frame_encryptor_interface.h"
26#include "api/dtmf_sender_interface.h"
27#include "api/media_stream_interface.h"
28#include "api/rtc_error.h"
Danil Chapovalov83bbe912019-08-07 12:24:53 +020029#include "api/rtc_event_log/rtc_event_log.h"
Steve Anton10542f22019-01-11 09:11:00 -080030#include "api/rtp_parameters.h"
Mirko Bonadeid9708072019-01-25 20:26:48 +010031#include "api/scoped_refptr.h"
Benjamin Wright84583f62018-10-04 14:22:34 -070032#include "api/test/fake_frame_decryptor.h"
33#include "api/test/fake_frame_encryptor.h"
Jonas Orelanda3aa9bd2019-04-17 07:38:40 +020034#include "api/video/builtin_video_bitrate_allocator_factory.h"
Yves Gerey3e707812018-11-28 16:47:49 +010035#include "media/base/codec.h"
Steve Anton10542f22019-01-11 09:11:00 -080036#include "media/base/fake_media_engine.h"
37#include "media/base/media_channel.h"
38#include "media/base/media_config.h"
39#include "media/base/media_engine.h"
40#include "media/base/rtp_data_engine.h"
41#include "media/base/stream_params.h"
42#include "media/base/test_utils.h"
43#include "media/engine/fake_webrtc_call.h"
44#include "p2p/base/dtls_transport_internal.h"
45#include "p2p/base/fake_dtls_transport.h"
46#include "p2p/base/p2p_constants.h"
Ruslan Burakov501bfba2019-02-11 10:29:19 +010047#include "pc/audio_rtp_receiver.h"
Steve Anton10542f22019-01-11 09:11:00 -080048#include "pc/audio_track.h"
Yves Gerey3e707812018-11-28 16:47:49 +010049#include "pc/channel.h"
Steve Anton10542f22019-01-11 09:11:00 -080050#include "pc/channel_manager.h"
51#include "pc/dtls_srtp_transport.h"
52#include "pc/local_audio_source.h"
53#include "pc/media_stream.h"
Ruslan Burakov7ea46052019-02-16 02:07:05 +010054#include "pc/remote_audio_source.h"
Steve Anton10542f22019-01-11 09:11:00 -080055#include "pc/rtp_receiver.h"
56#include "pc/rtp_sender.h"
57#include "pc/rtp_transport_internal.h"
58#include "pc/test/fake_video_track_source.h"
Ruslan Burakov501bfba2019-02-11 10:29:19 +010059#include "pc/video_rtp_receiver.h"
Steve Anton10542f22019-01-11 09:11:00 -080060#include "pc/video_track.h"
Yves Gerey3e707812018-11-28 16:47:49 +010061#include "rtc_base/checks.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020062#include "rtc_base/gunit.h"
Yves Gerey3e707812018-11-28 16:47:49 +010063#include "rtc_base/third_party/sigslot/sigslot.h"
64#include "rtc_base/thread.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020065#include "test/gmock.h"
66#include "test/gtest.h"
deadbeef70ab1a12015-09-28 16:53:55 -070067
68using ::testing::_;
Amit Hilbuch2297d332019-02-19 12:49:22 -080069using ::testing::ContainerEq;
deadbeef70ab1a12015-09-28 16:53:55 -070070using ::testing::Exactly;
deadbeef5dd42fd2016-05-02 16:20:01 -070071using ::testing::InvokeWithoutArgs;
skvladdc1c62c2016-03-16 19:07:43 -070072using ::testing::Return;
Amit Hilbuch2297d332019-02-19 12:49:22 -080073using RidList = std::vector<std::string>;
deadbeef70ab1a12015-09-28 16:53:55 -070074
deadbeef20cb0c12017-02-01 20:27:00 -080075namespace {
76
Seth Hampson845e8782018-03-02 11:34:10 -080077static const char kStreamId1[] = "local_stream_1";
deadbeef70ab1a12015-09-28 16:53:55 -070078static const char kVideoTrackId[] = "video_1";
79static const char kAudioTrackId[] = "audio_1";
Peter Boström0c4e06b2015-10-07 12:23:21 +020080static const uint32_t kVideoSsrc = 98;
deadbeeffac06552015-11-25 11:26:01 -080081static const uint32_t kVideoSsrc2 = 100;
Peter Boström0c4e06b2015-10-07 12:23:21 +020082static const uint32_t kAudioSsrc = 99;
deadbeeffac06552015-11-25 11:26:01 -080083static const uint32_t kAudioSsrc2 = 101;
Florent Castelli892acf02018-10-01 22:47:20 +020084static const uint32_t kVideoSsrcSimulcast = 102;
85static const uint32_t kVideoSimulcastLayerCount = 2;
deadbeef20cb0c12017-02-01 20:27:00 -080086static const int kDefaultTimeout = 10000; // 10 seconds.
Guido Urdaneta1ff16c82019-05-20 19:31:53 +020087
88class MockSetStreamsObserver
89 : public webrtc::RtpSenderBase::SetStreamsObserver {
90 public:
Danil Chapovalov3a353122020-05-15 11:16:53 +020091 MOCK_METHOD(void, OnSetStreams, (), (override));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +020092};
93
deadbeef20cb0c12017-02-01 20:27:00 -080094} // namespace
deadbeef70ab1a12015-09-28 16:53:55 -070095
96namespace webrtc {
97
Amit Hilbuch2297d332019-02-19 12:49:22 -080098class RtpSenderReceiverTest
Mirko Bonadei6a489f22019-04-09 15:11:12 +020099 : public ::testing::Test,
100 public ::testing::WithParamInterface<std::pair<RidList, RidList>>,
Amit Hilbuch2297d332019-02-19 12:49:22 -0800101 public sigslot::has_slots<> {
tkchin3784b4a2016-06-24 19:31:47 -0700102 public:
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700103 RtpSenderReceiverTest()
Steve Anton47136dd2018-01-12 10:49:35 -0800104 : network_thread_(rtc::Thread::Current()),
105 worker_thread_(rtc::Thread::Current()),
Jonas Orelanda3aa9bd2019-04-17 07:38:40 +0200106 video_bitrate_allocator_factory_(
107 webrtc::CreateBuiltinVideoBitrateAllocatorFactory()),
Steve Anton47136dd2018-01-12 10:49:35 -0800108 // Create fake media engine/etc. so we can create channels to use to
109 // test RtpSenders/RtpReceivers.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700110 media_engine_(new cricket::FakeMediaEngine()),
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(),
Niels Möller2a707032020-06-16 16:39:13 +0200126 rtc::Thread::Current(), cricket::CN_AUDIO, srtp_required,
127 webrtc::CryptoOptions(), &ssrc_generator_, cricket::AudioOptions());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700128 video_channel_ = channel_manager_.CreateVideoChannel(
Zhi Huange830e682018-03-30 10:48:35 -0700129 &fake_call_, cricket::MediaConfig(), rtp_transport_.get(),
Niels Möller2a707032020-06-16 16:39:13 +0200130 rtc::Thread::Current(), cricket::CN_VIDEO, srtp_required,
131 webrtc::CryptoOptions(), &ssrc_generator_, cricket::VideoOptions(),
132 video_bitrate_allocator_factory_.get());
deadbeef20cb0c12017-02-01 20:27:00 -0800133 voice_channel_->Enable(true);
134 video_channel_->Enable(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700135 voice_media_channel_ = media_engine_->GetVoiceChannel(0);
136 video_media_channel_ = media_engine_->GetVideoChannel(0);
137 RTC_CHECK(voice_channel_);
138 RTC_CHECK(video_channel_);
139 RTC_CHECK(voice_media_channel_);
140 RTC_CHECK(video_media_channel_);
141
142 // Create streams for predefined SSRCs. Streams need to exist in order
143 // for the senders and receievers to apply parameters to them.
144 // Normally these would be created by SetLocalDescription and
145 // SetRemoteDescription.
146 voice_media_channel_->AddSendStream(
147 cricket::StreamParams::CreateLegacy(kAudioSsrc));
148 voice_media_channel_->AddRecvStream(
149 cricket::StreamParams::CreateLegacy(kAudioSsrc));
150 voice_media_channel_->AddSendStream(
151 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
152 voice_media_channel_->AddRecvStream(
153 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
154 video_media_channel_->AddSendStream(
155 cricket::StreamParams::CreateLegacy(kVideoSsrc));
156 video_media_channel_->AddRecvStream(
157 cricket::StreamParams::CreateLegacy(kVideoSsrc));
158 video_media_channel_->AddSendStream(
159 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
160 video_media_channel_->AddRecvStream(
161 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
tkchin3784b4a2016-06-24 19:31:47 -0700162 }
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700163
Zhi Huange830e682018-03-30 10:48:35 -0700164 std::unique_ptr<webrtc::RtpTransportInternal> CreateDtlsSrtpTransport() {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200165 auto dtls_srtp_transport = std::make_unique<webrtc::DtlsSrtpTransport>(
Karl Wiberg918f50c2018-07-05 11:40:33 +0200166 /*rtcp_mux_required=*/true);
Zhi Huange830e682018-03-30 10:48:35 -0700167 dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport_.get(),
168 /*rtcp_dtls_transport=*/nullptr);
169 return dtls_srtp_transport;
170 }
171
deadbeef20cb0c12017-02-01 20:27:00 -0800172 // Needed to use DTMF sender.
173 void AddDtmfCodec() {
174 cricket::AudioSendParameters params;
175 const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000,
176 0, 1);
177 params.codecs.push_back(kTelephoneEventCodec);
178 voice_media_channel_->SetSendParameters(params);
179 }
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700180
pbos5214a0a2016-12-16 15:39:11 -0800181 void AddVideoTrack() { AddVideoTrack(false); }
182
183 void AddVideoTrack(bool is_screencast) {
perkja3ede6c2016-03-08 01:27:48 +0100184 rtc::scoped_refptr<VideoTrackSourceInterface> source(
pbos5214a0a2016-12-16 15:39:11 -0800185 FakeVideoTrackSource::Create(is_screencast));
perkj773be362017-07-31 23:22:01 -0700186 video_track_ =
187 VideoTrack::Create(kVideoTrackId, source, rtc::Thread::Current());
deadbeefe814a0d2017-02-25 18:15:09 -0800188 EXPECT_TRUE(local_stream_->AddTrack(video_track_));
deadbeef70ab1a12015-09-28 16:53:55 -0700189 }
190
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700191 void CreateAudioRtpSender() { CreateAudioRtpSender(nullptr); }
192
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +0100193 void CreateAudioRtpSender(
194 const rtc::scoped_refptr<LocalAudioSource>& source) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700195 audio_track_ = AudioTrack::Create(kAudioTrackId, source);
deadbeefe814a0d2017-02-25 18:15:09 -0800196 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200197 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200198 std::make_unique<MockSetStreamsObserver>();
Steve Anton47136dd2018-01-12 10:49:35 -0800199 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200200 AudioRtpSender::Create(worker_thread_, audio_track_->id(), nullptr,
201 set_streams_observer.get());
Steve Anton111fdfd2018-06-25 13:03:36 -0700202 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200203 EXPECT_CALL(*set_streams_observer, OnSetStreams());
204 audio_rtp_sender_->SetStreams({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800205 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
deadbeeffac06552015-11-25 11:26:01 -0800206 audio_rtp_sender_->SetSsrc(kAudioSsrc);
deadbeef20cb0c12017-02-01 20:27:00 -0800207 audio_rtp_sender_->GetOnDestroyedSignal()->connect(
208 this, &RtpSenderReceiverTest::OnAudioSenderDestroyed);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700209 VerifyVoiceChannelInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700210 }
211
Steve Anton02ee47c2018-01-10 16:26:06 -0800212 void CreateAudioRtpSenderWithNoTrack() {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800213 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200214 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800215 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
Steve Anton02ee47c2018-01-10 16:26:06 -0800216 }
217
deadbeef20cb0c12017-02-01 20:27:00 -0800218 void OnAudioSenderDestroyed() { audio_sender_destroyed_signal_fired_ = true; }
219
Seth Hampson2d2c8882018-05-16 16:02:32 -0700220 void CreateVideoRtpSender(uint32_t ssrc) {
221 CreateVideoRtpSender(false, ssrc);
222 }
223
pbos5214a0a2016-12-16 15:39:11 -0800224 void CreateVideoRtpSender() { CreateVideoRtpSender(false); }
225
Amit Hilbuch2297d332019-02-19 12:49:22 -0800226 cricket::StreamParams CreateSimulcastStreamParams(int num_layers) {
Florent Castelli892acf02018-10-01 22:47:20 +0200227 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +0100228 ssrcs.reserve(num_layers);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800229 for (int i = 0; i < num_layers; ++i) {
Florent Castelli892acf02018-10-01 22:47:20 +0200230 ssrcs.push_back(kVideoSsrcSimulcast + i);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800231 }
232 return cricket::CreateSimStreamParams("cname", ssrcs);
233 }
234
235 uint32_t CreateVideoRtpSender(const cricket::StreamParams& stream_params) {
Florent Castelli892acf02018-10-01 22:47:20 +0200236 video_media_channel_->AddSendStream(stream_params);
237 uint32_t primary_ssrc = stream_params.first_ssrc();
238 CreateVideoRtpSender(primary_ssrc);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800239 return primary_ssrc;
240 }
241
242 uint32_t CreateVideoRtpSenderWithSimulcast(
243 int num_layers = kVideoSimulcastLayerCount) {
244 return CreateVideoRtpSender(CreateSimulcastStreamParams(num_layers));
245 }
246
247 uint32_t CreateVideoRtpSenderWithSimulcast(
248 const std::vector<std::string>& rids) {
249 cricket::StreamParams stream_params =
250 CreateSimulcastStreamParams(rids.size());
251 std::vector<cricket::RidDescription> rid_descriptions;
252 absl::c_transform(
253 rids, std::back_inserter(rid_descriptions), [](const std::string& rid) {
254 return cricket::RidDescription(rid, cricket::RidDirection::kSend);
255 });
256 stream_params.set_rids(rid_descriptions);
257 return CreateVideoRtpSender(stream_params);
Florent Castelli892acf02018-10-01 22:47:20 +0200258 }
259
Seth Hampson2d2c8882018-05-16 16:02:32 -0700260 void CreateVideoRtpSender(bool is_screencast, uint32_t ssrc = kVideoSsrc) {
pbos5214a0a2016-12-16 15:39:11 -0800261 AddVideoTrack(is_screencast);
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200262 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200263 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200264 video_rtp_sender_ = VideoRtpSender::Create(
265 worker_thread_, video_track_->id(), set_streams_observer.get());
Steve Anton111fdfd2018-06-25 13:03:36 -0700266 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200267 EXPECT_CALL(*set_streams_observer, OnSetStreams());
268 video_rtp_sender_->SetStreams({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800269 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Seth Hampson2d2c8882018-05-16 16:02:32 -0700270 video_rtp_sender_->SetSsrc(ssrc);
271 VerifyVideoChannelInput(ssrc);
deadbeef70ab1a12015-09-28 16:53:55 -0700272 }
Steve Anton02ee47c2018-01-10 16:26:06 -0800273 void CreateVideoRtpSenderWithNoTrack() {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200274 video_rtp_sender_ =
275 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800276 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Steve Anton02ee47c2018-01-10 16:26:06 -0800277 }
278
deadbeef70ab1a12015-09-28 16:53:55 -0700279 void DestroyAudioRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700280 audio_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700281 VerifyVoiceChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700282 }
283
284 void DestroyVideoRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700285 video_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700286 VerifyVideoChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700287 }
288
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100289 void CreateAudioRtpReceiver(
290 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
Mirko Bonadei05cf6be2019-01-31 21:38:12 +0100291 audio_rtp_receiver_ =
292 new AudioRtpReceiver(rtc::Thread::Current(), kAudioTrackId, streams);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800293 audio_rtp_receiver_->SetMediaChannel(voice_media_channel_);
Steve Antond3679212018-01-17 17:41:02 -0800294 audio_rtp_receiver_->SetupMediaChannel(kAudioSsrc);
perkjd61bf802016-03-24 03:16:19 -0700295 audio_track_ = audio_rtp_receiver_->audio_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700296 VerifyVoiceChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700297 }
298
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100299 void CreateVideoRtpReceiver(
300 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
Mirko Bonadei05cf6be2019-01-31 21:38:12 +0100301 video_rtp_receiver_ =
302 new VideoRtpReceiver(rtc::Thread::Current(), kVideoTrackId, streams);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800303 video_rtp_receiver_->SetMediaChannel(video_media_channel_);
Steve Antond3679212018-01-17 17:41:02 -0800304 video_rtp_receiver_->SetupMediaChannel(kVideoSsrc);
perkjf0dcfe22016-03-10 18:32:00 +0100305 video_track_ = video_rtp_receiver_->video_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700306 VerifyVideoChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700307 }
308
Florent Castelli38332cd2018-11-20 14:08:06 +0100309 void CreateVideoRtpReceiverWithSimulcast(
310 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {},
311 int num_layers = kVideoSimulcastLayerCount) {
312 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +0100313 ssrcs.reserve(num_layers);
Florent Castelli38332cd2018-11-20 14:08:06 +0100314 for (int i = 0; i < num_layers; ++i)
315 ssrcs.push_back(kVideoSsrcSimulcast + i);
316 cricket::StreamParams stream_params =
317 cricket::CreateSimStreamParams("cname", ssrcs);
318 video_media_channel_->AddRecvStream(stream_params);
319 uint32_t primary_ssrc = stream_params.first_ssrc();
320
Mirko Bonadei05cf6be2019-01-31 21:38:12 +0100321 video_rtp_receiver_ =
322 new VideoRtpReceiver(rtc::Thread::Current(), kVideoTrackId, streams);
Florent Castelli38332cd2018-11-20 14:08:06 +0100323 video_rtp_receiver_->SetMediaChannel(video_media_channel_);
324 video_rtp_receiver_->SetupMediaChannel(primary_ssrc);
325 video_track_ = video_rtp_receiver_->video_track();
326 }
327
deadbeef70ab1a12015-09-28 16:53:55 -0700328 void DestroyAudioRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700329 audio_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700330 VerifyVoiceChannelNoOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700331 }
332
333 void DestroyVideoRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700334 video_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700335 VerifyVideoChannelNoOutput();
336 }
337
338 void VerifyVoiceChannelInput() { VerifyVoiceChannelInput(kAudioSsrc); }
339
340 void VerifyVoiceChannelInput(uint32_t ssrc) {
341 // Verify that the media channel has an audio source, and the stream isn't
342 // muted.
343 EXPECT_TRUE(voice_media_channel_->HasSource(ssrc));
344 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(ssrc));
345 }
346
347 void VerifyVideoChannelInput() { VerifyVideoChannelInput(kVideoSsrc); }
348
349 void VerifyVideoChannelInput(uint32_t ssrc) {
350 // Verify that the media channel has a video source,
351 EXPECT_TRUE(video_media_channel_->HasSource(ssrc));
352 }
353
354 void VerifyVoiceChannelNoInput() { VerifyVoiceChannelNoInput(kAudioSsrc); }
355
356 void VerifyVoiceChannelNoInput(uint32_t ssrc) {
357 // Verify that the media channel's source is reset.
358 EXPECT_FALSE(voice_media_channel_->HasSource(ssrc));
359 }
360
361 void VerifyVideoChannelNoInput() { VerifyVideoChannelNoInput(kVideoSsrc); }
362
363 void VerifyVideoChannelNoInput(uint32_t ssrc) {
364 // Verify that the media channel's source is reset.
365 EXPECT_FALSE(video_media_channel_->HasSource(ssrc));
366 }
367
368 void VerifyVoiceChannelOutput() {
369 // Verify that the volume is initialized to 1.
370 double volume;
371 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
372 EXPECT_EQ(1, volume);
373 }
374
375 void VerifyVideoChannelOutput() {
376 // Verify that the media channel has a sink.
377 EXPECT_TRUE(video_media_channel_->HasSink(kVideoSsrc));
378 }
379
380 void VerifyVoiceChannelNoOutput() {
381 // Verify that the volume is reset to 0.
382 double volume;
383 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
384 EXPECT_EQ(0, volume);
385 }
386
387 void VerifyVideoChannelNoOutput() {
388 // Verify that the media channel's sink is reset.
389 EXPECT_FALSE(video_media_channel_->HasSink(kVideoSsrc));
deadbeef70ab1a12015-09-28 16:53:55 -0700390 }
391
Amit Hilbuch2297d332019-02-19 12:49:22 -0800392 // Verifies that the encoding layers contain the specified RIDs.
393 bool VerifyEncodingLayers(const VideoRtpSender& sender,
394 const std::vector<std::string>& rids) {
395 bool has_failure = HasFailure();
396 RtpParameters parameters = sender.GetParameters();
397 std::vector<std::string> encoding_rids;
398 absl::c_transform(
399 parameters.encodings, std::back_inserter(encoding_rids),
400 [](const RtpEncodingParameters& encoding) { return encoding.rid; });
401 EXPECT_THAT(rids, ContainerEq(encoding_rids));
402 return has_failure || !HasFailure();
403 }
404
405 // Runs a test for disabling the encoding layers on the specified sender.
406 void RunDisableEncodingLayersTest(
407 const std::vector<std::string>& all_layers,
408 const std::vector<std::string>& disabled_layers,
409 VideoRtpSender* sender) {
410 std::vector<std::string> expected;
411 absl::c_copy_if(all_layers, std::back_inserter(expected),
412 [&disabled_layers](const std::string& rid) {
413 return !absl::c_linear_search(disabled_layers, rid);
414 });
415
416 EXPECT_TRUE(VerifyEncodingLayers(*sender, all_layers));
417 sender->DisableEncodingLayers(disabled_layers);
418 EXPECT_TRUE(VerifyEncodingLayers(*sender, expected));
419 }
420
421 // Runs a test for setting an encoding layer as inactive.
422 // This test assumes that some layers have already been disabled.
423 void RunSetLastLayerAsInactiveTest(VideoRtpSender* sender) {
424 auto parameters = sender->GetParameters();
425 if (parameters.encodings.size() == 0) {
426 return;
427 }
428
429 RtpEncodingParameters& encoding = parameters.encodings.back();
430 auto rid = encoding.rid;
431 EXPECT_TRUE(encoding.active);
432 encoding.active = false;
433 auto error = sender->SetParameters(parameters);
434 ASSERT_TRUE(error.ok());
435 parameters = sender->GetParameters();
436 RtpEncodingParameters& result_encoding = parameters.encodings.back();
437 EXPECT_EQ(rid, result_encoding.rid);
438 EXPECT_FALSE(result_encoding.active);
439 }
440
441 // Runs a test for disabling the encoding layers on a sender without a media
442 // channel.
443 void RunDisableSimulcastLayersWithoutMediaEngineTest(
444 const std::vector<std::string>& all_layers,
445 const std::vector<std::string>& disabled_layers) {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200446 auto sender = VideoRtpSender::Create(rtc::Thread::Current(), "1", nullptr);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800447 RtpParameters parameters;
448 parameters.encodings.resize(all_layers.size());
449 for (size_t i = 0; i < all_layers.size(); ++i) {
450 parameters.encodings[i].rid = all_layers[i];
451 }
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800452 sender->set_init_send_encodings(parameters.encodings);
453 RunDisableEncodingLayersTest(all_layers, disabled_layers, sender.get());
454 RunSetLastLayerAsInactiveTest(sender.get());
Amit Hilbuch2297d332019-02-19 12:49:22 -0800455 }
456
457 // Runs a test for disabling the encoding layers on a sender with a media
458 // channel.
459 void RunDisableSimulcastLayersWithMediaEngineTest(
460 const std::vector<std::string>& all_layers,
461 const std::vector<std::string>& disabled_layers) {
462 uint32_t ssrc = CreateVideoRtpSenderWithSimulcast(all_layers);
463 RunDisableEncodingLayersTest(all_layers, disabled_layers,
464 video_rtp_sender_.get());
465
466 auto channel_parameters = video_media_channel_->GetRtpSendParameters(ssrc);
467 ASSERT_EQ(channel_parameters.encodings.size(), all_layers.size());
468 for (size_t i = 0; i < all_layers.size(); ++i) {
469 EXPECT_EQ(all_layers[i], channel_parameters.encodings[i].rid);
470 bool is_active = !absl::c_linear_search(disabled_layers, all_layers[i]);
471 EXPECT_EQ(is_active, channel_parameters.encodings[i].active);
472 }
473
474 RunSetLastLayerAsInactiveTest(video_rtp_sender_.get());
475 }
476
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200477 // Check that minimum Jitter Buffer delay is propagated to the underlying
478 // |media_channel|.
479 void VerifyRtpReceiverDelayBehaviour(cricket::Delayable* media_channel,
480 RtpReceiverInterface* receiver,
481 uint32_t ssrc) {
482 receiver->SetJitterBufferMinimumDelay(/*delay_seconds=*/0.5);
483 absl::optional<int> delay_ms =
484 media_channel->GetBaseMinimumPlayoutDelayMs(ssrc); // In milliseconds.
485 EXPECT_DOUBLE_EQ(0.5, delay_ms.value_or(0) / 1000.0);
486 }
487
deadbeef70ab1a12015-09-28 16:53:55 -0700488 protected:
Steve Anton47136dd2018-01-12 10:49:35 -0800489 rtc::Thread* const network_thread_;
490 rtc::Thread* const worker_thread_;
Danil Chapovalov83bbe912019-08-07 12:24:53 +0200491 webrtc::RtcEventLogNull event_log_;
Zhi Huange830e682018-03-30 10:48:35 -0700492 // The |rtp_dtls_transport_| and |rtp_transport_| should be destroyed after
493 // the |channel_manager|.
494 std::unique_ptr<cricket::DtlsTransportInternal> rtp_dtls_transport_;
495 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport_;
Jonas Orelanda3aa9bd2019-04-17 07:38:40 +0200496 std::unique_ptr<webrtc::VideoBitrateAllocatorFactory>
497 video_bitrate_allocator_factory_;
deadbeef112b2e92017-02-10 20:13:37 -0800498 // |media_engine_| is actually owned by |channel_manager_|.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700499 cricket::FakeMediaEngine* media_engine_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700500 cricket::ChannelManager channel_manager_;
501 cricket::FakeCall fake_call_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700502 cricket::VoiceChannel* voice_channel_;
503 cricket::VideoChannel* video_channel_;
504 cricket::FakeVoiceMediaChannel* voice_media_channel_;
505 cricket::FakeVideoMediaChannel* video_media_channel_;
deadbeef70ab1a12015-09-28 16:53:55 -0700506 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
507 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
508 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
509 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
deadbeefe814a0d2017-02-25 18:15:09 -0800510 rtc::scoped_refptr<MediaStreamInterface> local_stream_;
deadbeef70ab1a12015-09-28 16:53:55 -0700511 rtc::scoped_refptr<VideoTrackInterface> video_track_;
512 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
deadbeef20cb0c12017-02-01 20:27:00 -0800513 bool audio_sender_destroyed_signal_fired_ = false;
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800514 rtc::UniqueRandomIdGenerator ssrc_generator_;
deadbeef70ab1a12015-09-28 16:53:55 -0700515};
516
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700517// Test that |voice_channel_| is updated when an audio track is associated
deadbeef70ab1a12015-09-28 16:53:55 -0700518// and disassociated with an AudioRtpSender.
519TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
520 CreateAudioRtpSender();
521 DestroyAudioRtpSender();
522}
523
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700524// Test that |video_channel_| is updated when a video track is associated and
deadbeef70ab1a12015-09-28 16:53:55 -0700525// disassociated with a VideoRtpSender.
526TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
527 CreateVideoRtpSender();
528 DestroyVideoRtpSender();
529}
530
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700531// Test that |voice_channel_| is updated when a remote audio track is
deadbeef70ab1a12015-09-28 16:53:55 -0700532// associated and disassociated with an AudioRtpReceiver.
533TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
534 CreateAudioRtpReceiver();
535 DestroyAudioRtpReceiver();
536}
537
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700538// Test that |video_channel_| is updated when a remote video track is
539// associated and disassociated with a VideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700540TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
541 CreateVideoRtpReceiver();
542 DestroyVideoRtpReceiver();
543}
544
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100545TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiverWithStreams) {
546 CreateAudioRtpReceiver({local_stream_});
547 DestroyAudioRtpReceiver();
548}
549
550TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiverWithStreams) {
551 CreateVideoRtpReceiver({local_stream_});
552 DestroyVideoRtpReceiver();
553}
554
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700555// Test that the AudioRtpSender applies options from the local audio source.
556TEST_F(RtpSenderReceiverTest, LocalAudioSourceOptionsApplied) {
557 cricket::AudioOptions options;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100558 options.echo_cancellation = true;
deadbeef757146b2017-02-10 21:26:48 -0800559 auto source = LocalAudioSource::Create(&options);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700560 CreateAudioRtpSender(source.get());
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700561
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100562 EXPECT_EQ(true, voice_media_channel_->options().echo_cancellation);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700563
564 DestroyAudioRtpSender();
565}
566
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700567// Test that the stream is muted when the track is disabled, and unmuted when
568// the track is enabled.
569TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) {
570 CreateAudioRtpSender();
571
572 audio_track_->set_enabled(false);
573 EXPECT_TRUE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
574
575 audio_track_->set_enabled(true);
576 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
577
578 DestroyAudioRtpSender();
579}
580
581// Test that the volume is set to 0 when the track is disabled, and back to
582// 1 when the track is enabled.
deadbeef70ab1a12015-09-28 16:53:55 -0700583TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
584 CreateAudioRtpReceiver();
585
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700586 double volume;
587 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
588 EXPECT_EQ(1, volume);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700589
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700590 audio_track_->set_enabled(false);
591 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
592 EXPECT_EQ(0, volume);
593
deadbeef70ab1a12015-09-28 16:53:55 -0700594 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700595 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
596 EXPECT_EQ(1, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700597
598 DestroyAudioRtpReceiver();
599}
600
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700601// Currently no action is taken when a remote video track is disabled or
602// enabled, so there's nothing to test here, other than what is normally
603// verified in DestroyVideoRtpSender.
deadbeef70ab1a12015-09-28 16:53:55 -0700604TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
605 CreateVideoRtpSender();
606
deadbeef70ab1a12015-09-28 16:53:55 -0700607 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700608 video_track_->set_enabled(true);
609
610 DestroyVideoRtpSender();
611}
612
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700613// Test that the state of the video track created by the VideoRtpReceiver is
614// updated when the receiver is destroyed.
perkjf0dcfe22016-03-10 18:32:00 +0100615TEST_F(RtpSenderReceiverTest, RemoteVideoTrackState) {
616 CreateVideoRtpReceiver();
617
618 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track_->state());
619 EXPECT_EQ(webrtc::MediaSourceInterface::kLive,
620 video_track_->GetSource()->state());
621
622 DestroyVideoRtpReceiver();
623
624 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track_->state());
625 EXPECT_EQ(webrtc::MediaSourceInterface::kEnded,
626 video_track_->GetSource()->state());
627}
628
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700629// Currently no action is taken when a remote video track is disabled or
630// enabled, so there's nothing to test here, other than what is normally
631// verified in DestroyVideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700632TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
633 CreateVideoRtpReceiver();
634
635 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700636 video_track_->set_enabled(true);
637
638 DestroyVideoRtpReceiver();
639}
640
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700641// Test that the AudioRtpReceiver applies volume changes from the track source
642// to the media channel.
deadbeef70ab1a12015-09-28 16:53:55 -0700643TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
644 CreateAudioRtpReceiver();
645
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700646 double volume;
647 audio_track_->GetSource()->SetVolume(0.5);
648 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
649 EXPECT_EQ(0.5, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700650
651 // Disable the audio track, this should prevent setting the volume.
deadbeef70ab1a12015-09-28 16:53:55 -0700652 audio_track_->set_enabled(false);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700653 audio_track_->GetSource()->SetVolume(0.8);
654 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
655 EXPECT_EQ(0, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700656
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700657 // When the track is enabled, the previously set volume should take effect.
deadbeef70ab1a12015-09-28 16:53:55 -0700658 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700659 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
660 EXPECT_EQ(0.8, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700661
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700662 // Try changing volume one more time.
663 audio_track_->GetSource()->SetVolume(0.9);
664 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
665 EXPECT_EQ(0.9, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700666
667 DestroyAudioRtpReceiver();
668}
669
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200670TEST_F(RtpSenderReceiverTest, AudioRtpReceiverDelay) {
671 CreateAudioRtpReceiver();
672 VerifyRtpReceiverDelayBehaviour(voice_media_channel_,
673 audio_rtp_receiver_.get(), kAudioSsrc);
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200674}
675
676TEST_F(RtpSenderReceiverTest, VideoRtpReceiverDelay) {
677 CreateVideoRtpReceiver();
678 VerifyRtpReceiverDelayBehaviour(video_media_channel_,
679 video_rtp_receiver_.get(), kVideoSsrc);
680}
681
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700682// Test that the media channel isn't enabled for sending if the audio sender
683// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800684TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800685 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800686 rtc::scoped_refptr<AudioTrackInterface> track =
687 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700688
689 // Track but no SSRC.
690 EXPECT_TRUE(audio_rtp_sender_->SetTrack(track));
691 VerifyVoiceChannelNoInput();
692
693 // SSRC but no track.
694 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
695 audio_rtp_sender_->SetSsrc(kAudioSsrc);
696 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800697}
698
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700699// Test that the media channel isn't enabled for sending if the video sender
700// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800701TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800702 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700703
704 // Track but no SSRC.
705 EXPECT_TRUE(video_rtp_sender_->SetTrack(video_track_));
706 VerifyVideoChannelNoInput();
707
708 // SSRC but no track.
709 EXPECT_TRUE(video_rtp_sender_->SetTrack(nullptr));
710 video_rtp_sender_->SetSsrc(kVideoSsrc);
711 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800712}
713
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700714// Test that the media channel is enabled for sending when the audio sender
715// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800716TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800717 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800718 rtc::scoped_refptr<AudioTrackInterface> track =
719 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700720 audio_rtp_sender_->SetSsrc(kAudioSsrc);
721 audio_rtp_sender_->SetTrack(track);
722 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800723
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700724 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800725}
726
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700727// Test that the media channel is enabled for sending when the audio sender
728// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800729TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800730 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800731 rtc::scoped_refptr<AudioTrackInterface> track =
732 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700733 audio_rtp_sender_->SetTrack(track);
734 audio_rtp_sender_->SetSsrc(kAudioSsrc);
735 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800736
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700737 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800738}
739
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700740// Test that the media channel is enabled for sending when the video sender
741// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800742TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
nisseaf510af2016-03-21 08:20:42 -0700743 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800744 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700745 video_rtp_sender_->SetSsrc(kVideoSsrc);
746 video_rtp_sender_->SetTrack(video_track_);
747 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800748
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700749 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800750}
751
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700752// Test that the media channel is enabled for sending when the video sender
753// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800754TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
nisseaf510af2016-03-21 08:20:42 -0700755 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800756 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700757 video_rtp_sender_->SetTrack(video_track_);
758 video_rtp_sender_->SetSsrc(kVideoSsrc);
759 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800760
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700761 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800762}
763
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700764// Test that the media channel stops sending when the audio sender's SSRC is set
765// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800766TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700767 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800768
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700769 audio_rtp_sender_->SetSsrc(0);
770 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800771}
772
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700773// Test that the media channel stops sending when the video sender's SSRC is set
774// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800775TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700776 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800777
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700778 audio_rtp_sender_->SetSsrc(0);
779 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800780}
781
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700782// Test that the media channel stops sending when the audio sender's track is
783// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800784TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700785 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800786
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700787 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
788 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800789}
790
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700791// Test that the media channel stops sending when the video sender's track is
792// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800793TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700794 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800795
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700796 video_rtp_sender_->SetSsrc(0);
797 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800798}
799
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700800// Test that when the audio sender's SSRC is changed, the media channel stops
801// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800802TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700803 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800804
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700805 audio_rtp_sender_->SetSsrc(kAudioSsrc2);
806 VerifyVoiceChannelNoInput(kAudioSsrc);
807 VerifyVoiceChannelInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800808
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700809 audio_rtp_sender_ = nullptr;
810 VerifyVoiceChannelNoInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800811}
812
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700813// Test that when the audio sender's SSRC is changed, the media channel stops
814// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800815TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700816 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800817
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700818 video_rtp_sender_->SetSsrc(kVideoSsrc2);
819 VerifyVideoChannelNoInput(kVideoSsrc);
820 VerifyVideoChannelInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800821
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700822 video_rtp_sender_ = nullptr;
823 VerifyVideoChannelNoInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800824}
825
skvladdc1c62c2016-03-16 19:07:43 -0700826TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) {
827 CreateAudioRtpSender();
828
skvladdc1c62c2016-03-16 19:07:43 -0700829 RtpParameters params = audio_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700830 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -0800831 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -0700832
833 DestroyAudioRtpSender();
834}
835
Florent Castelli892acf02018-10-01 22:47:20 +0200836TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParametersBeforeNegotiation) {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800837 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200838 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +0200839
840 RtpParameters params = audio_rtp_sender_->GetParameters();
841 ASSERT_EQ(1u, params.encodings.size());
842 params.encodings[0].max_bitrate_bps = 90000;
843 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
844
845 params = audio_rtp_sender_->GetParameters();
846 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
847 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
848
849 DestroyAudioRtpSender();
850}
851
852TEST_F(RtpSenderReceiverTest, AudioSenderInitParametersMovedAfterNegotiation) {
853 audio_track_ = AudioTrack::Create(kAudioTrackId, nullptr);
854 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
855
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200856 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200857 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200858 audio_rtp_sender_ = AudioRtpSender::Create(
859 worker_thread_, audio_track_->id(), nullptr, set_streams_observer.get());
Florent Castelli892acf02018-10-01 22:47:20 +0200860 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200861 EXPECT_CALL(*set_streams_observer, OnSetStreams());
862 audio_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli892acf02018-10-01 22:47:20 +0200863
864 std::vector<RtpEncodingParameters> init_encodings(1);
865 init_encodings[0].max_bitrate_bps = 60000;
866 audio_rtp_sender_->set_init_send_encodings(init_encodings);
867
868 RtpParameters params = audio_rtp_sender_->GetParameters();
869 ASSERT_EQ(1u, params.encodings.size());
870 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
871
872 // Simulate the setLocalDescription call
873 std::vector<uint32_t> ssrcs(1, 1);
874 cricket::StreamParams stream_params =
875 cricket::CreateSimStreamParams("cname", ssrcs);
876 voice_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800877 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +0200878 audio_rtp_sender_->SetSsrc(1);
879
880 params = audio_rtp_sender_->GetParameters();
881 ASSERT_EQ(1u, params.encodings.size());
882 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
883
884 DestroyAudioRtpSender();
885}
886
887TEST_F(RtpSenderReceiverTest,
888 AudioSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800889 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200890 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +0200891
892 RtpParameters params;
893 RTCError result = audio_rtp_sender_->SetParameters(params);
894 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
895 DestroyAudioRtpSender();
896}
897
Florent Castellicebf50f2018-05-03 15:31:53 +0200898TEST_F(RtpSenderReceiverTest,
899 AudioSenderMustCallGetParametersBeforeSetParameters) {
900 CreateAudioRtpSender();
901
902 RtpParameters params;
903 RTCError result = audio_rtp_sender_->SetParameters(params);
904 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
905
906 DestroyAudioRtpSender();
907}
908
909TEST_F(RtpSenderReceiverTest,
910 AudioSenderSetParametersInvalidatesTransactionId) {
911 CreateAudioRtpSender();
912
913 RtpParameters params = audio_rtp_sender_->GetParameters();
914 EXPECT_EQ(1u, params.encodings.size());
915 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
916 RTCError result = audio_rtp_sender_->SetParameters(params);
917 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
918
919 DestroyAudioRtpSender();
920}
921
922TEST_F(RtpSenderReceiverTest, AudioSenderDetectTransactionIdModification) {
923 CreateAudioRtpSender();
924
925 RtpParameters params = audio_rtp_sender_->GetParameters();
926 params.transaction_id = "";
927 RTCError result = audio_rtp_sender_->SetParameters(params);
928 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
929
930 DestroyAudioRtpSender();
931}
932
933TEST_F(RtpSenderReceiverTest, AudioSenderCheckTransactionIdRefresh) {
934 CreateAudioRtpSender();
935
936 RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200937 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 15:31:53 +0200938 auto saved_transaction_id = params.transaction_id;
939 params = audio_rtp_sender_->GetParameters();
940 EXPECT_NE(saved_transaction_id, params.transaction_id);
941
942 DestroyAudioRtpSender();
943}
944
945TEST_F(RtpSenderReceiverTest, AudioSenderSetParametersOldValueFail) {
946 CreateAudioRtpSender();
947
948 RtpParameters params = audio_rtp_sender_->GetParameters();
949 RtpParameters second_params = audio_rtp_sender_->GetParameters();
950
951 RTCError result = audio_rtp_sender_->SetParameters(params);
952 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
Seth Hampson2d2c8882018-05-16 16:02:32 -0700953 DestroyAudioRtpSender();
954}
955
956TEST_F(RtpSenderReceiverTest, AudioSenderCantSetUnimplementedRtpParameters) {
957 CreateAudioRtpSender();
958 RtpParameters params = audio_rtp_sender_->GetParameters();
959 EXPECT_EQ(1u, params.encodings.size());
960
Florent Castelli87b3c512018-07-18 16:00:28 +0200961 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 16:02:32 -0700962 params.mid = "dummy_mid";
963 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
964 audio_rtp_sender_->SetParameters(params).type());
965 params = audio_rtp_sender_->GetParameters();
966
Seth Hampson2d2c8882018-05-16 16:02:32 -0700967 DestroyAudioRtpSender();
968}
969
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700970TEST_F(RtpSenderReceiverTest, SetAudioMaxSendBitrate) {
971 CreateAudioRtpSender();
972
973 EXPECT_EQ(-1, voice_media_channel_->max_bps());
974 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200975 EXPECT_EQ(1U, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -0800976 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100977 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -0800978 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700979
980 // Read back the parameters and verify they have been changed.
981 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200982 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100983 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700984
985 // Verify that the audio channel received the new parameters.
986 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200987 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100988 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700989
990 // Verify that the global bitrate limit has not been changed.
991 EXPECT_EQ(-1, voice_media_channel_->max_bps());
992
993 DestroyAudioRtpSender();
994}
995
Seth Hampson24722b32017-12-22 09:36:42 -0800996TEST_F(RtpSenderReceiverTest, SetAudioBitratePriority) {
997 CreateAudioRtpSender();
998
999 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001000 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001001 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1002 params.encodings[0].bitrate_priority);
1003 double new_bitrate_priority = 2.0;
1004 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -08001005 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -08001006
1007 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001008 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001009 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1010
1011 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001012 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001013 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1014
1015 DestroyAudioRtpSender();
1016}
1017
skvladdc1c62c2016-03-16 19:07:43 -07001018TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) {
1019 CreateVideoRtpSender();
1020
skvladdc1c62c2016-03-16 19:07:43 -07001021 RtpParameters params = video_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001022 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -08001023 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -07001024
1025 DestroyVideoRtpSender();
1026}
1027
Florent Castelli892acf02018-10-01 22:47:20 +02001028TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParametersBeforeNegotiation) {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001029 video_rtp_sender_ =
1030 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +02001031
1032 RtpParameters params = video_rtp_sender_->GetParameters();
1033 ASSERT_EQ(1u, params.encodings.size());
1034 params.encodings[0].max_bitrate_bps = 90000;
1035 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1036
1037 params = video_rtp_sender_->GetParameters();
1038 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1039 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
1040
1041 DestroyVideoRtpSender();
1042}
1043
1044TEST_F(RtpSenderReceiverTest, VideoSenderInitParametersMovedAfterNegotiation) {
1045 AddVideoTrack(false);
1046
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001047 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001048 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001049 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1050 set_streams_observer.get());
Florent Castelli892acf02018-10-01 22:47:20 +02001051 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001052 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1053 video_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli892acf02018-10-01 22:47:20 +02001054
1055 std::vector<RtpEncodingParameters> init_encodings(2);
1056 init_encodings[0].max_bitrate_bps = 60000;
1057 init_encodings[1].max_bitrate_bps = 900000;
1058 video_rtp_sender_->set_init_send_encodings(init_encodings);
1059
1060 RtpParameters params = video_rtp_sender_->GetParameters();
1061 ASSERT_EQ(2u, params.encodings.size());
1062 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1063 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
1064
1065 // Simulate the setLocalDescription call
1066 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +01001067 ssrcs.reserve(2);
Florent Castelli892acf02018-10-01 22:47:20 +02001068 for (int i = 0; i < 2; ++i)
1069 ssrcs.push_back(kVideoSsrcSimulcast + i);
1070 cricket::StreamParams stream_params =
1071 cricket::CreateSimStreamParams("cname", ssrcs);
1072 video_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -08001073 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +02001074 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
1075
1076 params = video_rtp_sender_->GetParameters();
1077 ASSERT_EQ(2u, params.encodings.size());
1078 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1079 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
1080
1081 DestroyVideoRtpSender();
1082}
1083
1084TEST_F(RtpSenderReceiverTest,
1085 VideoSenderInitParametersMovedAfterManualSimulcastAndNegotiation) {
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(1);
1097 init_encodings[0].max_bitrate_bps = 60000;
1098 video_rtp_sender_->set_init_send_encodings(init_encodings);
1099
1100 RtpParameters params = video_rtp_sender_->GetParameters();
1101 ASSERT_EQ(1u, params.encodings.size());
1102 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1103
1104 // Simulate the setLocalDescription call as if the user used SDP munging
1105 // to enable simulcast
1106 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +01001107 ssrcs.reserve(2);
Florent Castelli892acf02018-10-01 22:47:20 +02001108 for (int i = 0; i < 2; ++i)
1109 ssrcs.push_back(kVideoSsrcSimulcast + i);
1110 cricket::StreamParams stream_params =
1111 cricket::CreateSimStreamParams("cname", ssrcs);
1112 video_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -08001113 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +02001114 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
1115
1116 params = video_rtp_sender_->GetParameters();
1117 ASSERT_EQ(2u, params.encodings.size());
1118 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1119
1120 DestroyVideoRtpSender();
1121}
1122
1123TEST_F(RtpSenderReceiverTest,
1124 VideoSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001125 video_rtp_sender_ =
1126 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +02001127
1128 RtpParameters params;
1129 RTCError result = video_rtp_sender_->SetParameters(params);
1130 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1131 DestroyVideoRtpSender();
1132}
1133
Florent Castellicebf50f2018-05-03 15:31:53 +02001134TEST_F(RtpSenderReceiverTest,
1135 VideoSenderMustCallGetParametersBeforeSetParameters) {
1136 CreateVideoRtpSender();
1137
1138 RtpParameters params;
1139 RTCError result = video_rtp_sender_->SetParameters(params);
1140 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1141
1142 DestroyVideoRtpSender();
1143}
1144
1145TEST_F(RtpSenderReceiverTest,
1146 VideoSenderSetParametersInvalidatesTransactionId) {
1147 CreateVideoRtpSender();
1148
1149 RtpParameters params = video_rtp_sender_->GetParameters();
1150 EXPECT_EQ(1u, params.encodings.size());
1151 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1152 RTCError result = video_rtp_sender_->SetParameters(params);
1153 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1154
1155 DestroyVideoRtpSender();
1156}
1157
1158TEST_F(RtpSenderReceiverTest, VideoSenderDetectTransactionIdModification) {
1159 CreateVideoRtpSender();
1160
1161 RtpParameters params = video_rtp_sender_->GetParameters();
1162 params.transaction_id = "";
1163 RTCError result = video_rtp_sender_->SetParameters(params);
1164 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1165
1166 DestroyVideoRtpSender();
1167}
1168
1169TEST_F(RtpSenderReceiverTest, VideoSenderCheckTransactionIdRefresh) {
1170 CreateVideoRtpSender();
1171
1172 RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001173 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 15:31:53 +02001174 auto saved_transaction_id = params.transaction_id;
1175 params = video_rtp_sender_->GetParameters();
1176 EXPECT_NE(saved_transaction_id, params.transaction_id);
1177
1178 DestroyVideoRtpSender();
1179}
1180
1181TEST_F(RtpSenderReceiverTest, VideoSenderSetParametersOldValueFail) {
1182 CreateVideoRtpSender();
1183
1184 RtpParameters params = video_rtp_sender_->GetParameters();
1185 RtpParameters second_params = video_rtp_sender_->GetParameters();
1186
1187 RTCError result = video_rtp_sender_->SetParameters(params);
1188 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1189
1190 DestroyVideoRtpSender();
1191}
1192
Seth Hampson2d2c8882018-05-16 16:02:32 -07001193TEST_F(RtpSenderReceiverTest, VideoSenderCantSetUnimplementedRtpParameters) {
1194 CreateVideoRtpSender();
1195 RtpParameters params = video_rtp_sender_->GetParameters();
1196 EXPECT_EQ(1u, params.encodings.size());
1197
Florent Castelli87b3c512018-07-18 16:00:28 +02001198 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 16:02:32 -07001199 params.mid = "dummy_mid";
1200 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1201 video_rtp_sender_->SetParameters(params).type());
1202 params = video_rtp_sender_->GetParameters();
1203
Seth Hampson2d2c8882018-05-16 16:02:32 -07001204 DestroyVideoRtpSender();
1205}
1206
Florent Castellic1a0bcb2019-01-29 14:26:48 +01001207TEST_F(RtpSenderReceiverTest, VideoSenderCanSetScaleResolutionDownBy) {
1208 CreateVideoRtpSender();
1209
1210 RtpParameters params = video_rtp_sender_->GetParameters();
1211 params.encodings[0].scale_resolution_down_by = 2;
1212
1213 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1214 params = video_rtp_sender_->GetParameters();
1215 EXPECT_EQ(2, params.encodings[0].scale_resolution_down_by);
1216
1217 DestroyVideoRtpSender();
1218}
1219
1220TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidScaleResolutionDownBy) {
1221 CreateVideoRtpSender();
1222
1223 RtpParameters params = video_rtp_sender_->GetParameters();
1224 params.encodings[0].scale_resolution_down_by = 0.5;
1225 RTCError result = video_rtp_sender_->SetParameters(params);
1226 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1227
1228 DestroyVideoRtpSender();
1229}
1230
Florent Castelli907dc802019-12-06 15:03:19 +01001231TEST_F(RtpSenderReceiverTest, VideoSenderCanSetMaxFramerate) {
1232 CreateVideoRtpSender();
1233
1234 RtpParameters params = video_rtp_sender_->GetParameters();
1235 params.encodings[0].max_framerate = 20;
1236
1237 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1238 params = video_rtp_sender_->GetParameters();
1239 EXPECT_EQ(20., params.encodings[0].max_framerate);
1240
1241 DestroyVideoRtpSender();
1242}
1243
1244TEST_F(RtpSenderReceiverTest, VideoSenderCanSetMaxFramerateZero) {
1245 CreateVideoRtpSender();
1246
1247 RtpParameters params = video_rtp_sender_->GetParameters();
1248 params.encodings[0].max_framerate = 0.;
1249
1250 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1251 params = video_rtp_sender_->GetParameters();
1252 EXPECT_EQ(0., params.encodings[0].max_framerate);
1253
1254 DestroyVideoRtpSender();
1255}
1256
1257TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidMaxFramerate) {
1258 CreateVideoRtpSender();
1259
1260 RtpParameters params = video_rtp_sender_->GetParameters();
1261 params.encodings[0].max_framerate = -5.;
1262 RTCError result = video_rtp_sender_->SetParameters(params);
1263 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1264
1265 DestroyVideoRtpSender();
1266}
1267
Seth Hampson2d2c8882018-05-16 16:02:32 -07001268// A video sender can have multiple simulcast layers, in which case it will
1269// contain multiple RtpEncodingParameters. This tests that if this is the case
1270// (simulcast), then we can't set the bitrate_priority, or max_bitrate_bps
1271// for any encodings besides at index 0, because these are both implemented
1272// "per-sender."
1273TEST_F(RtpSenderReceiverTest, VideoSenderCantSetPerSenderEncodingParameters) {
1274 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001275 CreateVideoRtpSenderWithSimulcast();
Seth Hampson2d2c8882018-05-16 16:02:32 -07001276 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001277 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Seth Hampson2d2c8882018-05-16 16:02:32 -07001278
1279 params.encodings[1].bitrate_priority = 2.0;
1280 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1281 video_rtp_sender_->SetParameters(params).type());
1282 params = video_rtp_sender_->GetParameters();
1283
Seth Hampson2d2c8882018-05-16 16:02:32 -07001284 DestroyVideoRtpSender();
1285}
1286
Florent Castelli892acf02018-10-01 22:47:20 +02001287TEST_F(RtpSenderReceiverTest, VideoSenderCantSetReadOnlyEncodingParameters) {
1288 // Add a simulcast specific send stream that contains 2 encoding parameters.
1289 CreateVideoRtpSenderWithSimulcast();
1290 RtpParameters params = video_rtp_sender_->GetParameters();
1291 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
1292
1293 for (size_t i = 0; i < params.encodings.size(); i++) {
1294 params.encodings[i].ssrc = 1337;
1295 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION,
1296 video_rtp_sender_->SetParameters(params).type());
1297 params = video_rtp_sender_->GetParameters();
1298 }
1299
1300 DestroyVideoRtpSender();
1301}
1302
Ă…sa Persson55659812018-06-18 17:51:32 +02001303TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrate) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001304 CreateVideoRtpSender();
1305
1306 EXPECT_EQ(-1, video_media_channel_->max_bps());
1307 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001308 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001309 EXPECT_FALSE(params.encodings[0].min_bitrate_bps);
deadbeefe702b302017-02-04 12:09:01 -08001310 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Ă…sa Persson55659812018-06-18 17:51:32 +02001311 params.encodings[0].min_bitrate_bps = 100;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001312 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -08001313 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001314
1315 // Read back the parameters and verify they have been changed.
1316 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001317 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001318 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001319 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001320
1321 // Verify that the video channel received the new parameters.
1322 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001323 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001324 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001325 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001326
1327 // Verify that the global bitrate limit has not been changed.
1328 EXPECT_EQ(-1, video_media_channel_->max_bps());
1329
1330 DestroyVideoRtpSender();
1331}
1332
Ă…sa Persson55659812018-06-18 17:51:32 +02001333TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrateSimulcast) {
1334 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001335 CreateVideoRtpSenderWithSimulcast();
Ă…sa Persson55659812018-06-18 17:51:32 +02001336
1337 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001338 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001339 params.encodings[0].min_bitrate_bps = 100;
1340 params.encodings[0].max_bitrate_bps = 1000;
1341 params.encodings[1].min_bitrate_bps = 200;
1342 params.encodings[1].max_bitrate_bps = 2000;
1343 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1344
1345 // Verify that the video channel received the new parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001346 params = video_media_channel_->GetRtpSendParameters(kVideoSsrcSimulcast);
1347 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001348 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
1349 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
1350 EXPECT_EQ(200, params.encodings[1].min_bitrate_bps);
1351 EXPECT_EQ(2000, params.encodings[1].max_bitrate_bps);
1352
1353 DestroyVideoRtpSender();
1354}
1355
Seth Hampson24722b32017-12-22 09:36:42 -08001356TEST_F(RtpSenderReceiverTest, SetVideoBitratePriority) {
1357 CreateVideoRtpSender();
1358
1359 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001360 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001361 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1362 params.encodings[0].bitrate_priority);
1363 double new_bitrate_priority = 2.0;
1364 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -08001365 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -08001366
1367 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001368 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001369 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1370
1371 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001372 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001373 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1374
1375 DestroyVideoRtpSender();
1376}
1377
Florent Castelli38332cd2018-11-20 14:08:06 +01001378TEST_F(RtpSenderReceiverTest, VideoReceiverCanGetParametersWithSimulcast) {
1379 CreateVideoRtpReceiverWithSimulcast({}, 2);
1380
1381 RtpParameters params = video_rtp_receiver_->GetParameters();
1382 EXPECT_EQ(2u, params.encodings.size());
1383
1384 DestroyVideoRtpReceiver();
1385}
1386
pbos5214a0a2016-12-16 15:39:11 -08001387// Test that makes sure that a video track content hint translates to the proper
1388// value for sources that are not screencast.
1389TEST_F(RtpSenderReceiverTest, PropagatesVideoTrackContentHint) {
1390 CreateVideoRtpSender();
1391
1392 video_track_->set_enabled(true);
1393
1394 // |video_track_| is not screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001395 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001396 // No content hint should be set by default.
1397 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1398 video_track_->content_hint());
1399 // Setting detailed should turn a non-screencast source into screencast mode.
1400 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001401 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001402 // Removing the content hint should turn the track back into non-screencast
1403 // mode.
1404 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001405 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001406 // Setting fluid should remain in non-screencast mode (its default).
1407 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001408 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 08:53:10 +02001409 // Setting text should have the same effect as Detailed
1410 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
1411 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001412
1413 DestroyVideoRtpSender();
1414}
1415
1416// Test that makes sure that a video track content hint translates to the proper
1417// value for screencast sources.
1418TEST_F(RtpSenderReceiverTest,
1419 PropagatesVideoTrackContentHintForScreencastSource) {
1420 CreateVideoRtpSender(true);
1421
1422 video_track_->set_enabled(true);
1423
1424 // |video_track_| with a screencast source should be screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001425 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001426 // No content hint should be set by default.
1427 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1428 video_track_->content_hint());
1429 // Setting fluid should turn a screencast source into non-screencast mode.
1430 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001431 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001432 // Removing the content hint should turn the track back into screencast mode.
1433 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001434 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001435 // Setting detailed should still remain in screencast mode (its default).
1436 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001437 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 08:53:10 +02001438 // Setting text should have the same effect as Detailed
1439 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
1440 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001441
1442 DestroyVideoRtpSender();
1443}
1444
1445// Test that makes sure any content hints that are set on a track before
1446// VideoRtpSender is ready to send are still applied when it gets ready to send.
1447TEST_F(RtpSenderReceiverTest,
1448 PropagatesVideoTrackContentHintSetBeforeEnabling) {
1449 AddVideoTrack();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001450 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001451 std::make_unique<MockSetStreamsObserver>();
pbos5214a0a2016-12-16 15:39:11 -08001452 // Setting detailed overrides the default non-screencast mode. This should be
1453 // applied even if the track is set on construction.
1454 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001455 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1456 set_streams_observer.get());
Steve Anton111fdfd2018-06-25 13:03:36 -07001457 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001458 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1459 video_rtp_sender_->SetStreams({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -08001460 video_rtp_sender_->SetMediaChannel(video_media_channel_);
pbos5214a0a2016-12-16 15:39:11 -08001461 video_track_->set_enabled(true);
1462
1463 // Sender is not ready to send (no SSRC) so no option should have been set.
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001464 EXPECT_EQ(absl::nullopt, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001465
1466 // Verify that the content hint is accounted for when video_rtp_sender_ does
1467 // get enabled.
1468 video_rtp_sender_->SetSsrc(kVideoSsrc);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001469 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001470
1471 // And removing the hint should go back to false (to verify that false was
1472 // default correctly).
1473 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001474 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001475
1476 DestroyVideoRtpSender();
1477}
1478
deadbeef20cb0c12017-02-01 20:27:00 -08001479TEST_F(RtpSenderReceiverTest, AudioSenderHasDtmfSender) {
1480 CreateAudioRtpSender();
1481 EXPECT_NE(nullptr, audio_rtp_sender_->GetDtmfSender());
1482}
1483
1484TEST_F(RtpSenderReceiverTest, VideoSenderDoesNotHaveDtmfSender) {
1485 CreateVideoRtpSender();
1486 EXPECT_EQ(nullptr, video_rtp_sender_->GetDtmfSender());
1487}
1488
1489// Test that the DTMF sender is really using |voice_channel_|, and thus returns
1490// true/false from CanSendDtmf based on what |voice_channel_| returns.
1491TEST_F(RtpSenderReceiverTest, CanInsertDtmf) {
1492 AddDtmfCodec();
1493 CreateAudioRtpSender();
1494 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1495 ASSERT_NE(nullptr, dtmf_sender);
1496 EXPECT_TRUE(dtmf_sender->CanInsertDtmf());
1497}
1498
1499TEST_F(RtpSenderReceiverTest, CanNotInsertDtmf) {
1500 CreateAudioRtpSender();
1501 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1502 ASSERT_NE(nullptr, dtmf_sender);
1503 // DTMF codec has not been added, as it was in the above test.
1504 EXPECT_FALSE(dtmf_sender->CanInsertDtmf());
1505}
1506
1507TEST_F(RtpSenderReceiverTest, InsertDtmf) {
1508 AddDtmfCodec();
1509 CreateAudioRtpSender();
1510 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1511 ASSERT_NE(nullptr, dtmf_sender);
1512
1513 EXPECT_EQ(0U, voice_media_channel_->dtmf_info_queue().size());
1514
1515 // Insert DTMF
1516 const int expected_duration = 90;
1517 dtmf_sender->InsertDtmf("012", expected_duration, 100);
1518
1519 // Verify
1520 ASSERT_EQ_WAIT(3U, voice_media_channel_->dtmf_info_queue().size(),
1521 kDefaultTimeout);
1522 const uint32_t send_ssrc =
1523 voice_media_channel_->send_streams()[0].first_ssrc();
1524 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[0],
1525 send_ssrc, 0, expected_duration));
1526 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[1],
1527 send_ssrc, 1, expected_duration));
1528 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[2],
1529 send_ssrc, 2, expected_duration));
1530}
1531
1532// Make sure the signal from "GetOnDestroyedSignal()" fires when the sender is
1533// destroyed, which is needed for the DTMF sender.
1534TEST_F(RtpSenderReceiverTest, TestOnDestroyedSignal) {
1535 CreateAudioRtpSender();
1536 EXPECT_FALSE(audio_sender_destroyed_signal_fired_);
1537 audio_rtp_sender_ = nullptr;
1538 EXPECT_TRUE(audio_sender_destroyed_signal_fired_);
1539}
1540
Benjamin Wright84583f62018-10-04 14:22:34 -07001541// Validate that the default FrameEncryptor setting is nullptr.
1542TEST_F(RtpSenderReceiverTest, AudioSenderCanSetFrameEncryptor) {
1543 CreateAudioRtpSender();
1544 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1545 new FakeFrameEncryptor());
1546 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1547 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1548 EXPECT_EQ(fake_frame_encryptor.get(),
1549 audio_rtp_sender_->GetFrameEncryptor().get());
1550}
1551
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001552// Validate that setting a FrameEncryptor after the send stream is stopped does
1553// nothing.
1554TEST_F(RtpSenderReceiverTest, AudioSenderCannotSetFrameEncryptorAfterStop) {
1555 CreateAudioRtpSender();
1556 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1557 new FakeFrameEncryptor());
1558 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1559 audio_rtp_sender_->Stop();
1560 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1561 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1562}
1563
Benjamin Wright84583f62018-10-04 14:22:34 -07001564// Validate that the default FrameEncryptor setting is nullptr.
1565TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetFrameDecryptor) {
1566 CreateAudioRtpReceiver();
1567 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1568 new FakeFrameDecryptor());
1569 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
1570 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1571 EXPECT_EQ(fake_frame_decryptor.get(),
1572 audio_rtp_receiver_->GetFrameDecryptor().get());
1573}
1574
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001575// Validate that the default FrameEncryptor setting is nullptr.
1576TEST_F(RtpSenderReceiverTest, AudioReceiverCannotSetFrameDecryptorAfterStop) {
1577 CreateAudioRtpReceiver();
1578 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1579 new FakeFrameDecryptor());
1580 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
1581 audio_rtp_receiver_->Stop();
1582 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1583 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1584}
1585
1586// Validate that the default FrameEncryptor setting is nullptr.
1587TEST_F(RtpSenderReceiverTest, VideoSenderCanSetFrameEncryptor) {
1588 CreateVideoRtpSender();
1589 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1590 new FakeFrameEncryptor());
1591 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1592 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1593 EXPECT_EQ(fake_frame_encryptor.get(),
1594 video_rtp_sender_->GetFrameEncryptor().get());
1595}
1596
1597// Validate that setting a FrameEncryptor after the send stream is stopped does
1598// nothing.
1599TEST_F(RtpSenderReceiverTest, VideoSenderCannotSetFrameEncryptorAfterStop) {
1600 CreateVideoRtpSender();
1601 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1602 new FakeFrameEncryptor());
1603 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1604 video_rtp_sender_->Stop();
1605 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1606 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1607}
1608
1609// Validate that the default FrameEncryptor setting is nullptr.
1610TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetFrameDecryptor) {
1611 CreateVideoRtpReceiver();
1612 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1613 new FakeFrameDecryptor());
1614 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
1615 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1616 EXPECT_EQ(fake_frame_decryptor.get(),
1617 video_rtp_receiver_->GetFrameDecryptor().get());
1618}
1619
1620// Validate that the default FrameEncryptor setting is nullptr.
1621TEST_F(RtpSenderReceiverTest, VideoReceiverCannotSetFrameDecryptorAfterStop) {
1622 CreateVideoRtpReceiver();
1623 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1624 new FakeFrameDecryptor());
1625 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
1626 video_rtp_receiver_->Stop();
1627 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1628 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1629}
1630
Amit Hilbuch619b2942019-02-26 15:55:19 -08001631// Checks that calling the internal methods for get/set parameters do not
1632// invalidate any parameters retreived by clients.
1633TEST_F(RtpSenderReceiverTest,
1634 InternalParameterMethodsDoNotInvalidateTransaction) {
1635 CreateVideoRtpSender();
1636 RtpParameters parameters = video_rtp_sender_->GetParameters();
1637 RtpParameters new_parameters = video_rtp_sender_->GetParametersInternal();
1638 new_parameters.encodings[0].active = false;
1639 video_rtp_sender_->SetParametersInternal(new_parameters);
1640 new_parameters.encodings[0].active = true;
1641 video_rtp_sender_->SetParametersInternal(new_parameters);
1642 parameters.encodings[0].active = false;
1643 EXPECT_TRUE(video_rtp_sender_->SetParameters(parameters).ok());
1644}
1645
Amit Hilbuch2297d332019-02-19 12:49:22 -08001646// Helper method for syntactic sugar for accepting a vector with '{}' notation.
1647std::pair<RidList, RidList> CreatePairOfRidVectors(
1648 const std::vector<std::string>& first,
1649 const std::vector<std::string>& second) {
1650 return std::make_pair(first, second);
1651}
1652
1653// These parameters are used to test disabling simulcast layers.
1654const std::pair<RidList, RidList> kDisableSimulcastLayersParameters[] = {
1655 // Tests removing the first layer. This is a special case because
1656 // the first layer's SSRC is also the 'primary' SSRC used to associate the
1657 // parameters to the media channel.
1658 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"1"}),
1659 // Tests removing some layers.
1660 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"2", "4"}),
1661 // Tests simulcast rejected scenario all layers except first are rejected.
1662 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"2", "3", "4"}),
1663 // Tests removing all layers.
1664 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"1", "2", "3", "4"}),
1665};
1666
1667// Runs test for disabling layers on a sender without a media engine set.
1668TEST_P(RtpSenderReceiverTest, DisableSimulcastLayersWithoutMediaEngine) {
1669 auto parameter = GetParam();
1670 RunDisableSimulcastLayersWithoutMediaEngineTest(parameter.first,
1671 parameter.second);
1672}
1673
1674// Runs test for disabling layers on a sender with a media engine set.
1675TEST_P(RtpSenderReceiverTest, DisableSimulcastLayersWithMediaEngine) {
1676 auto parameter = GetParam();
1677 RunDisableSimulcastLayersWithMediaEngineTest(parameter.first,
1678 parameter.second);
1679}
1680
1681INSTANTIATE_TEST_SUITE_P(
1682 DisableSimulcastLayersInSender,
1683 RtpSenderReceiverTest,
1684 ::testing::ValuesIn(kDisableSimulcastLayersParameters));
1685
deadbeef70ab1a12015-09-28 16:53:55 -07001686} // namespace webrtc