blob: 67cbe2ca4f25b1a4d7f2de0e5a95fd30bea3b3ad [file] [log] [blame]
deadbeef70ab1a12015-09-28 16:53:55 -07001/*
kjellanderb24317b2016-02-10 07:54:43 -08002 * Copyright 2012 The WebRTC project authors. All Rights Reserved.
deadbeef70ab1a12015-09-28 16:53:55 -07003 *
kjellanderb24317b2016-02-10 07:54:43 -08004 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
deadbeef70ab1a12015-09-28 16:53:55 -07009 */
10
Yves Gerey3e707812018-11-28 16:47:49 +010011#include <stddef.h>
12#include <cstdint>
kwibergd1fe2812016-04-27 06:47:29 -070013#include <memory>
deadbeef70ab1a12015-09-28 16:53:55 -070014#include <string>
Tommif888bb52015-12-12 01:37:01 +010015#include <utility>
Yves Gerey3e707812018-11-28 16:47:49 +010016#include <vector>
deadbeef70ab1a12015-09-28 16:53:55 -070017
Amit Hilbuch2297d332019-02-19 12:49:22 -080018#include "absl/algorithm/container.h"
Yves Gerey3e707812018-11-28 16:47:49 +010019#include "absl/memory/memory.h"
20#include "absl/types/optional.h"
21#include "api/audio_options.h"
Steve Anton10542f22019-01-11 09:11:00 -080022#include "api/crypto/crypto_options.h"
23#include "api/crypto/frame_decryptor_interface.h"
24#include "api/crypto/frame_encryptor_interface.h"
25#include "api/dtmf_sender_interface.h"
26#include "api/media_stream_interface.h"
27#include "api/rtc_error.h"
28#include "api/rtp_parameters.h"
Mirko Bonadeid9708072019-01-25 20:26:48 +010029#include "api/scoped_refptr.h"
Benjamin Wright84583f62018-10-04 14:22:34 -070030#include "api/test/fake_frame_decryptor.h"
31#include "api/test/fake_frame_encryptor.h"
Jonas Orelanda3aa9bd2019-04-17 07:38:40 +020032#include "api/video/builtin_video_bitrate_allocator_factory.h"
Yves Gerey3e707812018-11-28 16:47:49 +010033#include "logging/rtc_event_log/rtc_event_log.h"
34#include "media/base/codec.h"
Steve Anton10542f22019-01-11 09:11:00 -080035#include "media/base/fake_media_engine.h"
36#include "media/base/media_channel.h"
37#include "media/base/media_config.h"
38#include "media/base/media_engine.h"
39#include "media/base/rtp_data_engine.h"
40#include "media/base/stream_params.h"
41#include "media/base/test_utils.h"
42#include "media/engine/fake_webrtc_call.h"
43#include "p2p/base/dtls_transport_internal.h"
44#include "p2p/base/fake_dtls_transport.h"
45#include "p2p/base/p2p_constants.h"
Ruslan Burakov501bfba2019-02-11 10:29:19 +010046#include "pc/audio_rtp_receiver.h"
Steve Anton10542f22019-01-11 09:11:00 -080047#include "pc/audio_track.h"
Yves Gerey3e707812018-11-28 16:47:49 +010048#include "pc/channel.h"
Steve Anton10542f22019-01-11 09:11:00 -080049#include "pc/channel_manager.h"
50#include "pc/dtls_srtp_transport.h"
51#include "pc/local_audio_source.h"
52#include "pc/media_stream.h"
Ruslan Burakov7ea46052019-02-16 02:07:05 +010053#include "pc/remote_audio_source.h"
Steve Anton10542f22019-01-11 09:11:00 -080054#include "pc/rtp_receiver.h"
55#include "pc/rtp_sender.h"
56#include "pc/rtp_transport_internal.h"
57#include "pc/test/fake_video_track_source.h"
Ruslan Burakov501bfba2019-02-11 10:29:19 +010058#include "pc/video_rtp_receiver.h"
Steve Anton10542f22019-01-11 09:11:00 -080059#include "pc/video_track.h"
Yves Gerey3e707812018-11-28 16:47:49 +010060#include "rtc_base/checks.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020061#include "rtc_base/gunit.h"
Yves Gerey3e707812018-11-28 16:47:49 +010062#include "rtc_base/third_party/sigslot/sigslot.h"
63#include "rtc_base/thread.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020064#include "test/gmock.h"
65#include "test/gtest.h"
deadbeef70ab1a12015-09-28 16:53:55 -070066
67using ::testing::_;
Amit Hilbuch2297d332019-02-19 12:49:22 -080068using ::testing::ContainerEq;
deadbeef70ab1a12015-09-28 16:53:55 -070069using ::testing::Exactly;
deadbeef5dd42fd2016-05-02 16:20:01 -070070using ::testing::InvokeWithoutArgs;
skvladdc1c62c2016-03-16 19:07:43 -070071using ::testing::Return;
Amit Hilbuch2297d332019-02-19 12:49:22 -080072using RidList = std::vector<std::string>;
deadbeef70ab1a12015-09-28 16:53:55 -070073
deadbeef20cb0c12017-02-01 20:27:00 -080074namespace {
75
Seth Hampson845e8782018-03-02 11:34:10 -080076static const char kStreamId1[] = "local_stream_1";
deadbeef70ab1a12015-09-28 16:53:55 -070077static const char kVideoTrackId[] = "video_1";
78static const char kAudioTrackId[] = "audio_1";
Peter Boström0c4e06b2015-10-07 12:23:21 +020079static const uint32_t kVideoSsrc = 98;
deadbeeffac06552015-11-25 11:26:01 -080080static const uint32_t kVideoSsrc2 = 100;
Peter Boström0c4e06b2015-10-07 12:23:21 +020081static const uint32_t kAudioSsrc = 99;
deadbeeffac06552015-11-25 11:26:01 -080082static const uint32_t kAudioSsrc2 = 101;
Florent Castelli892acf02018-10-01 22:47:20 +020083static const uint32_t kVideoSsrcSimulcast = 102;
84static const uint32_t kVideoSimulcastLayerCount = 2;
deadbeef20cb0c12017-02-01 20:27:00 -080085static const int kDefaultTimeout = 10000; // 10 seconds.
deadbeef20cb0c12017-02-01 20:27:00 -080086} // namespace
deadbeef70ab1a12015-09-28 16:53:55 -070087
88namespace webrtc {
89
Amit Hilbuch2297d332019-02-19 12:49:22 -080090class RtpSenderReceiverTest
Mirko Bonadei6a489f22019-04-09 15:11:12 +020091 : public ::testing::Test,
92 public ::testing::WithParamInterface<std::pair<RidList, RidList>>,
Amit Hilbuch2297d332019-02-19 12:49:22 -080093 public sigslot::has_slots<> {
tkchin3784b4a2016-06-24 19:31:47 -070094 public:
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070095 RtpSenderReceiverTest()
Steve Anton47136dd2018-01-12 10:49:35 -080096 : network_thread_(rtc::Thread::Current()),
97 worker_thread_(rtc::Thread::Current()),
Jonas Orelanda3aa9bd2019-04-17 07:38:40 +020098 video_bitrate_allocator_factory_(
99 webrtc::CreateBuiltinVideoBitrateAllocatorFactory()),
Steve Anton47136dd2018-01-12 10:49:35 -0800100 // Create fake media engine/etc. so we can create channels to use to
101 // test RtpSenders/RtpReceivers.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700102 media_engine_(new cricket::FakeMediaEngine()),
Karl Wiberg918f50c2018-07-05 11:40:33 +0200103 channel_manager_(absl::WrapUnique(media_engine_),
104 absl::make_unique<cricket::RtpDataEngine>(),
Steve Anton47136dd2018-01-12 10:49:35 -0800105 worker_thread_,
106 network_thread_),
Sebastian Jansson8f83b422018-02-21 13:07:13 +0100107 fake_call_(),
Seth Hampson845e8782018-03-02 11:34:10 -0800108 local_stream_(MediaStream::Create(kStreamId1)) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700109 // Create channels to be used by the RtpSenders and RtpReceivers.
110 channel_manager_.Init();
deadbeef7af91dd2016-12-13 11:29:11 -0800111 bool srtp_required = true;
Karl Wiberg918f50c2018-07-05 11:40:33 +0200112 rtp_dtls_transport_ = absl::make_unique<cricket::FakeDtlsTransport>(
Zhi Huange830e682018-03-30 10:48:35 -0700113 "fake_dtls_transport", cricket::ICE_CANDIDATE_COMPONENT_RTP);
114 rtp_transport_ = CreateDtlsSrtpTransport();
115
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700116 voice_channel_ = channel_manager_.CreateVoiceChannel(
Zhi Huange830e682018-03-30 10:48:35 -0700117 &fake_call_, cricket::MediaConfig(), rtp_transport_.get(),
Anton Sukhanov98a462c2018-10-17 13:15:42 -0700118 /*media_transport=*/nullptr, rtc::Thread::Current(), cricket::CN_AUDIO,
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800119 srtp_required, webrtc::CryptoOptions(), &ssrc_generator_,
120 cricket::AudioOptions());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700121 video_channel_ = channel_manager_.CreateVideoChannel(
Zhi Huange830e682018-03-30 10:48:35 -0700122 &fake_call_, cricket::MediaConfig(), rtp_transport_.get(),
Niels Möller46879152019-01-07 15:54:47 +0100123 /*media_transport=*/nullptr, rtc::Thread::Current(), cricket::CN_VIDEO,
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800124 srtp_required, webrtc::CryptoOptions(), &ssrc_generator_,
Jonas Orelanda3aa9bd2019-04-17 07:38:40 +0200125 cricket::VideoOptions(), video_bitrate_allocator_factory_.get());
deadbeef20cb0c12017-02-01 20:27:00 -0800126 voice_channel_->Enable(true);
127 video_channel_->Enable(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700128 voice_media_channel_ = media_engine_->GetVoiceChannel(0);
129 video_media_channel_ = media_engine_->GetVideoChannel(0);
130 RTC_CHECK(voice_channel_);
131 RTC_CHECK(video_channel_);
132 RTC_CHECK(voice_media_channel_);
133 RTC_CHECK(video_media_channel_);
134
135 // Create streams for predefined SSRCs. Streams need to exist in order
136 // for the senders and receievers to apply parameters to them.
137 // Normally these would be created by SetLocalDescription and
138 // SetRemoteDescription.
139 voice_media_channel_->AddSendStream(
140 cricket::StreamParams::CreateLegacy(kAudioSsrc));
141 voice_media_channel_->AddRecvStream(
142 cricket::StreamParams::CreateLegacy(kAudioSsrc));
143 voice_media_channel_->AddSendStream(
144 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
145 voice_media_channel_->AddRecvStream(
146 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
147 video_media_channel_->AddSendStream(
148 cricket::StreamParams::CreateLegacy(kVideoSsrc));
149 video_media_channel_->AddRecvStream(
150 cricket::StreamParams::CreateLegacy(kVideoSsrc));
151 video_media_channel_->AddSendStream(
152 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
153 video_media_channel_->AddRecvStream(
154 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
tkchin3784b4a2016-06-24 19:31:47 -0700155 }
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700156
Zhi Huange830e682018-03-30 10:48:35 -0700157 std::unique_ptr<webrtc::RtpTransportInternal> CreateDtlsSrtpTransport() {
Karl Wiberg918f50c2018-07-05 11:40:33 +0200158 auto dtls_srtp_transport = absl::make_unique<webrtc::DtlsSrtpTransport>(
159 /*rtcp_mux_required=*/true);
Zhi Huange830e682018-03-30 10:48:35 -0700160 dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport_.get(),
161 /*rtcp_dtls_transport=*/nullptr);
162 return dtls_srtp_transport;
163 }
164
deadbeef20cb0c12017-02-01 20:27:00 -0800165 // Needed to use DTMF sender.
166 void AddDtmfCodec() {
167 cricket::AudioSendParameters params;
168 const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000,
169 0, 1);
170 params.codecs.push_back(kTelephoneEventCodec);
171 voice_media_channel_->SetSendParameters(params);
172 }
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700173
pbos5214a0a2016-12-16 15:39:11 -0800174 void AddVideoTrack() { AddVideoTrack(false); }
175
176 void AddVideoTrack(bool is_screencast) {
perkja3ede6c2016-03-08 01:27:48 +0100177 rtc::scoped_refptr<VideoTrackSourceInterface> source(
pbos5214a0a2016-12-16 15:39:11 -0800178 FakeVideoTrackSource::Create(is_screencast));
perkj773be362017-07-31 23:22:01 -0700179 video_track_ =
180 VideoTrack::Create(kVideoTrackId, source, rtc::Thread::Current());
deadbeefe814a0d2017-02-25 18:15:09 -0800181 EXPECT_TRUE(local_stream_->AddTrack(video_track_));
deadbeef70ab1a12015-09-28 16:53:55 -0700182 }
183
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700184 void CreateAudioRtpSender() { CreateAudioRtpSender(nullptr); }
185
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +0100186 void CreateAudioRtpSender(
187 const rtc::scoped_refptr<LocalAudioSource>& source) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700188 audio_track_ = AudioTrack::Create(kAudioTrackId, source);
deadbeefe814a0d2017-02-25 18:15:09 -0800189 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
Steve Anton47136dd2018-01-12 10:49:35 -0800190 audio_rtp_sender_ =
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800191 AudioRtpSender::Create(worker_thread_, audio_track_->id(), nullptr);
Steve Anton111fdfd2018-06-25 13:03:36 -0700192 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_));
193 audio_rtp_sender_->set_stream_ids({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800194 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
deadbeeffac06552015-11-25 11:26:01 -0800195 audio_rtp_sender_->SetSsrc(kAudioSsrc);
deadbeef20cb0c12017-02-01 20:27:00 -0800196 audio_rtp_sender_->GetOnDestroyedSignal()->connect(
197 this, &RtpSenderReceiverTest::OnAudioSenderDestroyed);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700198 VerifyVoiceChannelInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700199 }
200
Steve Anton02ee47c2018-01-10 16:26:06 -0800201 void CreateAudioRtpSenderWithNoTrack() {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800202 audio_rtp_sender_ =
203 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800204 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
Steve Anton02ee47c2018-01-10 16:26:06 -0800205 }
206
deadbeef20cb0c12017-02-01 20:27:00 -0800207 void OnAudioSenderDestroyed() { audio_sender_destroyed_signal_fired_ = true; }
208
Seth Hampson2d2c8882018-05-16 16:02:32 -0700209 void CreateVideoRtpSender(uint32_t ssrc) {
210 CreateVideoRtpSender(false, ssrc);
211 }
212
pbos5214a0a2016-12-16 15:39:11 -0800213 void CreateVideoRtpSender() { CreateVideoRtpSender(false); }
214
Amit Hilbuch2297d332019-02-19 12:49:22 -0800215 cricket::StreamParams CreateSimulcastStreamParams(int num_layers) {
Florent Castelli892acf02018-10-01 22:47:20 +0200216 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +0100217 ssrcs.reserve(num_layers);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800218 for (int i = 0; i < num_layers; ++i) {
Florent Castelli892acf02018-10-01 22:47:20 +0200219 ssrcs.push_back(kVideoSsrcSimulcast + i);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800220 }
221 return cricket::CreateSimStreamParams("cname", ssrcs);
222 }
223
224 uint32_t CreateVideoRtpSender(const cricket::StreamParams& stream_params) {
Florent Castelli892acf02018-10-01 22:47:20 +0200225 video_media_channel_->AddSendStream(stream_params);
226 uint32_t primary_ssrc = stream_params.first_ssrc();
227 CreateVideoRtpSender(primary_ssrc);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800228 return primary_ssrc;
229 }
230
231 uint32_t CreateVideoRtpSenderWithSimulcast(
232 int num_layers = kVideoSimulcastLayerCount) {
233 return CreateVideoRtpSender(CreateSimulcastStreamParams(num_layers));
234 }
235
236 uint32_t CreateVideoRtpSenderWithSimulcast(
237 const std::vector<std::string>& rids) {
238 cricket::StreamParams stream_params =
239 CreateSimulcastStreamParams(rids.size());
240 std::vector<cricket::RidDescription> rid_descriptions;
241 absl::c_transform(
242 rids, std::back_inserter(rid_descriptions), [](const std::string& rid) {
243 return cricket::RidDescription(rid, cricket::RidDirection::kSend);
244 });
245 stream_params.set_rids(rid_descriptions);
246 return CreateVideoRtpSender(stream_params);
Florent Castelli892acf02018-10-01 22:47:20 +0200247 }
248
Seth Hampson2d2c8882018-05-16 16:02:32 -0700249 void CreateVideoRtpSender(bool is_screencast, uint32_t ssrc = kVideoSsrc) {
pbos5214a0a2016-12-16 15:39:11 -0800250 AddVideoTrack(is_screencast);
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800251 video_rtp_sender_ =
252 VideoRtpSender::Create(worker_thread_, video_track_->id());
Steve Anton111fdfd2018-06-25 13:03:36 -0700253 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
254 video_rtp_sender_->set_stream_ids({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800255 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Seth Hampson2d2c8882018-05-16 16:02:32 -0700256 video_rtp_sender_->SetSsrc(ssrc);
257 VerifyVideoChannelInput(ssrc);
deadbeef70ab1a12015-09-28 16:53:55 -0700258 }
Steve Anton02ee47c2018-01-10 16:26:06 -0800259 void CreateVideoRtpSenderWithNoTrack() {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800260 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, /*id=*/"");
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800261 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Steve Anton02ee47c2018-01-10 16:26:06 -0800262 }
263
deadbeef70ab1a12015-09-28 16:53:55 -0700264 void DestroyAudioRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700265 audio_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700266 VerifyVoiceChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700267 }
268
269 void DestroyVideoRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700270 video_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700271 VerifyVideoChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700272 }
273
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100274 void CreateAudioRtpReceiver(
275 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
Mirko Bonadei05cf6be2019-01-31 21:38:12 +0100276 audio_rtp_receiver_ =
277 new AudioRtpReceiver(rtc::Thread::Current(), kAudioTrackId, streams);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800278 audio_rtp_receiver_->SetMediaChannel(voice_media_channel_);
Steve Antond3679212018-01-17 17:41:02 -0800279 audio_rtp_receiver_->SetupMediaChannel(kAudioSsrc);
perkjd61bf802016-03-24 03:16:19 -0700280 audio_track_ = audio_rtp_receiver_->audio_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700281 VerifyVoiceChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700282 }
283
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100284 void CreateVideoRtpReceiver(
285 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
Mirko Bonadei05cf6be2019-01-31 21:38:12 +0100286 video_rtp_receiver_ =
287 new VideoRtpReceiver(rtc::Thread::Current(), kVideoTrackId, streams);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800288 video_rtp_receiver_->SetMediaChannel(video_media_channel_);
Steve Antond3679212018-01-17 17:41:02 -0800289 video_rtp_receiver_->SetupMediaChannel(kVideoSsrc);
perkjf0dcfe22016-03-10 18:32:00 +0100290 video_track_ = video_rtp_receiver_->video_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700291 VerifyVideoChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700292 }
293
Florent Castelli38332cd2018-11-20 14:08:06 +0100294 void CreateVideoRtpReceiverWithSimulcast(
295 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {},
296 int num_layers = kVideoSimulcastLayerCount) {
297 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +0100298 ssrcs.reserve(num_layers);
Florent Castelli38332cd2018-11-20 14:08:06 +0100299 for (int i = 0; i < num_layers; ++i)
300 ssrcs.push_back(kVideoSsrcSimulcast + i);
301 cricket::StreamParams stream_params =
302 cricket::CreateSimStreamParams("cname", ssrcs);
303 video_media_channel_->AddRecvStream(stream_params);
304 uint32_t primary_ssrc = stream_params.first_ssrc();
305
Mirko Bonadei05cf6be2019-01-31 21:38:12 +0100306 video_rtp_receiver_ =
307 new VideoRtpReceiver(rtc::Thread::Current(), kVideoTrackId, streams);
Florent Castelli38332cd2018-11-20 14:08:06 +0100308 video_rtp_receiver_->SetMediaChannel(video_media_channel_);
309 video_rtp_receiver_->SetupMediaChannel(primary_ssrc);
310 video_track_ = video_rtp_receiver_->video_track();
311 }
312
deadbeef70ab1a12015-09-28 16:53:55 -0700313 void DestroyAudioRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700314 audio_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700315 VerifyVoiceChannelNoOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700316 }
317
318 void DestroyVideoRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700319 video_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700320 VerifyVideoChannelNoOutput();
321 }
322
323 void VerifyVoiceChannelInput() { VerifyVoiceChannelInput(kAudioSsrc); }
324
325 void VerifyVoiceChannelInput(uint32_t ssrc) {
326 // Verify that the media channel has an audio source, and the stream isn't
327 // muted.
328 EXPECT_TRUE(voice_media_channel_->HasSource(ssrc));
329 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(ssrc));
330 }
331
332 void VerifyVideoChannelInput() { VerifyVideoChannelInput(kVideoSsrc); }
333
334 void VerifyVideoChannelInput(uint32_t ssrc) {
335 // Verify that the media channel has a video source,
336 EXPECT_TRUE(video_media_channel_->HasSource(ssrc));
337 }
338
339 void VerifyVoiceChannelNoInput() { VerifyVoiceChannelNoInput(kAudioSsrc); }
340
341 void VerifyVoiceChannelNoInput(uint32_t ssrc) {
342 // Verify that the media channel's source is reset.
343 EXPECT_FALSE(voice_media_channel_->HasSource(ssrc));
344 }
345
346 void VerifyVideoChannelNoInput() { VerifyVideoChannelNoInput(kVideoSsrc); }
347
348 void VerifyVideoChannelNoInput(uint32_t ssrc) {
349 // Verify that the media channel's source is reset.
350 EXPECT_FALSE(video_media_channel_->HasSource(ssrc));
351 }
352
353 void VerifyVoiceChannelOutput() {
354 // Verify that the volume is initialized to 1.
355 double volume;
356 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
357 EXPECT_EQ(1, volume);
358 }
359
360 void VerifyVideoChannelOutput() {
361 // Verify that the media channel has a sink.
362 EXPECT_TRUE(video_media_channel_->HasSink(kVideoSsrc));
363 }
364
365 void VerifyVoiceChannelNoOutput() {
366 // Verify that the volume is reset to 0.
367 double volume;
368 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
369 EXPECT_EQ(0, volume);
370 }
371
372 void VerifyVideoChannelNoOutput() {
373 // Verify that the media channel's sink is reset.
374 EXPECT_FALSE(video_media_channel_->HasSink(kVideoSsrc));
deadbeef70ab1a12015-09-28 16:53:55 -0700375 }
376
Amit Hilbuch2297d332019-02-19 12:49:22 -0800377 // Verifies that the encoding layers contain the specified RIDs.
378 bool VerifyEncodingLayers(const VideoRtpSender& sender,
379 const std::vector<std::string>& rids) {
380 bool has_failure = HasFailure();
381 RtpParameters parameters = sender.GetParameters();
382 std::vector<std::string> encoding_rids;
383 absl::c_transform(
384 parameters.encodings, std::back_inserter(encoding_rids),
385 [](const RtpEncodingParameters& encoding) { return encoding.rid; });
386 EXPECT_THAT(rids, ContainerEq(encoding_rids));
387 return has_failure || !HasFailure();
388 }
389
390 // Runs a test for disabling the encoding layers on the specified sender.
391 void RunDisableEncodingLayersTest(
392 const std::vector<std::string>& all_layers,
393 const std::vector<std::string>& disabled_layers,
394 VideoRtpSender* sender) {
395 std::vector<std::string> expected;
396 absl::c_copy_if(all_layers, std::back_inserter(expected),
397 [&disabled_layers](const std::string& rid) {
398 return !absl::c_linear_search(disabled_layers, rid);
399 });
400
401 EXPECT_TRUE(VerifyEncodingLayers(*sender, all_layers));
402 sender->DisableEncodingLayers(disabled_layers);
403 EXPECT_TRUE(VerifyEncodingLayers(*sender, expected));
404 }
405
406 // Runs a test for setting an encoding layer as inactive.
407 // This test assumes that some layers have already been disabled.
408 void RunSetLastLayerAsInactiveTest(VideoRtpSender* sender) {
409 auto parameters = sender->GetParameters();
410 if (parameters.encodings.size() == 0) {
411 return;
412 }
413
414 RtpEncodingParameters& encoding = parameters.encodings.back();
415 auto rid = encoding.rid;
416 EXPECT_TRUE(encoding.active);
417 encoding.active = false;
418 auto error = sender->SetParameters(parameters);
419 ASSERT_TRUE(error.ok());
420 parameters = sender->GetParameters();
421 RtpEncodingParameters& result_encoding = parameters.encodings.back();
422 EXPECT_EQ(rid, result_encoding.rid);
423 EXPECT_FALSE(result_encoding.active);
424 }
425
426 // Runs a test for disabling the encoding layers on a sender without a media
427 // channel.
428 void RunDisableSimulcastLayersWithoutMediaEngineTest(
429 const std::vector<std::string>& all_layers,
430 const std::vector<std::string>& disabled_layers) {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800431 auto sender = VideoRtpSender::Create(rtc::Thread::Current(), "1");
Amit Hilbuch2297d332019-02-19 12:49:22 -0800432 RtpParameters parameters;
433 parameters.encodings.resize(all_layers.size());
434 for (size_t i = 0; i < all_layers.size(); ++i) {
435 parameters.encodings[i].rid = all_layers[i];
436 }
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800437 sender->set_init_send_encodings(parameters.encodings);
438 RunDisableEncodingLayersTest(all_layers, disabled_layers, sender.get());
439 RunSetLastLayerAsInactiveTest(sender.get());
Amit Hilbuch2297d332019-02-19 12:49:22 -0800440 }
441
442 // Runs a test for disabling the encoding layers on a sender with a media
443 // channel.
444 void RunDisableSimulcastLayersWithMediaEngineTest(
445 const std::vector<std::string>& all_layers,
446 const std::vector<std::string>& disabled_layers) {
447 uint32_t ssrc = CreateVideoRtpSenderWithSimulcast(all_layers);
448 RunDisableEncodingLayersTest(all_layers, disabled_layers,
449 video_rtp_sender_.get());
450
451 auto channel_parameters = video_media_channel_->GetRtpSendParameters(ssrc);
452 ASSERT_EQ(channel_parameters.encodings.size(), all_layers.size());
453 for (size_t i = 0; i < all_layers.size(); ++i) {
454 EXPECT_EQ(all_layers[i], channel_parameters.encodings[i].rid);
455 bool is_active = !absl::c_linear_search(disabled_layers, all_layers[i]);
456 EXPECT_EQ(is_active, channel_parameters.encodings[i].active);
457 }
458
459 RunSetLastLayerAsInactiveTest(video_rtp_sender_.get());
460 }
461
Ruslan Burakov493a6502019-02-27 15:32:48 +0100462 void VerifyTrackLatencyBehaviour(cricket::Delayable* media_channel,
463 MediaStreamTrackInterface* track,
464 MediaSourceInterface* source,
465 uint32_t ssrc) {
466 absl::optional<int> delay_ms; // In milliseconds.
467 double latency_s = 0.5; // In seconds.
468
469 source->SetLatency(latency_s);
470 delay_ms = media_channel->GetBaseMinimumPlayoutDelayMs(ssrc);
471 EXPECT_DOUBLE_EQ(latency_s, delay_ms.value_or(0) / 1000.0);
472
473 // Disabling the track should take no effect on previously set value.
474 track->set_enabled(false);
475 delay_ms = media_channel->GetBaseMinimumPlayoutDelayMs(ssrc);
476 EXPECT_DOUBLE_EQ(latency_s, delay_ms.value_or(0) / 1000.0);
477
478 // When the track is disabled, we still should be able to set latency.
479 latency_s = 0.3;
480 source->SetLatency(latency_s);
481 delay_ms = media_channel->GetBaseMinimumPlayoutDelayMs(ssrc);
482 EXPECT_DOUBLE_EQ(latency_s, delay_ms.value_or(0) / 1000.0);
483
484 // Enabling the track should take no effect on previously set value.
485 track->set_enabled(true);
486 delay_ms = media_channel->GetBaseMinimumPlayoutDelayMs(ssrc);
487 EXPECT_DOUBLE_EQ(latency_s, delay_ms.value_or(0) / 1000.0);
488
489 // We still should be able to change latency.
490 latency_s = 0.0;
491 source->SetLatency(latency_s);
492 delay_ms = media_channel->GetBaseMinimumPlayoutDelayMs(ssrc);
493 EXPECT_EQ(0, delay_ms.value_or(-1));
494 EXPECT_DOUBLE_EQ(latency_s, delay_ms.value_or(0) / 1000.0);
495 }
496
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200497 // Check that minimum Jitter Buffer delay is propagated to the underlying
498 // |media_channel|.
499 void VerifyRtpReceiverDelayBehaviour(cricket::Delayable* media_channel,
500 RtpReceiverInterface* receiver,
501 uint32_t ssrc) {
502 receiver->SetJitterBufferMinimumDelay(/*delay_seconds=*/0.5);
503 absl::optional<int> delay_ms =
504 media_channel->GetBaseMinimumPlayoutDelayMs(ssrc); // In milliseconds.
505 EXPECT_DOUBLE_EQ(0.5, delay_ms.value_or(0) / 1000.0);
506 }
507
deadbeef70ab1a12015-09-28 16:53:55 -0700508 protected:
Steve Anton47136dd2018-01-12 10:49:35 -0800509 rtc::Thread* const network_thread_;
510 rtc::Thread* const worker_thread_;
skvlad11a9cbf2016-10-07 11:53:05 -0700511 webrtc::RtcEventLogNullImpl event_log_;
Zhi Huange830e682018-03-30 10:48:35 -0700512 // The |rtp_dtls_transport_| and |rtp_transport_| should be destroyed after
513 // the |channel_manager|.
514 std::unique_ptr<cricket::DtlsTransportInternal> rtp_dtls_transport_;
515 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport_;
Jonas Orelanda3aa9bd2019-04-17 07:38:40 +0200516 std::unique_ptr<webrtc::VideoBitrateAllocatorFactory>
517 video_bitrate_allocator_factory_;
deadbeef112b2e92017-02-10 20:13:37 -0800518 // |media_engine_| is actually owned by |channel_manager_|.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700519 cricket::FakeMediaEngine* media_engine_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700520 cricket::ChannelManager channel_manager_;
521 cricket::FakeCall fake_call_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700522 cricket::VoiceChannel* voice_channel_;
523 cricket::VideoChannel* video_channel_;
524 cricket::FakeVoiceMediaChannel* voice_media_channel_;
525 cricket::FakeVideoMediaChannel* video_media_channel_;
deadbeef70ab1a12015-09-28 16:53:55 -0700526 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
527 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
528 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
529 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
deadbeefe814a0d2017-02-25 18:15:09 -0800530 rtc::scoped_refptr<MediaStreamInterface> local_stream_;
deadbeef70ab1a12015-09-28 16:53:55 -0700531 rtc::scoped_refptr<VideoTrackInterface> video_track_;
532 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
deadbeef20cb0c12017-02-01 20:27:00 -0800533 bool audio_sender_destroyed_signal_fired_ = false;
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800534 rtc::UniqueRandomIdGenerator ssrc_generator_;
deadbeef70ab1a12015-09-28 16:53:55 -0700535};
536
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700537// Test that |voice_channel_| is updated when an audio track is associated
deadbeef70ab1a12015-09-28 16:53:55 -0700538// and disassociated with an AudioRtpSender.
539TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
540 CreateAudioRtpSender();
541 DestroyAudioRtpSender();
542}
543
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700544// Test that |video_channel_| is updated when a video track is associated and
deadbeef70ab1a12015-09-28 16:53:55 -0700545// disassociated with a VideoRtpSender.
546TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
547 CreateVideoRtpSender();
548 DestroyVideoRtpSender();
549}
550
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700551// Test that |voice_channel_| is updated when a remote audio track is
deadbeef70ab1a12015-09-28 16:53:55 -0700552// associated and disassociated with an AudioRtpReceiver.
553TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
554 CreateAudioRtpReceiver();
555 DestroyAudioRtpReceiver();
556}
557
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700558// Test that |video_channel_| is updated when a remote video track is
559// associated and disassociated with a VideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700560TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
561 CreateVideoRtpReceiver();
562 DestroyVideoRtpReceiver();
563}
564
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100565TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiverWithStreams) {
566 CreateAudioRtpReceiver({local_stream_});
567 DestroyAudioRtpReceiver();
568}
569
570TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiverWithStreams) {
571 CreateVideoRtpReceiver({local_stream_});
572 DestroyVideoRtpReceiver();
573}
574
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700575// Test that the AudioRtpSender applies options from the local audio source.
576TEST_F(RtpSenderReceiverTest, LocalAudioSourceOptionsApplied) {
577 cricket::AudioOptions options;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100578 options.echo_cancellation = true;
deadbeef757146b2017-02-10 21:26:48 -0800579 auto source = LocalAudioSource::Create(&options);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700580 CreateAudioRtpSender(source.get());
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700581
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100582 EXPECT_EQ(true, voice_media_channel_->options().echo_cancellation);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700583
584 DestroyAudioRtpSender();
585}
586
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700587// Test that the stream is muted when the track is disabled, and unmuted when
588// the track is enabled.
589TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) {
590 CreateAudioRtpSender();
591
592 audio_track_->set_enabled(false);
593 EXPECT_TRUE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
594
595 audio_track_->set_enabled(true);
596 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
597
598 DestroyAudioRtpSender();
599}
600
601// Test that the volume is set to 0 when the track is disabled, and back to
602// 1 when the track is enabled.
deadbeef70ab1a12015-09-28 16:53:55 -0700603TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
604 CreateAudioRtpReceiver();
605
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700606 double volume;
607 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
608 EXPECT_EQ(1, volume);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700609
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700610 audio_track_->set_enabled(false);
611 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
612 EXPECT_EQ(0, volume);
613
deadbeef70ab1a12015-09-28 16:53:55 -0700614 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700615 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
616 EXPECT_EQ(1, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700617
618 DestroyAudioRtpReceiver();
619}
620
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700621// Currently no action is taken when a remote video track is disabled or
622// enabled, so there's nothing to test here, other than what is normally
623// verified in DestroyVideoRtpSender.
deadbeef70ab1a12015-09-28 16:53:55 -0700624TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
625 CreateVideoRtpSender();
626
deadbeef70ab1a12015-09-28 16:53:55 -0700627 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700628 video_track_->set_enabled(true);
629
630 DestroyVideoRtpSender();
631}
632
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700633// Test that the state of the video track created by the VideoRtpReceiver is
634// updated when the receiver is destroyed.
perkjf0dcfe22016-03-10 18:32:00 +0100635TEST_F(RtpSenderReceiverTest, RemoteVideoTrackState) {
636 CreateVideoRtpReceiver();
637
638 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track_->state());
639 EXPECT_EQ(webrtc::MediaSourceInterface::kLive,
640 video_track_->GetSource()->state());
641
642 DestroyVideoRtpReceiver();
643
644 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track_->state());
645 EXPECT_EQ(webrtc::MediaSourceInterface::kEnded,
646 video_track_->GetSource()->state());
647}
648
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700649// Currently no action is taken when a remote video track is disabled or
650// enabled, so there's nothing to test here, other than what is normally
651// verified in DestroyVideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700652TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
653 CreateVideoRtpReceiver();
654
655 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700656 video_track_->set_enabled(true);
657
658 DestroyVideoRtpReceiver();
659}
660
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700661// Test that the AudioRtpReceiver applies volume changes from the track source
662// to the media channel.
deadbeef70ab1a12015-09-28 16:53:55 -0700663TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
664 CreateAudioRtpReceiver();
665
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700666 double volume;
667 audio_track_->GetSource()->SetVolume(0.5);
668 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
669 EXPECT_EQ(0.5, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700670
671 // Disable the audio track, this should prevent setting the volume.
deadbeef70ab1a12015-09-28 16:53:55 -0700672 audio_track_->set_enabled(false);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700673 audio_track_->GetSource()->SetVolume(0.8);
674 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
675 EXPECT_EQ(0, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700676
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700677 // When the track is enabled, the previously set volume should take effect.
deadbeef70ab1a12015-09-28 16:53:55 -0700678 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700679 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
680 EXPECT_EQ(0.8, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700681
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700682 // Try changing volume one more time.
683 audio_track_->GetSource()->SetVolume(0.9);
684 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
685 EXPECT_EQ(0.9, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700686
687 DestroyAudioRtpReceiver();
688}
689
Ruslan Burakov493a6502019-02-27 15:32:48 +0100690TEST_F(RtpSenderReceiverTest, RemoteAudioSourceLatency) {
Ruslan Burakov7ea46052019-02-16 02:07:05 +0100691 absl::optional<int> delay_ms; // In milliseconds.
Ruslan Burakov7ea46052019-02-16 02:07:05 +0100692 rtc::scoped_refptr<RemoteAudioSource> source =
693 new rtc::RefCountedObject<RemoteAudioSource>(rtc::Thread::Current());
694
695 // Set it to value different from default zero.
Ruslan Burakov493a6502019-02-27 15:32:48 +0100696 voice_media_channel_->SetBaseMinimumPlayoutDelayMs(kAudioSsrc, 300);
Ruslan Burakov7ea46052019-02-16 02:07:05 +0100697
698 // Check that calling GetLatency on the source that hasn't been started yet
Ruslan Burakov493a6502019-02-27 15:32:48 +0100699 // won't trigger caching and return default value.
Ruslan Burakov7ea46052019-02-16 02:07:05 +0100700 EXPECT_DOUBLE_EQ(source->GetLatency(), 0);
Ruslan Burakov493a6502019-02-27 15:32:48 +0100701
702 // Check that cached latency will be applied on start.
703 source->SetLatency(0.4);
704 EXPECT_DOUBLE_EQ(source->GetLatency(), 0.4);
Ruslan Burakov7ea46052019-02-16 02:07:05 +0100705 source->Start(voice_media_channel_, kAudioSsrc);
Ruslan Burakov493a6502019-02-27 15:32:48 +0100706 delay_ms = voice_media_channel_->GetBaseMinimumPlayoutDelayMs(kAudioSsrc);
707 EXPECT_EQ(400, delay_ms);
Ruslan Burakov7ea46052019-02-16 02:07:05 +0100708}
709
Ruslan Burakov493a6502019-02-27 15:32:48 +0100710TEST_F(RtpSenderReceiverTest, RemoteAudioTrackLatency) {
Ruslan Burakov7ea46052019-02-16 02:07:05 +0100711 CreateAudioRtpReceiver();
Ruslan Burakov493a6502019-02-27 15:32:48 +0100712 VerifyTrackLatencyBehaviour(voice_media_channel_, audio_track_.get(),
713 audio_track_->GetSource(), kAudioSsrc);
714}
Ruslan Burakov7ea46052019-02-16 02:07:05 +0100715
Ruslan Burakov493a6502019-02-27 15:32:48 +0100716TEST_F(RtpSenderReceiverTest, RemoteVideoTrackLatency) {
717 CreateVideoRtpReceiver();
718 VerifyTrackLatencyBehaviour(video_media_channel_, video_track_.get(),
719 video_track_->GetSource(), kVideoSsrc);
Ruslan Burakov7ea46052019-02-16 02:07:05 +0100720}
721
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200722TEST_F(RtpSenderReceiverTest, AudioRtpReceiverDelay) {
723 CreateAudioRtpReceiver();
724 VerifyRtpReceiverDelayBehaviour(voice_media_channel_,
725 audio_rtp_receiver_.get(), kAudioSsrc);
726 VerifyTrackLatencyBehaviour(voice_media_channel_, audio_track_.get(),
727 audio_track_->GetSource(), kAudioSsrc);
728}
729
730TEST_F(RtpSenderReceiverTest, VideoRtpReceiverDelay) {
731 CreateVideoRtpReceiver();
732 VerifyRtpReceiverDelayBehaviour(video_media_channel_,
733 video_rtp_receiver_.get(), kVideoSsrc);
734}
735
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700736// Test that the media channel isn't enabled for sending if the audio sender
737// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800738TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800739 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800740 rtc::scoped_refptr<AudioTrackInterface> track =
741 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700742
743 // Track but no SSRC.
744 EXPECT_TRUE(audio_rtp_sender_->SetTrack(track));
745 VerifyVoiceChannelNoInput();
746
747 // SSRC but no track.
748 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
749 audio_rtp_sender_->SetSsrc(kAudioSsrc);
750 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800751}
752
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700753// Test that the media channel isn't enabled for sending if the video sender
754// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800755TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800756 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700757
758 // Track but no SSRC.
759 EXPECT_TRUE(video_rtp_sender_->SetTrack(video_track_));
760 VerifyVideoChannelNoInput();
761
762 // SSRC but no track.
763 EXPECT_TRUE(video_rtp_sender_->SetTrack(nullptr));
764 video_rtp_sender_->SetSsrc(kVideoSsrc);
765 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800766}
767
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700768// Test that the media channel is enabled for sending when the audio sender
769// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800770TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800771 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800772 rtc::scoped_refptr<AudioTrackInterface> track =
773 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700774 audio_rtp_sender_->SetSsrc(kAudioSsrc);
775 audio_rtp_sender_->SetTrack(track);
776 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800777
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700778 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800779}
780
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700781// Test that the media channel is enabled for sending when the audio sender
782// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800783TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800784 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800785 rtc::scoped_refptr<AudioTrackInterface> track =
786 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700787 audio_rtp_sender_->SetTrack(track);
788 audio_rtp_sender_->SetSsrc(kAudioSsrc);
789 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800790
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700791 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800792}
793
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700794// Test that the media channel is enabled for sending when the video sender
795// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800796TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
nisseaf510af2016-03-21 08:20:42 -0700797 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800798 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700799 video_rtp_sender_->SetSsrc(kVideoSsrc);
800 video_rtp_sender_->SetTrack(video_track_);
801 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800802
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700803 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800804}
805
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700806// Test that the media channel is enabled for sending when the video sender
807// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800808TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
nisseaf510af2016-03-21 08:20:42 -0700809 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800810 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700811 video_rtp_sender_->SetTrack(video_track_);
812 video_rtp_sender_->SetSsrc(kVideoSsrc);
813 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800814
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700815 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800816}
817
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700818// Test that the media channel stops sending when the audio sender's SSRC is set
819// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800820TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700821 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800822
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700823 audio_rtp_sender_->SetSsrc(0);
824 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800825}
826
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700827// Test that the media channel stops sending when the video sender's SSRC is set
828// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800829TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700830 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800831
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700832 audio_rtp_sender_->SetSsrc(0);
833 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800834}
835
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700836// Test that the media channel stops sending when the audio sender's track is
837// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800838TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700839 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800840
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700841 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
842 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800843}
844
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700845// Test that the media channel stops sending when the video sender's track is
846// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800847TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700848 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800849
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700850 video_rtp_sender_->SetSsrc(0);
851 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800852}
853
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700854// Test that when the audio sender's SSRC is changed, the media channel stops
855// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800856TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700857 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800858
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700859 audio_rtp_sender_->SetSsrc(kAudioSsrc2);
860 VerifyVoiceChannelNoInput(kAudioSsrc);
861 VerifyVoiceChannelInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800862
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700863 audio_rtp_sender_ = nullptr;
864 VerifyVoiceChannelNoInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800865}
866
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700867// Test that when the audio sender's SSRC is changed, the media channel stops
868// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800869TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700870 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800871
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700872 video_rtp_sender_->SetSsrc(kVideoSsrc2);
873 VerifyVideoChannelNoInput(kVideoSsrc);
874 VerifyVideoChannelInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800875
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700876 video_rtp_sender_ = nullptr;
877 VerifyVideoChannelNoInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800878}
879
skvladdc1c62c2016-03-16 19:07:43 -0700880TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) {
881 CreateAudioRtpSender();
882
skvladdc1c62c2016-03-16 19:07:43 -0700883 RtpParameters params = audio_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700884 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -0800885 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -0700886
887 DestroyAudioRtpSender();
888}
889
Florent Castelli892acf02018-10-01 22:47:20 +0200890TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParametersBeforeNegotiation) {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800891 audio_rtp_sender_ =
892 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +0200893
894 RtpParameters params = audio_rtp_sender_->GetParameters();
895 ASSERT_EQ(1u, params.encodings.size());
896 params.encodings[0].max_bitrate_bps = 90000;
897 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
898
899 params = audio_rtp_sender_->GetParameters();
900 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
901 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
902
903 DestroyAudioRtpSender();
904}
905
906TEST_F(RtpSenderReceiverTest, AudioSenderInitParametersMovedAfterNegotiation) {
907 audio_track_ = AudioTrack::Create(kAudioTrackId, nullptr);
908 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
909
910 audio_rtp_sender_ =
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800911 AudioRtpSender::Create(worker_thread_, audio_track_->id(), nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +0200912 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_));
913 audio_rtp_sender_->set_stream_ids({local_stream_->id()});
914
915 std::vector<RtpEncodingParameters> init_encodings(1);
916 init_encodings[0].max_bitrate_bps = 60000;
917 audio_rtp_sender_->set_init_send_encodings(init_encodings);
918
919 RtpParameters params = audio_rtp_sender_->GetParameters();
920 ASSERT_EQ(1u, params.encodings.size());
921 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
922
923 // Simulate the setLocalDescription call
924 std::vector<uint32_t> ssrcs(1, 1);
925 cricket::StreamParams stream_params =
926 cricket::CreateSimStreamParams("cname", ssrcs);
927 voice_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800928 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +0200929 audio_rtp_sender_->SetSsrc(1);
930
931 params = audio_rtp_sender_->GetParameters();
932 ASSERT_EQ(1u, params.encodings.size());
933 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
934
935 DestroyAudioRtpSender();
936}
937
938TEST_F(RtpSenderReceiverTest,
939 AudioSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800940 audio_rtp_sender_ =
941 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +0200942
943 RtpParameters params;
944 RTCError result = audio_rtp_sender_->SetParameters(params);
945 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
946 DestroyAudioRtpSender();
947}
948
Florent Castellicebf50f2018-05-03 15:31:53 +0200949TEST_F(RtpSenderReceiverTest,
950 AudioSenderMustCallGetParametersBeforeSetParameters) {
951 CreateAudioRtpSender();
952
953 RtpParameters params;
954 RTCError result = audio_rtp_sender_->SetParameters(params);
955 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
956
957 DestroyAudioRtpSender();
958}
959
960TEST_F(RtpSenderReceiverTest,
961 AudioSenderSetParametersInvalidatesTransactionId) {
962 CreateAudioRtpSender();
963
964 RtpParameters params = audio_rtp_sender_->GetParameters();
965 EXPECT_EQ(1u, params.encodings.size());
966 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
967 RTCError result = audio_rtp_sender_->SetParameters(params);
968 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
969
970 DestroyAudioRtpSender();
971}
972
973TEST_F(RtpSenderReceiverTest, AudioSenderDetectTransactionIdModification) {
974 CreateAudioRtpSender();
975
976 RtpParameters params = audio_rtp_sender_->GetParameters();
977 params.transaction_id = "";
978 RTCError result = audio_rtp_sender_->SetParameters(params);
979 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
980
981 DestroyAudioRtpSender();
982}
983
984TEST_F(RtpSenderReceiverTest, AudioSenderCheckTransactionIdRefresh) {
985 CreateAudioRtpSender();
986
987 RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200988 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 15:31:53 +0200989 auto saved_transaction_id = params.transaction_id;
990 params = audio_rtp_sender_->GetParameters();
991 EXPECT_NE(saved_transaction_id, params.transaction_id);
992
993 DestroyAudioRtpSender();
994}
995
996TEST_F(RtpSenderReceiverTest, AudioSenderSetParametersOldValueFail) {
997 CreateAudioRtpSender();
998
999 RtpParameters params = audio_rtp_sender_->GetParameters();
1000 RtpParameters second_params = audio_rtp_sender_->GetParameters();
1001
1002 RTCError result = audio_rtp_sender_->SetParameters(params);
1003 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
Seth Hampson2d2c8882018-05-16 16:02:32 -07001004 DestroyAudioRtpSender();
1005}
1006
1007TEST_F(RtpSenderReceiverTest, AudioSenderCantSetUnimplementedRtpParameters) {
1008 CreateAudioRtpSender();
1009 RtpParameters params = audio_rtp_sender_->GetParameters();
1010 EXPECT_EQ(1u, params.encodings.size());
1011
Florent Castelli87b3c512018-07-18 16:00:28 +02001012 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 16:02:32 -07001013 params.mid = "dummy_mid";
1014 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1015 audio_rtp_sender_->SetParameters(params).type());
1016 params = audio_rtp_sender_->GetParameters();
1017
Seth Hampson2d2c8882018-05-16 16:02:32 -07001018 DestroyAudioRtpSender();
1019}
1020
1021TEST_F(RtpSenderReceiverTest,
1022 AudioSenderCantSetUnimplementedRtpEncodingParameters) {
1023 CreateAudioRtpSender();
1024 RtpParameters params = audio_rtp_sender_->GetParameters();
1025 EXPECT_EQ(1u, params.encodings.size());
1026
Henrik Grunelle1301a82018-12-13 12:13:22 +00001027 // Unimplemented RtpParameters: codec_payload_type, fec, rtx, dtx, ptime,
Amit Hilbuchaa584152019-02-06 17:09:52 -08001028 // scale_framerate_down_by, dependency_rids.
Henrik Grunelle1301a82018-12-13 12:13:22 +00001029 params.encodings[0].codec_payload_type = 1;
1030 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1031 audio_rtp_sender_->SetParameters(params).type());
1032 params = audio_rtp_sender_->GetParameters();
1033
Seth Hampson2d2c8882018-05-16 16:02:32 -07001034 params.encodings[0].fec = RtpFecParameters();
1035 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1036 audio_rtp_sender_->SetParameters(params).type());
1037 params = audio_rtp_sender_->GetParameters();
1038
1039 params.encodings[0].rtx = RtpRtxParameters();
1040 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1041 audio_rtp_sender_->SetParameters(params).type());
1042 params = audio_rtp_sender_->GetParameters();
1043
1044 params.encodings[0].dtx = DtxStatus::ENABLED;
1045 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1046 audio_rtp_sender_->SetParameters(params).type());
1047 params = audio_rtp_sender_->GetParameters();
1048
1049 params.encodings[0].ptime = 1;
1050 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1051 audio_rtp_sender_->SetParameters(params).type());
1052 params = audio_rtp_sender_->GetParameters();
1053
Seth Hampson2d2c8882018-05-16 16:02:32 -07001054 params.encodings[0].dependency_rids.push_back("dummy_rid");
1055 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1056 audio_rtp_sender_->SetParameters(params).type());
Florent Castellicebf50f2018-05-03 15:31:53 +02001057
1058 DestroyAudioRtpSender();
1059}
1060
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001061TEST_F(RtpSenderReceiverTest, SetAudioMaxSendBitrate) {
1062 CreateAudioRtpSender();
1063
1064 EXPECT_EQ(-1, voice_media_channel_->max_bps());
1065 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001066 EXPECT_EQ(1U, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -08001067 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001068 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -08001069 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001070
1071 // Read back the parameters and verify they have been changed.
1072 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001073 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001074 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001075
1076 // Verify that the audio channel received the new parameters.
1077 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001078 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001079 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001080
1081 // Verify that the global bitrate limit has not been changed.
1082 EXPECT_EQ(-1, voice_media_channel_->max_bps());
1083
1084 DestroyAudioRtpSender();
1085}
1086
Seth Hampson24722b32017-12-22 09:36:42 -08001087TEST_F(RtpSenderReceiverTest, SetAudioBitratePriority) {
1088 CreateAudioRtpSender();
1089
1090 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001091 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001092 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1093 params.encodings[0].bitrate_priority);
1094 double new_bitrate_priority = 2.0;
1095 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -08001096 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -08001097
1098 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001099 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001100 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1101
1102 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001103 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001104 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1105
1106 DestroyAudioRtpSender();
1107}
1108
skvladdc1c62c2016-03-16 19:07:43 -07001109TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) {
1110 CreateVideoRtpSender();
1111
skvladdc1c62c2016-03-16 19:07:43 -07001112 RtpParameters params = video_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001113 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -08001114 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -07001115
1116 DestroyVideoRtpSender();
1117}
1118
Florent Castelli892acf02018-10-01 22:47:20 +02001119TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParametersBeforeNegotiation) {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -08001120 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, /*id=*/"");
Florent Castelli892acf02018-10-01 22:47:20 +02001121
1122 RtpParameters params = video_rtp_sender_->GetParameters();
1123 ASSERT_EQ(1u, params.encodings.size());
1124 params.encodings[0].max_bitrate_bps = 90000;
1125 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1126
1127 params = video_rtp_sender_->GetParameters();
1128 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1129 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
1130
1131 DestroyVideoRtpSender();
1132}
1133
1134TEST_F(RtpSenderReceiverTest, VideoSenderInitParametersMovedAfterNegotiation) {
1135 AddVideoTrack(false);
1136
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -08001137 video_rtp_sender_ =
1138 VideoRtpSender::Create(worker_thread_, video_track_->id());
Florent Castelli892acf02018-10-01 22:47:20 +02001139 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
1140 video_rtp_sender_->set_stream_ids({local_stream_->id()});
1141
1142 std::vector<RtpEncodingParameters> init_encodings(2);
1143 init_encodings[0].max_bitrate_bps = 60000;
1144 init_encodings[1].max_bitrate_bps = 900000;
1145 video_rtp_sender_->set_init_send_encodings(init_encodings);
1146
1147 RtpParameters params = video_rtp_sender_->GetParameters();
1148 ASSERT_EQ(2u, params.encodings.size());
1149 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1150 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
1151
1152 // Simulate the setLocalDescription call
1153 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +01001154 ssrcs.reserve(2);
Florent Castelli892acf02018-10-01 22:47:20 +02001155 for (int i = 0; i < 2; ++i)
1156 ssrcs.push_back(kVideoSsrcSimulcast + i);
1157 cricket::StreamParams stream_params =
1158 cricket::CreateSimStreamParams("cname", ssrcs);
1159 video_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -08001160 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +02001161 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
1162
1163 params = video_rtp_sender_->GetParameters();
1164 ASSERT_EQ(2u, params.encodings.size());
1165 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1166 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
1167
1168 DestroyVideoRtpSender();
1169}
1170
1171TEST_F(RtpSenderReceiverTest,
1172 VideoSenderInitParametersMovedAfterManualSimulcastAndNegotiation) {
1173 AddVideoTrack(false);
1174
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -08001175 video_rtp_sender_ =
1176 VideoRtpSender::Create(worker_thread_, video_track_->id());
Florent Castelli892acf02018-10-01 22:47:20 +02001177 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
1178 video_rtp_sender_->set_stream_ids({local_stream_->id()});
1179
1180 std::vector<RtpEncodingParameters> init_encodings(1);
1181 init_encodings[0].max_bitrate_bps = 60000;
1182 video_rtp_sender_->set_init_send_encodings(init_encodings);
1183
1184 RtpParameters params = video_rtp_sender_->GetParameters();
1185 ASSERT_EQ(1u, params.encodings.size());
1186 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1187
1188 // Simulate the setLocalDescription call as if the user used SDP munging
1189 // to enable simulcast
1190 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +01001191 ssrcs.reserve(2);
Florent Castelli892acf02018-10-01 22:47:20 +02001192 for (int i = 0; i < 2; ++i)
1193 ssrcs.push_back(kVideoSsrcSimulcast + i);
1194 cricket::StreamParams stream_params =
1195 cricket::CreateSimStreamParams("cname", ssrcs);
1196 video_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -08001197 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +02001198 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
1199
1200 params = video_rtp_sender_->GetParameters();
1201 ASSERT_EQ(2u, params.encodings.size());
1202 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1203
1204 DestroyVideoRtpSender();
1205}
1206
1207TEST_F(RtpSenderReceiverTest,
1208 VideoSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -08001209 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, /*id=*/"");
Florent Castelli892acf02018-10-01 22:47:20 +02001210
1211 RtpParameters params;
1212 RTCError result = video_rtp_sender_->SetParameters(params);
1213 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1214 DestroyVideoRtpSender();
1215}
1216
Florent Castellicebf50f2018-05-03 15:31:53 +02001217TEST_F(RtpSenderReceiverTest,
1218 VideoSenderMustCallGetParametersBeforeSetParameters) {
1219 CreateVideoRtpSender();
1220
1221 RtpParameters params;
1222 RTCError result = video_rtp_sender_->SetParameters(params);
1223 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1224
1225 DestroyVideoRtpSender();
1226}
1227
1228TEST_F(RtpSenderReceiverTest,
1229 VideoSenderSetParametersInvalidatesTransactionId) {
1230 CreateVideoRtpSender();
1231
1232 RtpParameters params = video_rtp_sender_->GetParameters();
1233 EXPECT_EQ(1u, params.encodings.size());
1234 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1235 RTCError result = video_rtp_sender_->SetParameters(params);
1236 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1237
1238 DestroyVideoRtpSender();
1239}
1240
1241TEST_F(RtpSenderReceiverTest, VideoSenderDetectTransactionIdModification) {
1242 CreateVideoRtpSender();
1243
1244 RtpParameters params = video_rtp_sender_->GetParameters();
1245 params.transaction_id = "";
1246 RTCError result = video_rtp_sender_->SetParameters(params);
1247 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1248
1249 DestroyVideoRtpSender();
1250}
1251
1252TEST_F(RtpSenderReceiverTest, VideoSenderCheckTransactionIdRefresh) {
1253 CreateVideoRtpSender();
1254
1255 RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001256 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 15:31:53 +02001257 auto saved_transaction_id = params.transaction_id;
1258 params = video_rtp_sender_->GetParameters();
1259 EXPECT_NE(saved_transaction_id, params.transaction_id);
1260
1261 DestroyVideoRtpSender();
1262}
1263
1264TEST_F(RtpSenderReceiverTest, VideoSenderSetParametersOldValueFail) {
1265 CreateVideoRtpSender();
1266
1267 RtpParameters params = video_rtp_sender_->GetParameters();
1268 RtpParameters second_params = video_rtp_sender_->GetParameters();
1269
1270 RTCError result = video_rtp_sender_->SetParameters(params);
1271 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1272
1273 DestroyVideoRtpSender();
1274}
1275
Seth Hampson2d2c8882018-05-16 16:02:32 -07001276TEST_F(RtpSenderReceiverTest, VideoSenderCantSetUnimplementedRtpParameters) {
1277 CreateVideoRtpSender();
1278 RtpParameters params = video_rtp_sender_->GetParameters();
1279 EXPECT_EQ(1u, params.encodings.size());
1280
Florent Castelli87b3c512018-07-18 16:00:28 +02001281 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 16:02:32 -07001282 params.mid = "dummy_mid";
1283 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1284 video_rtp_sender_->SetParameters(params).type());
1285 params = video_rtp_sender_->GetParameters();
1286
Seth Hampson2d2c8882018-05-16 16:02:32 -07001287 DestroyVideoRtpSender();
1288}
1289
1290TEST_F(RtpSenderReceiverTest,
1291 VideoSenderCantSetUnimplementedEncodingParameters) {
1292 CreateVideoRtpSender();
1293 RtpParameters params = video_rtp_sender_->GetParameters();
1294 EXPECT_EQ(1u, params.encodings.size());
1295
Henrik Grunelle1301a82018-12-13 12:13:22 +00001296 // Unimplemented RtpParameters: codec_payload_type, fec, rtx, dtx, ptime,
Amit Hilbuchaa584152019-02-06 17:09:52 -08001297 // scale_framerate_down_by, dependency_rids.
Henrik Grunelle1301a82018-12-13 12:13:22 +00001298 params.encodings[0].codec_payload_type = 1;
1299 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1300 video_rtp_sender_->SetParameters(params).type());
1301 params = video_rtp_sender_->GetParameters();
1302
Seth Hampson2d2c8882018-05-16 16:02:32 -07001303 params.encodings[0].fec = RtpFecParameters();
1304 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1305 video_rtp_sender_->SetParameters(params).type());
1306 params = video_rtp_sender_->GetParameters();
1307
1308 params.encodings[0].rtx = RtpRtxParameters();
1309 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1310 video_rtp_sender_->SetParameters(params).type());
1311 params = video_rtp_sender_->GetParameters();
1312
1313 params.encodings[0].dtx = DtxStatus::ENABLED;
1314 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1315 video_rtp_sender_->SetParameters(params).type());
1316 params = video_rtp_sender_->GetParameters();
1317
1318 params.encodings[0].ptime = 1;
1319 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1320 video_rtp_sender_->SetParameters(params).type());
1321 params = video_rtp_sender_->GetParameters();
1322
Seth Hampson2d2c8882018-05-16 16:02:32 -07001323 params.encodings[0].dependency_rids.push_back("dummy_rid");
1324 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1325 video_rtp_sender_->SetParameters(params).type());
1326
1327 DestroyVideoRtpSender();
1328}
1329
Florent Castellic1a0bcb2019-01-29 14:26:48 +01001330TEST_F(RtpSenderReceiverTest, VideoSenderCanSetScaleResolutionDownBy) {
1331 CreateVideoRtpSender();
1332
1333 RtpParameters params = video_rtp_sender_->GetParameters();
1334 params.encodings[0].scale_resolution_down_by = 2;
1335
1336 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1337 params = video_rtp_sender_->GetParameters();
1338 EXPECT_EQ(2, params.encodings[0].scale_resolution_down_by);
1339
1340 DestroyVideoRtpSender();
1341}
1342
1343TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidScaleResolutionDownBy) {
1344 CreateVideoRtpSender();
1345
1346 RtpParameters params = video_rtp_sender_->GetParameters();
1347 params.encodings[0].scale_resolution_down_by = 0.5;
1348 RTCError result = video_rtp_sender_->SetParameters(params);
1349 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1350
1351 DestroyVideoRtpSender();
1352}
1353
Florent Castelli892acf02018-10-01 22:47:20 +02001354TEST_F(RtpSenderReceiverTest,
1355 VideoSenderCantSetUnimplementedEncodingParametersWithSimulcast) {
1356 CreateVideoRtpSenderWithSimulcast();
1357 RtpParameters params = video_rtp_sender_->GetParameters();
1358 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
1359
Henrik Grunelle1301a82018-12-13 12:13:22 +00001360 // Unimplemented RtpParameters: codec_payload_type, fec, rtx, dtx, ptime,
Amit Hilbuchaa584152019-02-06 17:09:52 -08001361 // scale_framerate_down_by, dependency_rids.
Florent Castelli892acf02018-10-01 22:47:20 +02001362 for (size_t i = 0; i < params.encodings.size(); i++) {
Henrik Grunelle1301a82018-12-13 12:13:22 +00001363 params.encodings[i].codec_payload_type = 1;
1364 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1365 video_rtp_sender_->SetParameters(params).type());
1366 params = video_rtp_sender_->GetParameters();
1367
Florent Castelli892acf02018-10-01 22:47:20 +02001368 params.encodings[i].fec = RtpFecParameters();
1369 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1370 video_rtp_sender_->SetParameters(params).type());
1371 params = video_rtp_sender_->GetParameters();
1372
1373 params.encodings[i].rtx = RtpRtxParameters();
1374 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1375 video_rtp_sender_->SetParameters(params).type());
1376 params = video_rtp_sender_->GetParameters();
1377
1378 params.encodings[i].dtx = DtxStatus::ENABLED;
1379 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1380 video_rtp_sender_->SetParameters(params).type());
1381 params = video_rtp_sender_->GetParameters();
1382
1383 params.encodings[i].ptime = 1;
1384 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1385 video_rtp_sender_->SetParameters(params).type());
1386 params = video_rtp_sender_->GetParameters();
1387
Florent Castelli892acf02018-10-01 22:47:20 +02001388 params.encodings[i].dependency_rids.push_back("dummy_rid");
1389 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1390 video_rtp_sender_->SetParameters(params).type());
Amit Hilbuch619b2942019-02-26 15:55:19 -08001391 params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001392 }
1393
1394 DestroyVideoRtpSender();
1395}
1396
Seth Hampson2d2c8882018-05-16 16:02:32 -07001397// A video sender can have multiple simulcast layers, in which case it will
1398// contain multiple RtpEncodingParameters. This tests that if this is the case
1399// (simulcast), then we can't set the bitrate_priority, or max_bitrate_bps
1400// for any encodings besides at index 0, because these are both implemented
1401// "per-sender."
1402TEST_F(RtpSenderReceiverTest, VideoSenderCantSetPerSenderEncodingParameters) {
1403 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001404 CreateVideoRtpSenderWithSimulcast();
Seth Hampson2d2c8882018-05-16 16:02:32 -07001405 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001406 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Seth Hampson2d2c8882018-05-16 16:02:32 -07001407
1408 params.encodings[1].bitrate_priority = 2.0;
1409 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1410 video_rtp_sender_->SetParameters(params).type());
1411 params = video_rtp_sender_->GetParameters();
1412
Seth Hampson2d2c8882018-05-16 16:02:32 -07001413 DestroyVideoRtpSender();
1414}
1415
Florent Castelli892acf02018-10-01 22:47:20 +02001416TEST_F(RtpSenderReceiverTest, VideoSenderCantSetReadOnlyEncodingParameters) {
1417 // Add a simulcast specific send stream that contains 2 encoding parameters.
1418 CreateVideoRtpSenderWithSimulcast();
1419 RtpParameters params = video_rtp_sender_->GetParameters();
1420 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
1421
1422 for (size_t i = 0; i < params.encodings.size(); i++) {
1423 params.encodings[i].ssrc = 1337;
1424 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION,
1425 video_rtp_sender_->SetParameters(params).type());
1426 params = video_rtp_sender_->GetParameters();
1427 }
1428
1429 DestroyVideoRtpSender();
1430}
1431
Ă…sa Persson55659812018-06-18 17:51:32 +02001432TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrate) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001433 CreateVideoRtpSender();
1434
1435 EXPECT_EQ(-1, video_media_channel_->max_bps());
1436 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001437 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001438 EXPECT_FALSE(params.encodings[0].min_bitrate_bps);
deadbeefe702b302017-02-04 12:09:01 -08001439 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Ă…sa Persson55659812018-06-18 17:51:32 +02001440 params.encodings[0].min_bitrate_bps = 100;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001441 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -08001442 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001443
1444 // Read back the parameters and verify they have been changed.
1445 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001446 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001447 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001448 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001449
1450 // Verify that the video channel received the new parameters.
1451 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001452 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001453 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001454 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001455
1456 // Verify that the global bitrate limit has not been changed.
1457 EXPECT_EQ(-1, video_media_channel_->max_bps());
1458
1459 DestroyVideoRtpSender();
1460}
1461
Ă…sa Persson55659812018-06-18 17:51:32 +02001462TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrateSimulcast) {
1463 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001464 CreateVideoRtpSenderWithSimulcast();
Ă…sa Persson55659812018-06-18 17:51:32 +02001465
1466 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001467 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001468 params.encodings[0].min_bitrate_bps = 100;
1469 params.encodings[0].max_bitrate_bps = 1000;
1470 params.encodings[1].min_bitrate_bps = 200;
1471 params.encodings[1].max_bitrate_bps = 2000;
1472 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1473
1474 // Verify that the video channel received the new parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001475 params = video_media_channel_->GetRtpSendParameters(kVideoSsrcSimulcast);
1476 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001477 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
1478 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
1479 EXPECT_EQ(200, params.encodings[1].min_bitrate_bps);
1480 EXPECT_EQ(2000, params.encodings[1].max_bitrate_bps);
1481
1482 DestroyVideoRtpSender();
1483}
1484
Seth Hampson24722b32017-12-22 09:36:42 -08001485TEST_F(RtpSenderReceiverTest, SetVideoBitratePriority) {
1486 CreateVideoRtpSender();
1487
1488 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001489 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001490 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1491 params.encodings[0].bitrate_priority);
1492 double new_bitrate_priority = 2.0;
1493 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -08001494 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -08001495
1496 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001497 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001498 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1499
1500 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001501 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001502 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1503
1504 DestroyVideoRtpSender();
1505}
1506
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001507TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetParameters) {
1508 CreateAudioRtpReceiver();
1509
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001510 RtpParameters params = audio_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001511 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001512 EXPECT_TRUE(audio_rtp_receiver_->SetParameters(params));
1513
1514 DestroyAudioRtpReceiver();
1515}
1516
1517TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetParameters) {
1518 CreateVideoRtpReceiver();
1519
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001520 RtpParameters params = video_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001521 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001522 EXPECT_TRUE(video_rtp_receiver_->SetParameters(params));
1523
1524 DestroyVideoRtpReceiver();
1525}
1526
Florent Castelli38332cd2018-11-20 14:08:06 +01001527TEST_F(RtpSenderReceiverTest, VideoReceiverCanGetParametersWithSimulcast) {
1528 CreateVideoRtpReceiverWithSimulcast({}, 2);
1529
1530 RtpParameters params = video_rtp_receiver_->GetParameters();
1531 EXPECT_EQ(2u, params.encodings.size());
1532
1533 DestroyVideoRtpReceiver();
1534}
1535
pbos5214a0a2016-12-16 15:39:11 -08001536// Test that makes sure that a video track content hint translates to the proper
1537// value for sources that are not screencast.
1538TEST_F(RtpSenderReceiverTest, PropagatesVideoTrackContentHint) {
1539 CreateVideoRtpSender();
1540
1541 video_track_->set_enabled(true);
1542
1543 // |video_track_| is not screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001544 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001545 // No content hint should be set by default.
1546 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1547 video_track_->content_hint());
1548 // Setting detailed should turn a non-screencast source into screencast mode.
1549 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001550 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001551 // Removing the content hint should turn the track back into non-screencast
1552 // mode.
1553 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001554 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001555 // Setting fluid should remain in non-screencast mode (its default).
1556 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001557 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 08:53:10 +02001558 // Setting text should have the same effect as Detailed
1559 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
1560 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001561
1562 DestroyVideoRtpSender();
1563}
1564
1565// Test that makes sure that a video track content hint translates to the proper
1566// value for screencast sources.
1567TEST_F(RtpSenderReceiverTest,
1568 PropagatesVideoTrackContentHintForScreencastSource) {
1569 CreateVideoRtpSender(true);
1570
1571 video_track_->set_enabled(true);
1572
1573 // |video_track_| with a screencast source should be screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001574 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001575 // No content hint should be set by default.
1576 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1577 video_track_->content_hint());
1578 // Setting fluid should turn a screencast source into non-screencast mode.
1579 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001580 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001581 // Removing the content hint should turn the track back into screencast mode.
1582 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001583 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001584 // Setting detailed should still remain in screencast mode (its default).
1585 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001586 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 08:53:10 +02001587 // Setting text should have the same effect as Detailed
1588 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
1589 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001590
1591 DestroyVideoRtpSender();
1592}
1593
1594// Test that makes sure any content hints that are set on a track before
1595// VideoRtpSender is ready to send are still applied when it gets ready to send.
1596TEST_F(RtpSenderReceiverTest,
1597 PropagatesVideoTrackContentHintSetBeforeEnabling) {
1598 AddVideoTrack();
1599 // Setting detailed overrides the default non-screencast mode. This should be
1600 // applied even if the track is set on construction.
1601 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -08001602 video_rtp_sender_ =
1603 VideoRtpSender::Create(worker_thread_, video_track_->id());
Steve Anton111fdfd2018-06-25 13:03:36 -07001604 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
1605 video_rtp_sender_->set_stream_ids({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -08001606 video_rtp_sender_->SetMediaChannel(video_media_channel_);
pbos5214a0a2016-12-16 15:39:11 -08001607 video_track_->set_enabled(true);
1608
1609 // Sender is not ready to send (no SSRC) so no option should have been set.
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001610 EXPECT_EQ(absl::nullopt, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001611
1612 // Verify that the content hint is accounted for when video_rtp_sender_ does
1613 // get enabled.
1614 video_rtp_sender_->SetSsrc(kVideoSsrc);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001615 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001616
1617 // And removing the hint should go back to false (to verify that false was
1618 // default correctly).
1619 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001620 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001621
1622 DestroyVideoRtpSender();
1623}
1624
deadbeef20cb0c12017-02-01 20:27:00 -08001625TEST_F(RtpSenderReceiverTest, AudioSenderHasDtmfSender) {
1626 CreateAudioRtpSender();
1627 EXPECT_NE(nullptr, audio_rtp_sender_->GetDtmfSender());
1628}
1629
1630TEST_F(RtpSenderReceiverTest, VideoSenderDoesNotHaveDtmfSender) {
1631 CreateVideoRtpSender();
1632 EXPECT_EQ(nullptr, video_rtp_sender_->GetDtmfSender());
1633}
1634
1635// Test that the DTMF sender is really using |voice_channel_|, and thus returns
1636// true/false from CanSendDtmf based on what |voice_channel_| returns.
1637TEST_F(RtpSenderReceiverTest, CanInsertDtmf) {
1638 AddDtmfCodec();
1639 CreateAudioRtpSender();
1640 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1641 ASSERT_NE(nullptr, dtmf_sender);
1642 EXPECT_TRUE(dtmf_sender->CanInsertDtmf());
1643}
1644
1645TEST_F(RtpSenderReceiverTest, CanNotInsertDtmf) {
1646 CreateAudioRtpSender();
1647 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1648 ASSERT_NE(nullptr, dtmf_sender);
1649 // DTMF codec has not been added, as it was in the above test.
1650 EXPECT_FALSE(dtmf_sender->CanInsertDtmf());
1651}
1652
1653TEST_F(RtpSenderReceiverTest, InsertDtmf) {
1654 AddDtmfCodec();
1655 CreateAudioRtpSender();
1656 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1657 ASSERT_NE(nullptr, dtmf_sender);
1658
1659 EXPECT_EQ(0U, voice_media_channel_->dtmf_info_queue().size());
1660
1661 // Insert DTMF
1662 const int expected_duration = 90;
1663 dtmf_sender->InsertDtmf("012", expected_duration, 100);
1664
1665 // Verify
1666 ASSERT_EQ_WAIT(3U, voice_media_channel_->dtmf_info_queue().size(),
1667 kDefaultTimeout);
1668 const uint32_t send_ssrc =
1669 voice_media_channel_->send_streams()[0].first_ssrc();
1670 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[0],
1671 send_ssrc, 0, expected_duration));
1672 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[1],
1673 send_ssrc, 1, expected_duration));
1674 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[2],
1675 send_ssrc, 2, expected_duration));
1676}
1677
1678// Make sure the signal from "GetOnDestroyedSignal()" fires when the sender is
1679// destroyed, which is needed for the DTMF sender.
1680TEST_F(RtpSenderReceiverTest, TestOnDestroyedSignal) {
1681 CreateAudioRtpSender();
1682 EXPECT_FALSE(audio_sender_destroyed_signal_fired_);
1683 audio_rtp_sender_ = nullptr;
1684 EXPECT_TRUE(audio_sender_destroyed_signal_fired_);
1685}
1686
Benjamin Wright84583f62018-10-04 14:22:34 -07001687// Validate that the default FrameEncryptor setting is nullptr.
1688TEST_F(RtpSenderReceiverTest, AudioSenderCanSetFrameEncryptor) {
1689 CreateAudioRtpSender();
1690 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1691 new FakeFrameEncryptor());
1692 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1693 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1694 EXPECT_EQ(fake_frame_encryptor.get(),
1695 audio_rtp_sender_->GetFrameEncryptor().get());
1696}
1697
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001698// Validate that setting a FrameEncryptor after the send stream is stopped does
1699// nothing.
1700TEST_F(RtpSenderReceiverTest, AudioSenderCannotSetFrameEncryptorAfterStop) {
1701 CreateAudioRtpSender();
1702 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1703 new FakeFrameEncryptor());
1704 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1705 audio_rtp_sender_->Stop();
1706 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1707 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1708}
1709
Benjamin Wright84583f62018-10-04 14:22:34 -07001710// Validate that the default FrameEncryptor setting is nullptr.
1711TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetFrameDecryptor) {
1712 CreateAudioRtpReceiver();
1713 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1714 new FakeFrameDecryptor());
1715 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
1716 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1717 EXPECT_EQ(fake_frame_decryptor.get(),
1718 audio_rtp_receiver_->GetFrameDecryptor().get());
1719}
1720
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001721// Validate that the default FrameEncryptor setting is nullptr.
1722TEST_F(RtpSenderReceiverTest, AudioReceiverCannotSetFrameDecryptorAfterStop) {
1723 CreateAudioRtpReceiver();
1724 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1725 new FakeFrameDecryptor());
1726 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
1727 audio_rtp_receiver_->Stop();
1728 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1729 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1730}
1731
1732// Validate that the default FrameEncryptor setting is nullptr.
1733TEST_F(RtpSenderReceiverTest, VideoSenderCanSetFrameEncryptor) {
1734 CreateVideoRtpSender();
1735 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1736 new FakeFrameEncryptor());
1737 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1738 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1739 EXPECT_EQ(fake_frame_encryptor.get(),
1740 video_rtp_sender_->GetFrameEncryptor().get());
1741}
1742
1743// Validate that setting a FrameEncryptor after the send stream is stopped does
1744// nothing.
1745TEST_F(RtpSenderReceiverTest, VideoSenderCannotSetFrameEncryptorAfterStop) {
1746 CreateVideoRtpSender();
1747 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1748 new FakeFrameEncryptor());
1749 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1750 video_rtp_sender_->Stop();
1751 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1752 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1753}
1754
1755// Validate that the default FrameEncryptor setting is nullptr.
1756TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetFrameDecryptor) {
1757 CreateVideoRtpReceiver();
1758 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1759 new FakeFrameDecryptor());
1760 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
1761 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1762 EXPECT_EQ(fake_frame_decryptor.get(),
1763 video_rtp_receiver_->GetFrameDecryptor().get());
1764}
1765
1766// Validate that the default FrameEncryptor setting is nullptr.
1767TEST_F(RtpSenderReceiverTest, VideoReceiverCannotSetFrameDecryptorAfterStop) {
1768 CreateVideoRtpReceiver();
1769 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1770 new FakeFrameDecryptor());
1771 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
1772 video_rtp_receiver_->Stop();
1773 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1774 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1775}
1776
Amit Hilbuch619b2942019-02-26 15:55:19 -08001777// Checks that calling the internal methods for get/set parameters do not
1778// invalidate any parameters retreived by clients.
1779TEST_F(RtpSenderReceiverTest,
1780 InternalParameterMethodsDoNotInvalidateTransaction) {
1781 CreateVideoRtpSender();
1782 RtpParameters parameters = video_rtp_sender_->GetParameters();
1783 RtpParameters new_parameters = video_rtp_sender_->GetParametersInternal();
1784 new_parameters.encodings[0].active = false;
1785 video_rtp_sender_->SetParametersInternal(new_parameters);
1786 new_parameters.encodings[0].active = true;
1787 video_rtp_sender_->SetParametersInternal(new_parameters);
1788 parameters.encodings[0].active = false;
1789 EXPECT_TRUE(video_rtp_sender_->SetParameters(parameters).ok());
1790}
1791
Amit Hilbuch2297d332019-02-19 12:49:22 -08001792// Helper method for syntactic sugar for accepting a vector with '{}' notation.
1793std::pair<RidList, RidList> CreatePairOfRidVectors(
1794 const std::vector<std::string>& first,
1795 const std::vector<std::string>& second) {
1796 return std::make_pair(first, second);
1797}
1798
1799// These parameters are used to test disabling simulcast layers.
1800const std::pair<RidList, RidList> kDisableSimulcastLayersParameters[] = {
1801 // Tests removing the first layer. This is a special case because
1802 // the first layer's SSRC is also the 'primary' SSRC used to associate the
1803 // parameters to the media channel.
1804 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"1"}),
1805 // Tests removing some layers.
1806 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"2", "4"}),
1807 // Tests simulcast rejected scenario all layers except first are rejected.
1808 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"2", "3", "4"}),
1809 // Tests removing all layers.
1810 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"1", "2", "3", "4"}),
1811};
1812
1813// Runs test for disabling layers on a sender without a media engine set.
1814TEST_P(RtpSenderReceiverTest, DisableSimulcastLayersWithoutMediaEngine) {
1815 auto parameter = GetParam();
1816 RunDisableSimulcastLayersWithoutMediaEngineTest(parameter.first,
1817 parameter.second);
1818}
1819
1820// Runs test for disabling layers on a sender with a media engine set.
1821TEST_P(RtpSenderReceiverTest, DisableSimulcastLayersWithMediaEngine) {
1822 auto parameter = GetParam();
1823 RunDisableSimulcastLayersWithMediaEngineTest(parameter.first,
1824 parameter.second);
1825}
1826
1827INSTANTIATE_TEST_SUITE_P(
1828 DisableSimulcastLayersInSender,
1829 RtpSenderReceiverTest,
1830 ::testing::ValuesIn(kDisableSimulcastLayersParameters));
1831
deadbeef70ab1a12015-09-28 16:53:55 -07001832} // namespace webrtc