blob: e6d008378e69db2b4b2eaa4a42bd9491eb5af686 [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"
Yves Gerey3e707812018-11-28 16:47:49 +010032#include "logging/rtc_event_log/rtc_event_log.h"
33#include "media/base/codec.h"
Steve Anton10542f22019-01-11 09:11:00 -080034#include "media/base/fake_media_engine.h"
35#include "media/base/media_channel.h"
36#include "media/base/media_config.h"
37#include "media/base/media_engine.h"
38#include "media/base/rtp_data_engine.h"
39#include "media/base/stream_params.h"
40#include "media/base/test_utils.h"
41#include "media/engine/fake_webrtc_call.h"
42#include "p2p/base/dtls_transport_internal.h"
43#include "p2p/base/fake_dtls_transport.h"
44#include "p2p/base/p2p_constants.h"
Ruslan Burakov501bfba2019-02-11 10:29:19 +010045#include "pc/audio_rtp_receiver.h"
Steve Anton10542f22019-01-11 09:11:00 -080046#include "pc/audio_track.h"
Yves Gerey3e707812018-11-28 16:47:49 +010047#include "pc/channel.h"
Steve Anton10542f22019-01-11 09:11:00 -080048#include "pc/channel_manager.h"
49#include "pc/dtls_srtp_transport.h"
50#include "pc/local_audio_source.h"
51#include "pc/media_stream.h"
Ruslan Burakov7ea46052019-02-16 02:07:05 +010052#include "pc/remote_audio_source.h"
Steve Anton10542f22019-01-11 09:11:00 -080053#include "pc/rtp_receiver.h"
54#include "pc/rtp_sender.h"
55#include "pc/rtp_transport_internal.h"
56#include "pc/test/fake_video_track_source.h"
Ruslan Burakov501bfba2019-02-11 10:29:19 +010057#include "pc/video_rtp_receiver.h"
Steve Anton10542f22019-01-11 09:11:00 -080058#include "pc/video_track.h"
Yves Gerey3e707812018-11-28 16:47:49 +010059#include "rtc_base/checks.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020060#include "rtc_base/gunit.h"
Yves Gerey3e707812018-11-28 16:47:49 +010061#include "rtc_base/third_party/sigslot/sigslot.h"
62#include "rtc_base/thread.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020063#include "test/gmock.h"
64#include "test/gtest.h"
deadbeef70ab1a12015-09-28 16:53:55 -070065
66using ::testing::_;
Amit Hilbuch2297d332019-02-19 12:49:22 -080067using ::testing::ContainerEq;
deadbeef70ab1a12015-09-28 16:53:55 -070068using ::testing::Exactly;
deadbeef5dd42fd2016-05-02 16:20:01 -070069using ::testing::InvokeWithoutArgs;
skvladdc1c62c2016-03-16 19:07:43 -070070using ::testing::Return;
Amit Hilbuch2297d332019-02-19 12:49:22 -080071using RidList = std::vector<std::string>;
deadbeef70ab1a12015-09-28 16:53:55 -070072
deadbeef20cb0c12017-02-01 20:27:00 -080073namespace {
74
Seth Hampson845e8782018-03-02 11:34:10 -080075static const char kStreamId1[] = "local_stream_1";
deadbeef70ab1a12015-09-28 16:53:55 -070076static const char kVideoTrackId[] = "video_1";
77static const char kAudioTrackId[] = "audio_1";
Peter Boström0c4e06b2015-10-07 12:23:21 +020078static const uint32_t kVideoSsrc = 98;
deadbeeffac06552015-11-25 11:26:01 -080079static const uint32_t kVideoSsrc2 = 100;
Peter Boström0c4e06b2015-10-07 12:23:21 +020080static const uint32_t kAudioSsrc = 99;
deadbeeffac06552015-11-25 11:26:01 -080081static const uint32_t kAudioSsrc2 = 101;
Florent Castelli892acf02018-10-01 22:47:20 +020082static const uint32_t kVideoSsrcSimulcast = 102;
83static const uint32_t kVideoSimulcastLayerCount = 2;
deadbeef20cb0c12017-02-01 20:27:00 -080084static const int kDefaultTimeout = 10000; // 10 seconds.
deadbeef20cb0c12017-02-01 20:27:00 -080085} // namespace
deadbeef70ab1a12015-09-28 16:53:55 -070086
87namespace webrtc {
88
Amit Hilbuch2297d332019-02-19 12:49:22 -080089class RtpSenderReceiverTest
90 : public testing::Test,
91 public testing::WithParamInterface<std::pair<RidList, RidList>>,
92 public sigslot::has_slots<> {
tkchin3784b4a2016-06-24 19:31:47 -070093 public:
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070094 RtpSenderReceiverTest()
Steve Anton47136dd2018-01-12 10:49:35 -080095 : network_thread_(rtc::Thread::Current()),
96 worker_thread_(rtc::Thread::Current()),
97 // Create fake media engine/etc. so we can create channels to use to
98 // test RtpSenders/RtpReceivers.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070099 media_engine_(new cricket::FakeMediaEngine()),
Karl Wiberg918f50c2018-07-05 11:40:33 +0200100 channel_manager_(absl::WrapUnique(media_engine_),
101 absl::make_unique<cricket::RtpDataEngine>(),
Steve Anton47136dd2018-01-12 10:49:35 -0800102 worker_thread_,
103 network_thread_),
Sebastian Jansson8f83b422018-02-21 13:07:13 +0100104 fake_call_(),
Seth Hampson845e8782018-03-02 11:34:10 -0800105 local_stream_(MediaStream::Create(kStreamId1)) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700106 // Create channels to be used by the RtpSenders and RtpReceivers.
107 channel_manager_.Init();
deadbeef7af91dd2016-12-13 11:29:11 -0800108 bool srtp_required = true;
Karl Wiberg918f50c2018-07-05 11:40:33 +0200109 rtp_dtls_transport_ = absl::make_unique<cricket::FakeDtlsTransport>(
Zhi Huange830e682018-03-30 10:48:35 -0700110 "fake_dtls_transport", cricket::ICE_CANDIDATE_COMPONENT_RTP);
111 rtp_transport_ = CreateDtlsSrtpTransport();
112
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700113 voice_channel_ = channel_manager_.CreateVoiceChannel(
Zhi Huange830e682018-03-30 10:48:35 -0700114 &fake_call_, cricket::MediaConfig(), rtp_transport_.get(),
Anton Sukhanov98a462c2018-10-17 13:15:42 -0700115 /*media_transport=*/nullptr, rtc::Thread::Current(), cricket::CN_AUDIO,
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800116 srtp_required, webrtc::CryptoOptions(), &ssrc_generator_,
117 cricket::AudioOptions());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700118 video_channel_ = channel_manager_.CreateVideoChannel(
Zhi Huange830e682018-03-30 10:48:35 -0700119 &fake_call_, cricket::MediaConfig(), rtp_transport_.get(),
Niels Möller46879152019-01-07 15:54:47 +0100120 /*media_transport=*/nullptr, rtc::Thread::Current(), cricket::CN_VIDEO,
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800121 srtp_required, webrtc::CryptoOptions(), &ssrc_generator_,
122 cricket::VideoOptions());
deadbeef20cb0c12017-02-01 20:27:00 -0800123 voice_channel_->Enable(true);
124 video_channel_->Enable(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700125 voice_media_channel_ = media_engine_->GetVoiceChannel(0);
126 video_media_channel_ = media_engine_->GetVideoChannel(0);
127 RTC_CHECK(voice_channel_);
128 RTC_CHECK(video_channel_);
129 RTC_CHECK(voice_media_channel_);
130 RTC_CHECK(video_media_channel_);
131
132 // Create streams for predefined SSRCs. Streams need to exist in order
133 // for the senders and receievers to apply parameters to them.
134 // Normally these would be created by SetLocalDescription and
135 // SetRemoteDescription.
136 voice_media_channel_->AddSendStream(
137 cricket::StreamParams::CreateLegacy(kAudioSsrc));
138 voice_media_channel_->AddRecvStream(
139 cricket::StreamParams::CreateLegacy(kAudioSsrc));
140 voice_media_channel_->AddSendStream(
141 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
142 voice_media_channel_->AddRecvStream(
143 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
144 video_media_channel_->AddSendStream(
145 cricket::StreamParams::CreateLegacy(kVideoSsrc));
146 video_media_channel_->AddRecvStream(
147 cricket::StreamParams::CreateLegacy(kVideoSsrc));
148 video_media_channel_->AddSendStream(
149 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
150 video_media_channel_->AddRecvStream(
151 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
tkchin3784b4a2016-06-24 19:31:47 -0700152 }
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700153
Zhi Huange830e682018-03-30 10:48:35 -0700154 std::unique_ptr<webrtc::RtpTransportInternal> CreateDtlsSrtpTransport() {
Karl Wiberg918f50c2018-07-05 11:40:33 +0200155 auto dtls_srtp_transport = absl::make_unique<webrtc::DtlsSrtpTransport>(
156 /*rtcp_mux_required=*/true);
Zhi Huange830e682018-03-30 10:48:35 -0700157 dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport_.get(),
158 /*rtcp_dtls_transport=*/nullptr);
159 return dtls_srtp_transport;
160 }
161
deadbeef20cb0c12017-02-01 20:27:00 -0800162 // Needed to use DTMF sender.
163 void AddDtmfCodec() {
164 cricket::AudioSendParameters params;
165 const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000,
166 0, 1);
167 params.codecs.push_back(kTelephoneEventCodec);
168 voice_media_channel_->SetSendParameters(params);
169 }
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700170
pbos5214a0a2016-12-16 15:39:11 -0800171 void AddVideoTrack() { AddVideoTrack(false); }
172
173 void AddVideoTrack(bool is_screencast) {
perkja3ede6c2016-03-08 01:27:48 +0100174 rtc::scoped_refptr<VideoTrackSourceInterface> source(
pbos5214a0a2016-12-16 15:39:11 -0800175 FakeVideoTrackSource::Create(is_screencast));
perkj773be362017-07-31 23:22:01 -0700176 video_track_ =
177 VideoTrack::Create(kVideoTrackId, source, rtc::Thread::Current());
deadbeefe814a0d2017-02-25 18:15:09 -0800178 EXPECT_TRUE(local_stream_->AddTrack(video_track_));
deadbeef70ab1a12015-09-28 16:53:55 -0700179 }
180
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700181 void CreateAudioRtpSender() { CreateAudioRtpSender(nullptr); }
182
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +0100183 void CreateAudioRtpSender(
184 const rtc::scoped_refptr<LocalAudioSource>& source) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700185 audio_track_ = AudioTrack::Create(kAudioTrackId, source);
deadbeefe814a0d2017-02-25 18:15:09 -0800186 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
Steve Anton47136dd2018-01-12 10:49:35 -0800187 audio_rtp_sender_ =
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800188 AudioRtpSender::Create(worker_thread_, audio_track_->id(), nullptr);
Steve Anton111fdfd2018-06-25 13:03:36 -0700189 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_));
190 audio_rtp_sender_->set_stream_ids({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800191 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
deadbeeffac06552015-11-25 11:26:01 -0800192 audio_rtp_sender_->SetSsrc(kAudioSsrc);
deadbeef20cb0c12017-02-01 20:27:00 -0800193 audio_rtp_sender_->GetOnDestroyedSignal()->connect(
194 this, &RtpSenderReceiverTest::OnAudioSenderDestroyed);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700195 VerifyVoiceChannelInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700196 }
197
Steve Anton02ee47c2018-01-10 16:26:06 -0800198 void CreateAudioRtpSenderWithNoTrack() {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800199 audio_rtp_sender_ =
200 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800201 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
Steve Anton02ee47c2018-01-10 16:26:06 -0800202 }
203
deadbeef20cb0c12017-02-01 20:27:00 -0800204 void OnAudioSenderDestroyed() { audio_sender_destroyed_signal_fired_ = true; }
205
Seth Hampson2d2c8882018-05-16 16:02:32 -0700206 void CreateVideoRtpSender(uint32_t ssrc) {
207 CreateVideoRtpSender(false, ssrc);
208 }
209
pbos5214a0a2016-12-16 15:39:11 -0800210 void CreateVideoRtpSender() { CreateVideoRtpSender(false); }
211
Amit Hilbuch2297d332019-02-19 12:49:22 -0800212 cricket::StreamParams CreateSimulcastStreamParams(int num_layers) {
Florent Castelli892acf02018-10-01 22:47:20 +0200213 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +0100214 ssrcs.reserve(num_layers);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800215 for (int i = 0; i < num_layers; ++i) {
Florent Castelli892acf02018-10-01 22:47:20 +0200216 ssrcs.push_back(kVideoSsrcSimulcast + i);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800217 }
218 return cricket::CreateSimStreamParams("cname", ssrcs);
219 }
220
221 uint32_t CreateVideoRtpSender(const cricket::StreamParams& stream_params) {
Florent Castelli892acf02018-10-01 22:47:20 +0200222 video_media_channel_->AddSendStream(stream_params);
223 uint32_t primary_ssrc = stream_params.first_ssrc();
224 CreateVideoRtpSender(primary_ssrc);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800225 return primary_ssrc;
226 }
227
228 uint32_t CreateVideoRtpSenderWithSimulcast(
229 int num_layers = kVideoSimulcastLayerCount) {
230 return CreateVideoRtpSender(CreateSimulcastStreamParams(num_layers));
231 }
232
233 uint32_t CreateVideoRtpSenderWithSimulcast(
234 const std::vector<std::string>& rids) {
235 cricket::StreamParams stream_params =
236 CreateSimulcastStreamParams(rids.size());
237 std::vector<cricket::RidDescription> rid_descriptions;
238 absl::c_transform(
239 rids, std::back_inserter(rid_descriptions), [](const std::string& rid) {
240 return cricket::RidDescription(rid, cricket::RidDirection::kSend);
241 });
242 stream_params.set_rids(rid_descriptions);
243 return CreateVideoRtpSender(stream_params);
Florent Castelli892acf02018-10-01 22:47:20 +0200244 }
245
Seth Hampson2d2c8882018-05-16 16:02:32 -0700246 void CreateVideoRtpSender(bool is_screencast, uint32_t ssrc = kVideoSsrc) {
pbos5214a0a2016-12-16 15:39:11 -0800247 AddVideoTrack(is_screencast);
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800248 video_rtp_sender_ =
249 VideoRtpSender::Create(worker_thread_, video_track_->id());
Steve Anton111fdfd2018-06-25 13:03:36 -0700250 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
251 video_rtp_sender_->set_stream_ids({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800252 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Seth Hampson2d2c8882018-05-16 16:02:32 -0700253 video_rtp_sender_->SetSsrc(ssrc);
254 VerifyVideoChannelInput(ssrc);
deadbeef70ab1a12015-09-28 16:53:55 -0700255 }
Steve Anton02ee47c2018-01-10 16:26:06 -0800256 void CreateVideoRtpSenderWithNoTrack() {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800257 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, /*id=*/"");
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800258 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Steve Anton02ee47c2018-01-10 16:26:06 -0800259 }
260
deadbeef70ab1a12015-09-28 16:53:55 -0700261 void DestroyAudioRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700262 audio_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700263 VerifyVoiceChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700264 }
265
266 void DestroyVideoRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700267 video_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700268 VerifyVideoChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700269 }
270
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100271 void CreateAudioRtpReceiver(
272 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
Mirko Bonadei05cf6be2019-01-31 21:38:12 +0100273 audio_rtp_receiver_ =
274 new AudioRtpReceiver(rtc::Thread::Current(), kAudioTrackId, streams);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800275 audio_rtp_receiver_->SetMediaChannel(voice_media_channel_);
Steve Antond3679212018-01-17 17:41:02 -0800276 audio_rtp_receiver_->SetupMediaChannel(kAudioSsrc);
perkjd61bf802016-03-24 03:16:19 -0700277 audio_track_ = audio_rtp_receiver_->audio_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700278 VerifyVoiceChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700279 }
280
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100281 void CreateVideoRtpReceiver(
282 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
Mirko Bonadei05cf6be2019-01-31 21:38:12 +0100283 video_rtp_receiver_ =
284 new VideoRtpReceiver(rtc::Thread::Current(), kVideoTrackId, streams);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800285 video_rtp_receiver_->SetMediaChannel(video_media_channel_);
Steve Antond3679212018-01-17 17:41:02 -0800286 video_rtp_receiver_->SetupMediaChannel(kVideoSsrc);
perkjf0dcfe22016-03-10 18:32:00 +0100287 video_track_ = video_rtp_receiver_->video_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700288 VerifyVideoChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700289 }
290
Florent Castelli38332cd2018-11-20 14:08:06 +0100291 void CreateVideoRtpReceiverWithSimulcast(
292 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {},
293 int num_layers = kVideoSimulcastLayerCount) {
294 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +0100295 ssrcs.reserve(num_layers);
Florent Castelli38332cd2018-11-20 14:08:06 +0100296 for (int i = 0; i < num_layers; ++i)
297 ssrcs.push_back(kVideoSsrcSimulcast + i);
298 cricket::StreamParams stream_params =
299 cricket::CreateSimStreamParams("cname", ssrcs);
300 video_media_channel_->AddRecvStream(stream_params);
301 uint32_t primary_ssrc = stream_params.first_ssrc();
302
Mirko Bonadei05cf6be2019-01-31 21:38:12 +0100303 video_rtp_receiver_ =
304 new VideoRtpReceiver(rtc::Thread::Current(), kVideoTrackId, streams);
Florent Castelli38332cd2018-11-20 14:08:06 +0100305 video_rtp_receiver_->SetMediaChannel(video_media_channel_);
306 video_rtp_receiver_->SetupMediaChannel(primary_ssrc);
307 video_track_ = video_rtp_receiver_->video_track();
308 }
309
deadbeef70ab1a12015-09-28 16:53:55 -0700310 void DestroyAudioRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700311 audio_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700312 VerifyVoiceChannelNoOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700313 }
314
315 void DestroyVideoRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700316 video_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700317 VerifyVideoChannelNoOutput();
318 }
319
320 void VerifyVoiceChannelInput() { VerifyVoiceChannelInput(kAudioSsrc); }
321
322 void VerifyVoiceChannelInput(uint32_t ssrc) {
323 // Verify that the media channel has an audio source, and the stream isn't
324 // muted.
325 EXPECT_TRUE(voice_media_channel_->HasSource(ssrc));
326 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(ssrc));
327 }
328
329 void VerifyVideoChannelInput() { VerifyVideoChannelInput(kVideoSsrc); }
330
331 void VerifyVideoChannelInput(uint32_t ssrc) {
332 // Verify that the media channel has a video source,
333 EXPECT_TRUE(video_media_channel_->HasSource(ssrc));
334 }
335
336 void VerifyVoiceChannelNoInput() { VerifyVoiceChannelNoInput(kAudioSsrc); }
337
338 void VerifyVoiceChannelNoInput(uint32_t ssrc) {
339 // Verify that the media channel's source is reset.
340 EXPECT_FALSE(voice_media_channel_->HasSource(ssrc));
341 }
342
343 void VerifyVideoChannelNoInput() { VerifyVideoChannelNoInput(kVideoSsrc); }
344
345 void VerifyVideoChannelNoInput(uint32_t ssrc) {
346 // Verify that the media channel's source is reset.
347 EXPECT_FALSE(video_media_channel_->HasSource(ssrc));
348 }
349
350 void VerifyVoiceChannelOutput() {
351 // Verify that the volume is initialized to 1.
352 double volume;
353 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
354 EXPECT_EQ(1, volume);
355 }
356
357 void VerifyVideoChannelOutput() {
358 // Verify that the media channel has a sink.
359 EXPECT_TRUE(video_media_channel_->HasSink(kVideoSsrc));
360 }
361
362 void VerifyVoiceChannelNoOutput() {
363 // Verify that the volume is reset to 0.
364 double volume;
365 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
366 EXPECT_EQ(0, volume);
367 }
368
369 void VerifyVideoChannelNoOutput() {
370 // Verify that the media channel's sink is reset.
371 EXPECT_FALSE(video_media_channel_->HasSink(kVideoSsrc));
deadbeef70ab1a12015-09-28 16:53:55 -0700372 }
373
Amit Hilbuch2297d332019-02-19 12:49:22 -0800374 // Verifies that the encoding layers contain the specified RIDs.
375 bool VerifyEncodingLayers(const VideoRtpSender& sender,
376 const std::vector<std::string>& rids) {
377 bool has_failure = HasFailure();
378 RtpParameters parameters = sender.GetParameters();
379 std::vector<std::string> encoding_rids;
380 absl::c_transform(
381 parameters.encodings, std::back_inserter(encoding_rids),
382 [](const RtpEncodingParameters& encoding) { return encoding.rid; });
383 EXPECT_THAT(rids, ContainerEq(encoding_rids));
384 return has_failure || !HasFailure();
385 }
386
387 // Runs a test for disabling the encoding layers on the specified sender.
388 void RunDisableEncodingLayersTest(
389 const std::vector<std::string>& all_layers,
390 const std::vector<std::string>& disabled_layers,
391 VideoRtpSender* sender) {
392 std::vector<std::string> expected;
393 absl::c_copy_if(all_layers, std::back_inserter(expected),
394 [&disabled_layers](const std::string& rid) {
395 return !absl::c_linear_search(disabled_layers, rid);
396 });
397
398 EXPECT_TRUE(VerifyEncodingLayers(*sender, all_layers));
399 sender->DisableEncodingLayers(disabled_layers);
400 EXPECT_TRUE(VerifyEncodingLayers(*sender, expected));
401 }
402
403 // Runs a test for setting an encoding layer as inactive.
404 // This test assumes that some layers have already been disabled.
405 void RunSetLastLayerAsInactiveTest(VideoRtpSender* sender) {
406 auto parameters = sender->GetParameters();
407 if (parameters.encodings.size() == 0) {
408 return;
409 }
410
411 RtpEncodingParameters& encoding = parameters.encodings.back();
412 auto rid = encoding.rid;
413 EXPECT_TRUE(encoding.active);
414 encoding.active = false;
415 auto error = sender->SetParameters(parameters);
416 ASSERT_TRUE(error.ok());
417 parameters = sender->GetParameters();
418 RtpEncodingParameters& result_encoding = parameters.encodings.back();
419 EXPECT_EQ(rid, result_encoding.rid);
420 EXPECT_FALSE(result_encoding.active);
421 }
422
423 // Runs a test for disabling the encoding layers on a sender without a media
424 // channel.
425 void RunDisableSimulcastLayersWithoutMediaEngineTest(
426 const std::vector<std::string>& all_layers,
427 const std::vector<std::string>& disabled_layers) {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800428 auto sender = VideoRtpSender::Create(rtc::Thread::Current(), "1");
Amit Hilbuch2297d332019-02-19 12:49:22 -0800429 RtpParameters parameters;
430 parameters.encodings.resize(all_layers.size());
431 for (size_t i = 0; i < all_layers.size(); ++i) {
432 parameters.encodings[i].rid = all_layers[i];
433 }
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800434 sender->set_init_send_encodings(parameters.encodings);
435 RunDisableEncodingLayersTest(all_layers, disabled_layers, sender.get());
436 RunSetLastLayerAsInactiveTest(sender.get());
Amit Hilbuch2297d332019-02-19 12:49:22 -0800437 }
438
439 // Runs a test for disabling the encoding layers on a sender with a media
440 // channel.
441 void RunDisableSimulcastLayersWithMediaEngineTest(
442 const std::vector<std::string>& all_layers,
443 const std::vector<std::string>& disabled_layers) {
444 uint32_t ssrc = CreateVideoRtpSenderWithSimulcast(all_layers);
445 RunDisableEncodingLayersTest(all_layers, disabled_layers,
446 video_rtp_sender_.get());
447
448 auto channel_parameters = video_media_channel_->GetRtpSendParameters(ssrc);
449 ASSERT_EQ(channel_parameters.encodings.size(), all_layers.size());
450 for (size_t i = 0; i < all_layers.size(); ++i) {
451 EXPECT_EQ(all_layers[i], channel_parameters.encodings[i].rid);
452 bool is_active = !absl::c_linear_search(disabled_layers, all_layers[i]);
453 EXPECT_EQ(is_active, channel_parameters.encodings[i].active);
454 }
455
456 RunSetLastLayerAsInactiveTest(video_rtp_sender_.get());
457 }
458
Ruslan Burakov493a6502019-02-27 15:32:48 +0100459 void VerifyTrackLatencyBehaviour(cricket::Delayable* media_channel,
460 MediaStreamTrackInterface* track,
461 MediaSourceInterface* source,
462 uint32_t ssrc) {
463 absl::optional<int> delay_ms; // In milliseconds.
464 double latency_s = 0.5; // In seconds.
465
466 source->SetLatency(latency_s);
467 delay_ms = media_channel->GetBaseMinimumPlayoutDelayMs(ssrc);
468 EXPECT_DOUBLE_EQ(latency_s, delay_ms.value_or(0) / 1000.0);
469
470 // Disabling the track should take no effect on previously set value.
471 track->set_enabled(false);
472 delay_ms = media_channel->GetBaseMinimumPlayoutDelayMs(ssrc);
473 EXPECT_DOUBLE_EQ(latency_s, delay_ms.value_or(0) / 1000.0);
474
475 // When the track is disabled, we still should be able to set latency.
476 latency_s = 0.3;
477 source->SetLatency(latency_s);
478 delay_ms = media_channel->GetBaseMinimumPlayoutDelayMs(ssrc);
479 EXPECT_DOUBLE_EQ(latency_s, delay_ms.value_or(0) / 1000.0);
480
481 // Enabling the track should take no effect on previously set value.
482 track->set_enabled(true);
483 delay_ms = media_channel->GetBaseMinimumPlayoutDelayMs(ssrc);
484 EXPECT_DOUBLE_EQ(latency_s, delay_ms.value_or(0) / 1000.0);
485
486 // We still should be able to change latency.
487 latency_s = 0.0;
488 source->SetLatency(latency_s);
489 delay_ms = media_channel->GetBaseMinimumPlayoutDelayMs(ssrc);
490 EXPECT_EQ(0, delay_ms.value_or(-1));
491 EXPECT_DOUBLE_EQ(latency_s, delay_ms.value_or(0) / 1000.0);
492 }
493
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200494 // Check that minimum Jitter Buffer delay is propagated to the underlying
495 // |media_channel|.
496 void VerifyRtpReceiverDelayBehaviour(cricket::Delayable* media_channel,
497 RtpReceiverInterface* receiver,
498 uint32_t ssrc) {
499 receiver->SetJitterBufferMinimumDelay(/*delay_seconds=*/0.5);
500 absl::optional<int> delay_ms =
501 media_channel->GetBaseMinimumPlayoutDelayMs(ssrc); // In milliseconds.
502 EXPECT_DOUBLE_EQ(0.5, delay_ms.value_or(0) / 1000.0);
503 }
504
deadbeef70ab1a12015-09-28 16:53:55 -0700505 protected:
Steve Anton47136dd2018-01-12 10:49:35 -0800506 rtc::Thread* const network_thread_;
507 rtc::Thread* const worker_thread_;
skvlad11a9cbf2016-10-07 11:53:05 -0700508 webrtc::RtcEventLogNullImpl event_log_;
Zhi Huange830e682018-03-30 10:48:35 -0700509 // The |rtp_dtls_transport_| and |rtp_transport_| should be destroyed after
510 // the |channel_manager|.
511 std::unique_ptr<cricket::DtlsTransportInternal> rtp_dtls_transport_;
512 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport_;
deadbeef112b2e92017-02-10 20:13:37 -0800513 // |media_engine_| is actually owned by |channel_manager_|.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700514 cricket::FakeMediaEngine* media_engine_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700515 cricket::ChannelManager channel_manager_;
516 cricket::FakeCall fake_call_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700517 cricket::VoiceChannel* voice_channel_;
518 cricket::VideoChannel* video_channel_;
519 cricket::FakeVoiceMediaChannel* voice_media_channel_;
520 cricket::FakeVideoMediaChannel* video_media_channel_;
deadbeef70ab1a12015-09-28 16:53:55 -0700521 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
522 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
523 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
524 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
deadbeefe814a0d2017-02-25 18:15:09 -0800525 rtc::scoped_refptr<MediaStreamInterface> local_stream_;
deadbeef70ab1a12015-09-28 16:53:55 -0700526 rtc::scoped_refptr<VideoTrackInterface> video_track_;
527 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
deadbeef20cb0c12017-02-01 20:27:00 -0800528 bool audio_sender_destroyed_signal_fired_ = false;
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800529 rtc::UniqueRandomIdGenerator ssrc_generator_;
deadbeef70ab1a12015-09-28 16:53:55 -0700530};
531
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700532// Test that |voice_channel_| is updated when an audio track is associated
deadbeef70ab1a12015-09-28 16:53:55 -0700533// and disassociated with an AudioRtpSender.
534TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
535 CreateAudioRtpSender();
536 DestroyAudioRtpSender();
537}
538
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700539// Test that |video_channel_| is updated when a video track is associated and
deadbeef70ab1a12015-09-28 16:53:55 -0700540// disassociated with a VideoRtpSender.
541TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
542 CreateVideoRtpSender();
543 DestroyVideoRtpSender();
544}
545
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700546// Test that |voice_channel_| is updated when a remote audio track is
deadbeef70ab1a12015-09-28 16:53:55 -0700547// associated and disassociated with an AudioRtpReceiver.
548TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
549 CreateAudioRtpReceiver();
550 DestroyAudioRtpReceiver();
551}
552
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700553// Test that |video_channel_| is updated when a remote video track is
554// associated and disassociated with a VideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700555TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
556 CreateVideoRtpReceiver();
557 DestroyVideoRtpReceiver();
558}
559
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100560TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiverWithStreams) {
561 CreateAudioRtpReceiver({local_stream_});
562 DestroyAudioRtpReceiver();
563}
564
565TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiverWithStreams) {
566 CreateVideoRtpReceiver({local_stream_});
567 DestroyVideoRtpReceiver();
568}
569
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700570// Test that the AudioRtpSender applies options from the local audio source.
571TEST_F(RtpSenderReceiverTest, LocalAudioSourceOptionsApplied) {
572 cricket::AudioOptions options;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100573 options.echo_cancellation = true;
deadbeef757146b2017-02-10 21:26:48 -0800574 auto source = LocalAudioSource::Create(&options);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700575 CreateAudioRtpSender(source.get());
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700576
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100577 EXPECT_EQ(true, voice_media_channel_->options().echo_cancellation);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700578
579 DestroyAudioRtpSender();
580}
581
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700582// Test that the stream is muted when the track is disabled, and unmuted when
583// the track is enabled.
584TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) {
585 CreateAudioRtpSender();
586
587 audio_track_->set_enabled(false);
588 EXPECT_TRUE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
589
590 audio_track_->set_enabled(true);
591 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
592
593 DestroyAudioRtpSender();
594}
595
596// Test that the volume is set to 0 when the track is disabled, and back to
597// 1 when the track is enabled.
deadbeef70ab1a12015-09-28 16:53:55 -0700598TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
599 CreateAudioRtpReceiver();
600
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700601 double volume;
602 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
603 EXPECT_EQ(1, volume);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700604
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700605 audio_track_->set_enabled(false);
606 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
607 EXPECT_EQ(0, volume);
608
deadbeef70ab1a12015-09-28 16:53:55 -0700609 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700610 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
611 EXPECT_EQ(1, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700612
613 DestroyAudioRtpReceiver();
614}
615
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700616// Currently no action is taken when a remote video track is disabled or
617// enabled, so there's nothing to test here, other than what is normally
618// verified in DestroyVideoRtpSender.
deadbeef70ab1a12015-09-28 16:53:55 -0700619TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
620 CreateVideoRtpSender();
621
deadbeef70ab1a12015-09-28 16:53:55 -0700622 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700623 video_track_->set_enabled(true);
624
625 DestroyVideoRtpSender();
626}
627
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700628// Test that the state of the video track created by the VideoRtpReceiver is
629// updated when the receiver is destroyed.
perkjf0dcfe22016-03-10 18:32:00 +0100630TEST_F(RtpSenderReceiverTest, RemoteVideoTrackState) {
631 CreateVideoRtpReceiver();
632
633 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track_->state());
634 EXPECT_EQ(webrtc::MediaSourceInterface::kLive,
635 video_track_->GetSource()->state());
636
637 DestroyVideoRtpReceiver();
638
639 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track_->state());
640 EXPECT_EQ(webrtc::MediaSourceInterface::kEnded,
641 video_track_->GetSource()->state());
642}
643
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700644// Currently no action is taken when a remote video track is disabled or
645// enabled, so there's nothing to test here, other than what is normally
646// verified in DestroyVideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700647TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
648 CreateVideoRtpReceiver();
649
650 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700651 video_track_->set_enabled(true);
652
653 DestroyVideoRtpReceiver();
654}
655
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700656// Test that the AudioRtpReceiver applies volume changes from the track source
657// to the media channel.
deadbeef70ab1a12015-09-28 16:53:55 -0700658TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
659 CreateAudioRtpReceiver();
660
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700661 double volume;
662 audio_track_->GetSource()->SetVolume(0.5);
663 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
664 EXPECT_EQ(0.5, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700665
666 // Disable the audio track, this should prevent setting the volume.
deadbeef70ab1a12015-09-28 16:53:55 -0700667 audio_track_->set_enabled(false);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700668 audio_track_->GetSource()->SetVolume(0.8);
669 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
670 EXPECT_EQ(0, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700671
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700672 // When the track is enabled, the previously set volume should take effect.
deadbeef70ab1a12015-09-28 16:53:55 -0700673 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700674 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
675 EXPECT_EQ(0.8, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700676
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700677 // Try changing volume one more time.
678 audio_track_->GetSource()->SetVolume(0.9);
679 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
680 EXPECT_EQ(0.9, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700681
682 DestroyAudioRtpReceiver();
683}
684
Ruslan Burakov493a6502019-02-27 15:32:48 +0100685TEST_F(RtpSenderReceiverTest, RemoteAudioSourceLatency) {
Ruslan Burakov7ea46052019-02-16 02:07:05 +0100686 absl::optional<int> delay_ms; // In milliseconds.
Ruslan Burakov7ea46052019-02-16 02:07:05 +0100687 rtc::scoped_refptr<RemoteAudioSource> source =
688 new rtc::RefCountedObject<RemoteAudioSource>(rtc::Thread::Current());
689
690 // Set it to value different from default zero.
Ruslan Burakov493a6502019-02-27 15:32:48 +0100691 voice_media_channel_->SetBaseMinimumPlayoutDelayMs(kAudioSsrc, 300);
Ruslan Burakov7ea46052019-02-16 02:07:05 +0100692
693 // Check that calling GetLatency on the source that hasn't been started yet
Ruslan Burakov493a6502019-02-27 15:32:48 +0100694 // won't trigger caching and return default value.
Ruslan Burakov7ea46052019-02-16 02:07:05 +0100695 EXPECT_DOUBLE_EQ(source->GetLatency(), 0);
Ruslan Burakov493a6502019-02-27 15:32:48 +0100696
697 // Check that cached latency will be applied on start.
698 source->SetLatency(0.4);
699 EXPECT_DOUBLE_EQ(source->GetLatency(), 0.4);
Ruslan Burakov7ea46052019-02-16 02:07:05 +0100700 source->Start(voice_media_channel_, kAudioSsrc);
Ruslan Burakov493a6502019-02-27 15:32:48 +0100701 delay_ms = voice_media_channel_->GetBaseMinimumPlayoutDelayMs(kAudioSsrc);
702 EXPECT_EQ(400, delay_ms);
Ruslan Burakov7ea46052019-02-16 02:07:05 +0100703}
704
Ruslan Burakov493a6502019-02-27 15:32:48 +0100705TEST_F(RtpSenderReceiverTest, RemoteAudioTrackLatency) {
Ruslan Burakov7ea46052019-02-16 02:07:05 +0100706 CreateAudioRtpReceiver();
Ruslan Burakov493a6502019-02-27 15:32:48 +0100707 VerifyTrackLatencyBehaviour(voice_media_channel_, audio_track_.get(),
708 audio_track_->GetSource(), kAudioSsrc);
709}
Ruslan Burakov7ea46052019-02-16 02:07:05 +0100710
Ruslan Burakov493a6502019-02-27 15:32:48 +0100711TEST_F(RtpSenderReceiverTest, RemoteVideoTrackLatency) {
712 CreateVideoRtpReceiver();
713 VerifyTrackLatencyBehaviour(video_media_channel_, video_track_.get(),
714 video_track_->GetSource(), kVideoSsrc);
Ruslan Burakov7ea46052019-02-16 02:07:05 +0100715}
716
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200717TEST_F(RtpSenderReceiverTest, AudioRtpReceiverDelay) {
718 CreateAudioRtpReceiver();
719 VerifyRtpReceiverDelayBehaviour(voice_media_channel_,
720 audio_rtp_receiver_.get(), kAudioSsrc);
721 VerifyTrackLatencyBehaviour(voice_media_channel_, audio_track_.get(),
722 audio_track_->GetSource(), kAudioSsrc);
723}
724
725TEST_F(RtpSenderReceiverTest, VideoRtpReceiverDelay) {
726 CreateVideoRtpReceiver();
727 VerifyRtpReceiverDelayBehaviour(video_media_channel_,
728 video_rtp_receiver_.get(), kVideoSsrc);
729}
730
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700731// Test that the media channel isn't enabled for sending if the audio sender
732// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800733TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800734 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800735 rtc::scoped_refptr<AudioTrackInterface> track =
736 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700737
738 // Track but no SSRC.
739 EXPECT_TRUE(audio_rtp_sender_->SetTrack(track));
740 VerifyVoiceChannelNoInput();
741
742 // SSRC but no track.
743 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
744 audio_rtp_sender_->SetSsrc(kAudioSsrc);
745 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800746}
747
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700748// Test that the media channel isn't enabled for sending if the video sender
749// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800750TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800751 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700752
753 // Track but no SSRC.
754 EXPECT_TRUE(video_rtp_sender_->SetTrack(video_track_));
755 VerifyVideoChannelNoInput();
756
757 // SSRC but no track.
758 EXPECT_TRUE(video_rtp_sender_->SetTrack(nullptr));
759 video_rtp_sender_->SetSsrc(kVideoSsrc);
760 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800761}
762
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700763// Test that the media channel is enabled for sending when the audio sender
764// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800765TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800766 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800767 rtc::scoped_refptr<AudioTrackInterface> track =
768 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700769 audio_rtp_sender_->SetSsrc(kAudioSsrc);
770 audio_rtp_sender_->SetTrack(track);
771 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800772
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700773 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800774}
775
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700776// Test that the media channel is enabled for sending when the audio sender
777// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800778TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800779 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800780 rtc::scoped_refptr<AudioTrackInterface> track =
781 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700782 audio_rtp_sender_->SetTrack(track);
783 audio_rtp_sender_->SetSsrc(kAudioSsrc);
784 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800785
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700786 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800787}
788
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700789// Test that the media channel is enabled for sending when the video sender
790// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800791TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
nisseaf510af2016-03-21 08:20:42 -0700792 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800793 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700794 video_rtp_sender_->SetSsrc(kVideoSsrc);
795 video_rtp_sender_->SetTrack(video_track_);
796 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800797
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700798 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800799}
800
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700801// Test that the media channel is enabled for sending when the video sender
802// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800803TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
nisseaf510af2016-03-21 08:20:42 -0700804 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800805 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700806 video_rtp_sender_->SetTrack(video_track_);
807 video_rtp_sender_->SetSsrc(kVideoSsrc);
808 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800809
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700810 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800811}
812
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700813// Test that the media channel stops sending when the audio sender's SSRC is set
814// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800815TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700816 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800817
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700818 audio_rtp_sender_->SetSsrc(0);
819 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800820}
821
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700822// Test that the media channel stops sending when the video sender's SSRC is set
823// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800824TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700825 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800826
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700827 audio_rtp_sender_->SetSsrc(0);
828 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800829}
830
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700831// Test that the media channel stops sending when the audio sender's track is
832// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800833TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700834 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800835
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700836 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
837 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800838}
839
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700840// Test that the media channel stops sending when the video sender's track is
841// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800842TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700843 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800844
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700845 video_rtp_sender_->SetSsrc(0);
846 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800847}
848
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700849// Test that when the audio sender's SSRC is changed, the media channel stops
850// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800851TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700852 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800853
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700854 audio_rtp_sender_->SetSsrc(kAudioSsrc2);
855 VerifyVoiceChannelNoInput(kAudioSsrc);
856 VerifyVoiceChannelInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800857
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700858 audio_rtp_sender_ = nullptr;
859 VerifyVoiceChannelNoInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800860}
861
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700862// Test that when the audio sender's SSRC is changed, the media channel stops
863// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800864TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700865 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800866
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700867 video_rtp_sender_->SetSsrc(kVideoSsrc2);
868 VerifyVideoChannelNoInput(kVideoSsrc);
869 VerifyVideoChannelInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800870
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700871 video_rtp_sender_ = nullptr;
872 VerifyVideoChannelNoInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800873}
874
skvladdc1c62c2016-03-16 19:07:43 -0700875TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) {
876 CreateAudioRtpSender();
877
skvladdc1c62c2016-03-16 19:07:43 -0700878 RtpParameters params = audio_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700879 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -0800880 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -0700881
882 DestroyAudioRtpSender();
883}
884
Florent Castelli892acf02018-10-01 22:47:20 +0200885TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParametersBeforeNegotiation) {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800886 audio_rtp_sender_ =
887 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +0200888
889 RtpParameters params = audio_rtp_sender_->GetParameters();
890 ASSERT_EQ(1u, params.encodings.size());
891 params.encodings[0].max_bitrate_bps = 90000;
892 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
893
894 params = audio_rtp_sender_->GetParameters();
895 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
896 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
897
898 DestroyAudioRtpSender();
899}
900
901TEST_F(RtpSenderReceiverTest, AudioSenderInitParametersMovedAfterNegotiation) {
902 audio_track_ = AudioTrack::Create(kAudioTrackId, nullptr);
903 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
904
905 audio_rtp_sender_ =
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800906 AudioRtpSender::Create(worker_thread_, audio_track_->id(), nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +0200907 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_));
908 audio_rtp_sender_->set_stream_ids({local_stream_->id()});
909
910 std::vector<RtpEncodingParameters> init_encodings(1);
911 init_encodings[0].max_bitrate_bps = 60000;
912 audio_rtp_sender_->set_init_send_encodings(init_encodings);
913
914 RtpParameters params = audio_rtp_sender_->GetParameters();
915 ASSERT_EQ(1u, params.encodings.size());
916 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
917
918 // Simulate the setLocalDescription call
919 std::vector<uint32_t> ssrcs(1, 1);
920 cricket::StreamParams stream_params =
921 cricket::CreateSimStreamParams("cname", ssrcs);
922 voice_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800923 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +0200924 audio_rtp_sender_->SetSsrc(1);
925
926 params = audio_rtp_sender_->GetParameters();
927 ASSERT_EQ(1u, params.encodings.size());
928 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
929
930 DestroyAudioRtpSender();
931}
932
933TEST_F(RtpSenderReceiverTest,
934 AudioSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800935 audio_rtp_sender_ =
936 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +0200937
938 RtpParameters params;
939 RTCError result = audio_rtp_sender_->SetParameters(params);
940 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
941 DestroyAudioRtpSender();
942}
943
Florent Castellicebf50f2018-05-03 15:31:53 +0200944TEST_F(RtpSenderReceiverTest,
945 AudioSenderMustCallGetParametersBeforeSetParameters) {
946 CreateAudioRtpSender();
947
948 RtpParameters params;
949 RTCError result = audio_rtp_sender_->SetParameters(params);
950 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
951
952 DestroyAudioRtpSender();
953}
954
955TEST_F(RtpSenderReceiverTest,
956 AudioSenderSetParametersInvalidatesTransactionId) {
957 CreateAudioRtpSender();
958
959 RtpParameters params = audio_rtp_sender_->GetParameters();
960 EXPECT_EQ(1u, params.encodings.size());
961 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
962 RTCError result = audio_rtp_sender_->SetParameters(params);
963 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
964
965 DestroyAudioRtpSender();
966}
967
968TEST_F(RtpSenderReceiverTest, AudioSenderDetectTransactionIdModification) {
969 CreateAudioRtpSender();
970
971 RtpParameters params = audio_rtp_sender_->GetParameters();
972 params.transaction_id = "";
973 RTCError result = audio_rtp_sender_->SetParameters(params);
974 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
975
976 DestroyAudioRtpSender();
977}
978
979TEST_F(RtpSenderReceiverTest, AudioSenderCheckTransactionIdRefresh) {
980 CreateAudioRtpSender();
981
982 RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200983 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 15:31:53 +0200984 auto saved_transaction_id = params.transaction_id;
985 params = audio_rtp_sender_->GetParameters();
986 EXPECT_NE(saved_transaction_id, params.transaction_id);
987
988 DestroyAudioRtpSender();
989}
990
991TEST_F(RtpSenderReceiverTest, AudioSenderSetParametersOldValueFail) {
992 CreateAudioRtpSender();
993
994 RtpParameters params = audio_rtp_sender_->GetParameters();
995 RtpParameters second_params = audio_rtp_sender_->GetParameters();
996
997 RTCError result = audio_rtp_sender_->SetParameters(params);
998 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
Seth Hampson2d2c8882018-05-16 16:02:32 -0700999 DestroyAudioRtpSender();
1000}
1001
1002TEST_F(RtpSenderReceiverTest, AudioSenderCantSetUnimplementedRtpParameters) {
1003 CreateAudioRtpSender();
1004 RtpParameters params = audio_rtp_sender_->GetParameters();
1005 EXPECT_EQ(1u, params.encodings.size());
1006
Florent Castelli87b3c512018-07-18 16:00:28 +02001007 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 16:02:32 -07001008 params.mid = "dummy_mid";
1009 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1010 audio_rtp_sender_->SetParameters(params).type());
1011 params = audio_rtp_sender_->GetParameters();
1012
Seth Hampson2d2c8882018-05-16 16:02:32 -07001013 DestroyAudioRtpSender();
1014}
1015
1016TEST_F(RtpSenderReceiverTest,
1017 AudioSenderCantSetUnimplementedRtpEncodingParameters) {
1018 CreateAudioRtpSender();
1019 RtpParameters params = audio_rtp_sender_->GetParameters();
1020 EXPECT_EQ(1u, params.encodings.size());
1021
Henrik Grunelle1301a82018-12-13 12:13:22 +00001022 // Unimplemented RtpParameters: codec_payload_type, fec, rtx, dtx, ptime,
Amit Hilbuchaa584152019-02-06 17:09:52 -08001023 // scale_framerate_down_by, dependency_rids.
Henrik Grunelle1301a82018-12-13 12:13:22 +00001024 params.encodings[0].codec_payload_type = 1;
1025 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1026 audio_rtp_sender_->SetParameters(params).type());
1027 params = audio_rtp_sender_->GetParameters();
1028
Seth Hampson2d2c8882018-05-16 16:02:32 -07001029 params.encodings[0].fec = RtpFecParameters();
1030 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1031 audio_rtp_sender_->SetParameters(params).type());
1032 params = audio_rtp_sender_->GetParameters();
1033
1034 params.encodings[0].rtx = RtpRtxParameters();
1035 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1036 audio_rtp_sender_->SetParameters(params).type());
1037 params = audio_rtp_sender_->GetParameters();
1038
1039 params.encodings[0].dtx = DtxStatus::ENABLED;
1040 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1041 audio_rtp_sender_->SetParameters(params).type());
1042 params = audio_rtp_sender_->GetParameters();
1043
1044 params.encodings[0].ptime = 1;
1045 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1046 audio_rtp_sender_->SetParameters(params).type());
1047 params = audio_rtp_sender_->GetParameters();
1048
Seth Hampson2d2c8882018-05-16 16:02:32 -07001049 params.encodings[0].dependency_rids.push_back("dummy_rid");
1050 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1051 audio_rtp_sender_->SetParameters(params).type());
Florent Castellicebf50f2018-05-03 15:31:53 +02001052
1053 DestroyAudioRtpSender();
1054}
1055
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001056TEST_F(RtpSenderReceiverTest, SetAudioMaxSendBitrate) {
1057 CreateAudioRtpSender();
1058
1059 EXPECT_EQ(-1, voice_media_channel_->max_bps());
1060 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001061 EXPECT_EQ(1U, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -08001062 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001063 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -08001064 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001065
1066 // Read back the parameters and verify they have been changed.
1067 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001068 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001069 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001070
1071 // Verify that the audio channel received the new parameters.
1072 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
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 global bitrate limit has not been changed.
1077 EXPECT_EQ(-1, voice_media_channel_->max_bps());
1078
1079 DestroyAudioRtpSender();
1080}
1081
Seth Hampson24722b32017-12-22 09:36:42 -08001082TEST_F(RtpSenderReceiverTest, SetAudioBitratePriority) {
1083 CreateAudioRtpSender();
1084
1085 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001086 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001087 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1088 params.encodings[0].bitrate_priority);
1089 double new_bitrate_priority = 2.0;
1090 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -08001091 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -08001092
1093 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001094 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001095 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1096
1097 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001098 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001099 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1100
1101 DestroyAudioRtpSender();
1102}
1103
skvladdc1c62c2016-03-16 19:07:43 -07001104TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) {
1105 CreateVideoRtpSender();
1106
skvladdc1c62c2016-03-16 19:07:43 -07001107 RtpParameters params = video_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001108 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -08001109 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -07001110
1111 DestroyVideoRtpSender();
1112}
1113
Florent Castelli892acf02018-10-01 22:47:20 +02001114TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParametersBeforeNegotiation) {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -08001115 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, /*id=*/"");
Florent Castelli892acf02018-10-01 22:47:20 +02001116
1117 RtpParameters params = video_rtp_sender_->GetParameters();
1118 ASSERT_EQ(1u, params.encodings.size());
1119 params.encodings[0].max_bitrate_bps = 90000;
1120 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1121
1122 params = video_rtp_sender_->GetParameters();
1123 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1124 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
1125
1126 DestroyVideoRtpSender();
1127}
1128
1129TEST_F(RtpSenderReceiverTest, VideoSenderInitParametersMovedAfterNegotiation) {
1130 AddVideoTrack(false);
1131
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -08001132 video_rtp_sender_ =
1133 VideoRtpSender::Create(worker_thread_, video_track_->id());
Florent Castelli892acf02018-10-01 22:47:20 +02001134 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
1135 video_rtp_sender_->set_stream_ids({local_stream_->id()});
1136
1137 std::vector<RtpEncodingParameters> init_encodings(2);
1138 init_encodings[0].max_bitrate_bps = 60000;
1139 init_encodings[1].max_bitrate_bps = 900000;
1140 video_rtp_sender_->set_init_send_encodings(init_encodings);
1141
1142 RtpParameters params = video_rtp_sender_->GetParameters();
1143 ASSERT_EQ(2u, params.encodings.size());
1144 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1145 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
1146
1147 // Simulate the setLocalDescription call
1148 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +01001149 ssrcs.reserve(2);
Florent Castelli892acf02018-10-01 22:47:20 +02001150 for (int i = 0; i < 2; ++i)
1151 ssrcs.push_back(kVideoSsrcSimulcast + i);
1152 cricket::StreamParams stream_params =
1153 cricket::CreateSimStreamParams("cname", ssrcs);
1154 video_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -08001155 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +02001156 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
1157
1158 params = video_rtp_sender_->GetParameters();
1159 ASSERT_EQ(2u, params.encodings.size());
1160 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1161 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
1162
1163 DestroyVideoRtpSender();
1164}
1165
1166TEST_F(RtpSenderReceiverTest,
1167 VideoSenderInitParametersMovedAfterManualSimulcastAndNegotiation) {
1168 AddVideoTrack(false);
1169
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -08001170 video_rtp_sender_ =
1171 VideoRtpSender::Create(worker_thread_, video_track_->id());
Florent Castelli892acf02018-10-01 22:47:20 +02001172 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
1173 video_rtp_sender_->set_stream_ids({local_stream_->id()});
1174
1175 std::vector<RtpEncodingParameters> init_encodings(1);
1176 init_encodings[0].max_bitrate_bps = 60000;
1177 video_rtp_sender_->set_init_send_encodings(init_encodings);
1178
1179 RtpParameters params = video_rtp_sender_->GetParameters();
1180 ASSERT_EQ(1u, params.encodings.size());
1181 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1182
1183 // Simulate the setLocalDescription call as if the user used SDP munging
1184 // to enable simulcast
1185 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +01001186 ssrcs.reserve(2);
Florent Castelli892acf02018-10-01 22:47:20 +02001187 for (int i = 0; i < 2; ++i)
1188 ssrcs.push_back(kVideoSsrcSimulcast + i);
1189 cricket::StreamParams stream_params =
1190 cricket::CreateSimStreamParams("cname", ssrcs);
1191 video_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -08001192 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +02001193 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
1194
1195 params = video_rtp_sender_->GetParameters();
1196 ASSERT_EQ(2u, params.encodings.size());
1197 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1198
1199 DestroyVideoRtpSender();
1200}
1201
1202TEST_F(RtpSenderReceiverTest,
1203 VideoSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -08001204 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, /*id=*/"");
Florent Castelli892acf02018-10-01 22:47:20 +02001205
1206 RtpParameters params;
1207 RTCError result = video_rtp_sender_->SetParameters(params);
1208 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1209 DestroyVideoRtpSender();
1210}
1211
Florent Castellicebf50f2018-05-03 15:31:53 +02001212TEST_F(RtpSenderReceiverTest,
1213 VideoSenderMustCallGetParametersBeforeSetParameters) {
1214 CreateVideoRtpSender();
1215
1216 RtpParameters params;
1217 RTCError result = video_rtp_sender_->SetParameters(params);
1218 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1219
1220 DestroyVideoRtpSender();
1221}
1222
1223TEST_F(RtpSenderReceiverTest,
1224 VideoSenderSetParametersInvalidatesTransactionId) {
1225 CreateVideoRtpSender();
1226
1227 RtpParameters params = video_rtp_sender_->GetParameters();
1228 EXPECT_EQ(1u, params.encodings.size());
1229 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1230 RTCError result = video_rtp_sender_->SetParameters(params);
1231 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1232
1233 DestroyVideoRtpSender();
1234}
1235
1236TEST_F(RtpSenderReceiverTest, VideoSenderDetectTransactionIdModification) {
1237 CreateVideoRtpSender();
1238
1239 RtpParameters params = video_rtp_sender_->GetParameters();
1240 params.transaction_id = "";
1241 RTCError result = video_rtp_sender_->SetParameters(params);
1242 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1243
1244 DestroyVideoRtpSender();
1245}
1246
1247TEST_F(RtpSenderReceiverTest, VideoSenderCheckTransactionIdRefresh) {
1248 CreateVideoRtpSender();
1249
1250 RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001251 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 15:31:53 +02001252 auto saved_transaction_id = params.transaction_id;
1253 params = video_rtp_sender_->GetParameters();
1254 EXPECT_NE(saved_transaction_id, params.transaction_id);
1255
1256 DestroyVideoRtpSender();
1257}
1258
1259TEST_F(RtpSenderReceiverTest, VideoSenderSetParametersOldValueFail) {
1260 CreateVideoRtpSender();
1261
1262 RtpParameters params = video_rtp_sender_->GetParameters();
1263 RtpParameters second_params = video_rtp_sender_->GetParameters();
1264
1265 RTCError result = video_rtp_sender_->SetParameters(params);
1266 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1267
1268 DestroyVideoRtpSender();
1269}
1270
Seth Hampson2d2c8882018-05-16 16:02:32 -07001271TEST_F(RtpSenderReceiverTest, VideoSenderCantSetUnimplementedRtpParameters) {
1272 CreateVideoRtpSender();
1273 RtpParameters params = video_rtp_sender_->GetParameters();
1274 EXPECT_EQ(1u, params.encodings.size());
1275
Florent Castelli87b3c512018-07-18 16:00:28 +02001276 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 16:02:32 -07001277 params.mid = "dummy_mid";
1278 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1279 video_rtp_sender_->SetParameters(params).type());
1280 params = video_rtp_sender_->GetParameters();
1281
Seth Hampson2d2c8882018-05-16 16:02:32 -07001282 DestroyVideoRtpSender();
1283}
1284
1285TEST_F(RtpSenderReceiverTest,
1286 VideoSenderCantSetUnimplementedEncodingParameters) {
1287 CreateVideoRtpSender();
1288 RtpParameters params = video_rtp_sender_->GetParameters();
1289 EXPECT_EQ(1u, params.encodings.size());
1290
Henrik Grunelle1301a82018-12-13 12:13:22 +00001291 // Unimplemented RtpParameters: codec_payload_type, fec, rtx, dtx, ptime,
Amit Hilbuchaa584152019-02-06 17:09:52 -08001292 // scale_framerate_down_by, dependency_rids.
Henrik Grunelle1301a82018-12-13 12:13:22 +00001293 params.encodings[0].codec_payload_type = 1;
1294 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1295 video_rtp_sender_->SetParameters(params).type());
1296 params = video_rtp_sender_->GetParameters();
1297
Seth Hampson2d2c8882018-05-16 16:02:32 -07001298 params.encodings[0].fec = RtpFecParameters();
1299 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1300 video_rtp_sender_->SetParameters(params).type());
1301 params = video_rtp_sender_->GetParameters();
1302
1303 params.encodings[0].rtx = RtpRtxParameters();
1304 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1305 video_rtp_sender_->SetParameters(params).type());
1306 params = video_rtp_sender_->GetParameters();
1307
1308 params.encodings[0].dtx = DtxStatus::ENABLED;
1309 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1310 video_rtp_sender_->SetParameters(params).type());
1311 params = video_rtp_sender_->GetParameters();
1312
1313 params.encodings[0].ptime = 1;
1314 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1315 video_rtp_sender_->SetParameters(params).type());
1316 params = video_rtp_sender_->GetParameters();
1317
Seth Hampson2d2c8882018-05-16 16:02:32 -07001318 params.encodings[0].dependency_rids.push_back("dummy_rid");
1319 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1320 video_rtp_sender_->SetParameters(params).type());
1321
1322 DestroyVideoRtpSender();
1323}
1324
Florent Castellic1a0bcb2019-01-29 14:26:48 +01001325TEST_F(RtpSenderReceiverTest, VideoSenderCanSetScaleResolutionDownBy) {
1326 CreateVideoRtpSender();
1327
1328 RtpParameters params = video_rtp_sender_->GetParameters();
1329 params.encodings[0].scale_resolution_down_by = 2;
1330
1331 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1332 params = video_rtp_sender_->GetParameters();
1333 EXPECT_EQ(2, params.encodings[0].scale_resolution_down_by);
1334
1335 DestroyVideoRtpSender();
1336}
1337
1338TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidScaleResolutionDownBy) {
1339 CreateVideoRtpSender();
1340
1341 RtpParameters params = video_rtp_sender_->GetParameters();
1342 params.encodings[0].scale_resolution_down_by = 0.5;
1343 RTCError result = video_rtp_sender_->SetParameters(params);
1344 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1345
1346 DestroyVideoRtpSender();
1347}
1348
Florent Castelli892acf02018-10-01 22:47:20 +02001349TEST_F(RtpSenderReceiverTest,
1350 VideoSenderCantSetUnimplementedEncodingParametersWithSimulcast) {
1351 CreateVideoRtpSenderWithSimulcast();
1352 RtpParameters params = video_rtp_sender_->GetParameters();
1353 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
1354
Henrik Grunelle1301a82018-12-13 12:13:22 +00001355 // Unimplemented RtpParameters: codec_payload_type, fec, rtx, dtx, ptime,
Amit Hilbuchaa584152019-02-06 17:09:52 -08001356 // scale_framerate_down_by, dependency_rids.
Florent Castelli892acf02018-10-01 22:47:20 +02001357 for (size_t i = 0; i < params.encodings.size(); i++) {
Henrik Grunelle1301a82018-12-13 12:13:22 +00001358 params.encodings[i].codec_payload_type = 1;
1359 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1360 video_rtp_sender_->SetParameters(params).type());
1361 params = video_rtp_sender_->GetParameters();
1362
Florent Castelli892acf02018-10-01 22:47:20 +02001363 params.encodings[i].fec = RtpFecParameters();
1364 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1365 video_rtp_sender_->SetParameters(params).type());
1366 params = video_rtp_sender_->GetParameters();
1367
1368 params.encodings[i].rtx = RtpRtxParameters();
1369 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1370 video_rtp_sender_->SetParameters(params).type());
1371 params = video_rtp_sender_->GetParameters();
1372
1373 params.encodings[i].dtx = DtxStatus::ENABLED;
1374 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1375 video_rtp_sender_->SetParameters(params).type());
1376 params = video_rtp_sender_->GetParameters();
1377
1378 params.encodings[i].ptime = 1;
1379 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1380 video_rtp_sender_->SetParameters(params).type());
1381 params = video_rtp_sender_->GetParameters();
1382
Florent Castelli892acf02018-10-01 22:47:20 +02001383 params.encodings[i].dependency_rids.push_back("dummy_rid");
1384 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1385 video_rtp_sender_->SetParameters(params).type());
Amit Hilbuch619b2942019-02-26 15:55:19 -08001386 params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001387 }
1388
1389 DestroyVideoRtpSender();
1390}
1391
Seth Hampson2d2c8882018-05-16 16:02:32 -07001392// A video sender can have multiple simulcast layers, in which case it will
1393// contain multiple RtpEncodingParameters. This tests that if this is the case
1394// (simulcast), then we can't set the bitrate_priority, or max_bitrate_bps
1395// for any encodings besides at index 0, because these are both implemented
1396// "per-sender."
1397TEST_F(RtpSenderReceiverTest, VideoSenderCantSetPerSenderEncodingParameters) {
1398 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001399 CreateVideoRtpSenderWithSimulcast();
Seth Hampson2d2c8882018-05-16 16:02:32 -07001400 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001401 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Seth Hampson2d2c8882018-05-16 16:02:32 -07001402
1403 params.encodings[1].bitrate_priority = 2.0;
1404 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1405 video_rtp_sender_->SetParameters(params).type());
1406 params = video_rtp_sender_->GetParameters();
1407
Seth Hampson2d2c8882018-05-16 16:02:32 -07001408 DestroyVideoRtpSender();
1409}
1410
Florent Castelli892acf02018-10-01 22:47:20 +02001411TEST_F(RtpSenderReceiverTest, VideoSenderCantSetReadOnlyEncodingParameters) {
1412 // Add a simulcast specific send stream that contains 2 encoding parameters.
1413 CreateVideoRtpSenderWithSimulcast();
1414 RtpParameters params = video_rtp_sender_->GetParameters();
1415 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
1416
1417 for (size_t i = 0; i < params.encodings.size(); i++) {
1418 params.encodings[i].ssrc = 1337;
1419 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION,
1420 video_rtp_sender_->SetParameters(params).type());
1421 params = video_rtp_sender_->GetParameters();
1422 }
1423
1424 DestroyVideoRtpSender();
1425}
1426
Ă…sa Persson55659812018-06-18 17:51:32 +02001427TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrate) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001428 CreateVideoRtpSender();
1429
1430 EXPECT_EQ(-1, video_media_channel_->max_bps());
1431 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001432 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001433 EXPECT_FALSE(params.encodings[0].min_bitrate_bps);
deadbeefe702b302017-02-04 12:09:01 -08001434 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Ă…sa Persson55659812018-06-18 17:51:32 +02001435 params.encodings[0].min_bitrate_bps = 100;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001436 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -08001437 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001438
1439 // Read back the parameters and verify they have been changed.
1440 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001441 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001442 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001443 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001444
1445 // Verify that the video channel received the new parameters.
1446 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001447 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001448 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001449 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001450
1451 // Verify that the global bitrate limit has not been changed.
1452 EXPECT_EQ(-1, video_media_channel_->max_bps());
1453
1454 DestroyVideoRtpSender();
1455}
1456
Ă…sa Persson55659812018-06-18 17:51:32 +02001457TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrateSimulcast) {
1458 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001459 CreateVideoRtpSenderWithSimulcast();
Ă…sa Persson55659812018-06-18 17:51:32 +02001460
1461 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001462 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001463 params.encodings[0].min_bitrate_bps = 100;
1464 params.encodings[0].max_bitrate_bps = 1000;
1465 params.encodings[1].min_bitrate_bps = 200;
1466 params.encodings[1].max_bitrate_bps = 2000;
1467 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1468
1469 // Verify that the video channel received the new parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001470 params = video_media_channel_->GetRtpSendParameters(kVideoSsrcSimulcast);
1471 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001472 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
1473 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
1474 EXPECT_EQ(200, params.encodings[1].min_bitrate_bps);
1475 EXPECT_EQ(2000, params.encodings[1].max_bitrate_bps);
1476
1477 DestroyVideoRtpSender();
1478}
1479
Seth Hampson24722b32017-12-22 09:36:42 -08001480TEST_F(RtpSenderReceiverTest, SetVideoBitratePriority) {
1481 CreateVideoRtpSender();
1482
1483 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001484 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001485 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1486 params.encodings[0].bitrate_priority);
1487 double new_bitrate_priority = 2.0;
1488 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -08001489 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -08001490
1491 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001492 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001493 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1494
1495 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001496 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001497 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1498
1499 DestroyVideoRtpSender();
1500}
1501
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001502TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetParameters) {
1503 CreateAudioRtpReceiver();
1504
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001505 RtpParameters params = audio_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001506 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001507 EXPECT_TRUE(audio_rtp_receiver_->SetParameters(params));
1508
1509 DestroyAudioRtpReceiver();
1510}
1511
1512TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetParameters) {
1513 CreateVideoRtpReceiver();
1514
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001515 RtpParameters params = video_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001516 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001517 EXPECT_TRUE(video_rtp_receiver_->SetParameters(params));
1518
1519 DestroyVideoRtpReceiver();
1520}
1521
Florent Castelli38332cd2018-11-20 14:08:06 +01001522TEST_F(RtpSenderReceiverTest, VideoReceiverCanGetParametersWithSimulcast) {
1523 CreateVideoRtpReceiverWithSimulcast({}, 2);
1524
1525 RtpParameters params = video_rtp_receiver_->GetParameters();
1526 EXPECT_EQ(2u, params.encodings.size());
1527
1528 DestroyVideoRtpReceiver();
1529}
1530
pbos5214a0a2016-12-16 15:39:11 -08001531// Test that makes sure that a video track content hint translates to the proper
1532// value for sources that are not screencast.
1533TEST_F(RtpSenderReceiverTest, PropagatesVideoTrackContentHint) {
1534 CreateVideoRtpSender();
1535
1536 video_track_->set_enabled(true);
1537
1538 // |video_track_| is not screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001539 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001540 // No content hint should be set by default.
1541 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1542 video_track_->content_hint());
1543 // Setting detailed should turn a non-screencast source into screencast mode.
1544 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001545 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001546 // Removing the content hint should turn the track back into non-screencast
1547 // mode.
1548 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001549 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001550 // Setting fluid should remain in non-screencast mode (its default).
1551 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001552 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 08:53:10 +02001553 // Setting text should have the same effect as Detailed
1554 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
1555 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001556
1557 DestroyVideoRtpSender();
1558}
1559
1560// Test that makes sure that a video track content hint translates to the proper
1561// value for screencast sources.
1562TEST_F(RtpSenderReceiverTest,
1563 PropagatesVideoTrackContentHintForScreencastSource) {
1564 CreateVideoRtpSender(true);
1565
1566 video_track_->set_enabled(true);
1567
1568 // |video_track_| with a screencast source should be screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001569 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001570 // No content hint should be set by default.
1571 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1572 video_track_->content_hint());
1573 // Setting fluid should turn a screencast source into non-screencast mode.
1574 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001575 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001576 // Removing the content hint should turn the track back into screencast mode.
1577 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001578 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001579 // Setting detailed should still remain in screencast mode (its default).
1580 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001581 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 08:53:10 +02001582 // Setting text should have the same effect as Detailed
1583 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
1584 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001585
1586 DestroyVideoRtpSender();
1587}
1588
1589// Test that makes sure any content hints that are set on a track before
1590// VideoRtpSender is ready to send are still applied when it gets ready to send.
1591TEST_F(RtpSenderReceiverTest,
1592 PropagatesVideoTrackContentHintSetBeforeEnabling) {
1593 AddVideoTrack();
1594 // Setting detailed overrides the default non-screencast mode. This should be
1595 // applied even if the track is set on construction.
1596 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -08001597 video_rtp_sender_ =
1598 VideoRtpSender::Create(worker_thread_, video_track_->id());
Steve Anton111fdfd2018-06-25 13:03:36 -07001599 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
1600 video_rtp_sender_->set_stream_ids({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -08001601 video_rtp_sender_->SetMediaChannel(video_media_channel_);
pbos5214a0a2016-12-16 15:39:11 -08001602 video_track_->set_enabled(true);
1603
1604 // Sender is not ready to send (no SSRC) so no option should have been set.
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001605 EXPECT_EQ(absl::nullopt, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001606
1607 // Verify that the content hint is accounted for when video_rtp_sender_ does
1608 // get enabled.
1609 video_rtp_sender_->SetSsrc(kVideoSsrc);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001610 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001611
1612 // And removing the hint should go back to false (to verify that false was
1613 // default correctly).
1614 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001615 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001616
1617 DestroyVideoRtpSender();
1618}
1619
deadbeef20cb0c12017-02-01 20:27:00 -08001620TEST_F(RtpSenderReceiverTest, AudioSenderHasDtmfSender) {
1621 CreateAudioRtpSender();
1622 EXPECT_NE(nullptr, audio_rtp_sender_->GetDtmfSender());
1623}
1624
1625TEST_F(RtpSenderReceiverTest, VideoSenderDoesNotHaveDtmfSender) {
1626 CreateVideoRtpSender();
1627 EXPECT_EQ(nullptr, video_rtp_sender_->GetDtmfSender());
1628}
1629
1630// Test that the DTMF sender is really using |voice_channel_|, and thus returns
1631// true/false from CanSendDtmf based on what |voice_channel_| returns.
1632TEST_F(RtpSenderReceiverTest, CanInsertDtmf) {
1633 AddDtmfCodec();
1634 CreateAudioRtpSender();
1635 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1636 ASSERT_NE(nullptr, dtmf_sender);
1637 EXPECT_TRUE(dtmf_sender->CanInsertDtmf());
1638}
1639
1640TEST_F(RtpSenderReceiverTest, CanNotInsertDtmf) {
1641 CreateAudioRtpSender();
1642 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1643 ASSERT_NE(nullptr, dtmf_sender);
1644 // DTMF codec has not been added, as it was in the above test.
1645 EXPECT_FALSE(dtmf_sender->CanInsertDtmf());
1646}
1647
1648TEST_F(RtpSenderReceiverTest, InsertDtmf) {
1649 AddDtmfCodec();
1650 CreateAudioRtpSender();
1651 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1652 ASSERT_NE(nullptr, dtmf_sender);
1653
1654 EXPECT_EQ(0U, voice_media_channel_->dtmf_info_queue().size());
1655
1656 // Insert DTMF
1657 const int expected_duration = 90;
1658 dtmf_sender->InsertDtmf("012", expected_duration, 100);
1659
1660 // Verify
1661 ASSERT_EQ_WAIT(3U, voice_media_channel_->dtmf_info_queue().size(),
1662 kDefaultTimeout);
1663 const uint32_t send_ssrc =
1664 voice_media_channel_->send_streams()[0].first_ssrc();
1665 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[0],
1666 send_ssrc, 0, expected_duration));
1667 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[1],
1668 send_ssrc, 1, expected_duration));
1669 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[2],
1670 send_ssrc, 2, expected_duration));
1671}
1672
1673// Make sure the signal from "GetOnDestroyedSignal()" fires when the sender is
1674// destroyed, which is needed for the DTMF sender.
1675TEST_F(RtpSenderReceiverTest, TestOnDestroyedSignal) {
1676 CreateAudioRtpSender();
1677 EXPECT_FALSE(audio_sender_destroyed_signal_fired_);
1678 audio_rtp_sender_ = nullptr;
1679 EXPECT_TRUE(audio_sender_destroyed_signal_fired_);
1680}
1681
Benjamin Wright84583f62018-10-04 14:22:34 -07001682// Validate that the default FrameEncryptor setting is nullptr.
1683TEST_F(RtpSenderReceiverTest, AudioSenderCanSetFrameEncryptor) {
1684 CreateAudioRtpSender();
1685 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1686 new FakeFrameEncryptor());
1687 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1688 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1689 EXPECT_EQ(fake_frame_encryptor.get(),
1690 audio_rtp_sender_->GetFrameEncryptor().get());
1691}
1692
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001693// Validate that setting a FrameEncryptor after the send stream is stopped does
1694// nothing.
1695TEST_F(RtpSenderReceiverTest, AudioSenderCannotSetFrameEncryptorAfterStop) {
1696 CreateAudioRtpSender();
1697 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1698 new FakeFrameEncryptor());
1699 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1700 audio_rtp_sender_->Stop();
1701 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1702 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1703}
1704
Benjamin Wright84583f62018-10-04 14:22:34 -07001705// Validate that the default FrameEncryptor setting is nullptr.
1706TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetFrameDecryptor) {
1707 CreateAudioRtpReceiver();
1708 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1709 new FakeFrameDecryptor());
1710 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
1711 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1712 EXPECT_EQ(fake_frame_decryptor.get(),
1713 audio_rtp_receiver_->GetFrameDecryptor().get());
1714}
1715
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001716// Validate that the default FrameEncryptor setting is nullptr.
1717TEST_F(RtpSenderReceiverTest, AudioReceiverCannotSetFrameDecryptorAfterStop) {
1718 CreateAudioRtpReceiver();
1719 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1720 new FakeFrameDecryptor());
1721 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
1722 audio_rtp_receiver_->Stop();
1723 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1724 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1725}
1726
1727// Validate that the default FrameEncryptor setting is nullptr.
1728TEST_F(RtpSenderReceiverTest, VideoSenderCanSetFrameEncryptor) {
1729 CreateVideoRtpSender();
1730 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1731 new FakeFrameEncryptor());
1732 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1733 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1734 EXPECT_EQ(fake_frame_encryptor.get(),
1735 video_rtp_sender_->GetFrameEncryptor().get());
1736}
1737
1738// Validate that setting a FrameEncryptor after the send stream is stopped does
1739// nothing.
1740TEST_F(RtpSenderReceiverTest, VideoSenderCannotSetFrameEncryptorAfterStop) {
1741 CreateVideoRtpSender();
1742 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1743 new FakeFrameEncryptor());
1744 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1745 video_rtp_sender_->Stop();
1746 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1747 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1748}
1749
1750// Validate that the default FrameEncryptor setting is nullptr.
1751TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetFrameDecryptor) {
1752 CreateVideoRtpReceiver();
1753 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1754 new FakeFrameDecryptor());
1755 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
1756 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1757 EXPECT_EQ(fake_frame_decryptor.get(),
1758 video_rtp_receiver_->GetFrameDecryptor().get());
1759}
1760
1761// Validate that the default FrameEncryptor setting is nullptr.
1762TEST_F(RtpSenderReceiverTest, VideoReceiverCannotSetFrameDecryptorAfterStop) {
1763 CreateVideoRtpReceiver();
1764 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1765 new FakeFrameDecryptor());
1766 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
1767 video_rtp_receiver_->Stop();
1768 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1769 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1770}
1771
Amit Hilbuch619b2942019-02-26 15:55:19 -08001772// Checks that calling the internal methods for get/set parameters do not
1773// invalidate any parameters retreived by clients.
1774TEST_F(RtpSenderReceiverTest,
1775 InternalParameterMethodsDoNotInvalidateTransaction) {
1776 CreateVideoRtpSender();
1777 RtpParameters parameters = video_rtp_sender_->GetParameters();
1778 RtpParameters new_parameters = video_rtp_sender_->GetParametersInternal();
1779 new_parameters.encodings[0].active = false;
1780 video_rtp_sender_->SetParametersInternal(new_parameters);
1781 new_parameters.encodings[0].active = true;
1782 video_rtp_sender_->SetParametersInternal(new_parameters);
1783 parameters.encodings[0].active = false;
1784 EXPECT_TRUE(video_rtp_sender_->SetParameters(parameters).ok());
1785}
1786
Amit Hilbuch2297d332019-02-19 12:49:22 -08001787// Helper method for syntactic sugar for accepting a vector with '{}' notation.
1788std::pair<RidList, RidList> CreatePairOfRidVectors(
1789 const std::vector<std::string>& first,
1790 const std::vector<std::string>& second) {
1791 return std::make_pair(first, second);
1792}
1793
1794// These parameters are used to test disabling simulcast layers.
1795const std::pair<RidList, RidList> kDisableSimulcastLayersParameters[] = {
1796 // Tests removing the first layer. This is a special case because
1797 // the first layer's SSRC is also the 'primary' SSRC used to associate the
1798 // parameters to the media channel.
1799 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"1"}),
1800 // Tests removing some layers.
1801 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"2", "4"}),
1802 // Tests simulcast rejected scenario all layers except first are rejected.
1803 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"2", "3", "4"}),
1804 // Tests removing all layers.
1805 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"1", "2", "3", "4"}),
1806};
1807
1808// Runs test for disabling layers on a sender without a media engine set.
1809TEST_P(RtpSenderReceiverTest, DisableSimulcastLayersWithoutMediaEngine) {
1810 auto parameter = GetParam();
1811 RunDisableSimulcastLayersWithoutMediaEngineTest(parameter.first,
1812 parameter.second);
1813}
1814
1815// Runs test for disabling layers on a sender with a media engine set.
1816TEST_P(RtpSenderReceiverTest, DisableSimulcastLayersWithMediaEngine) {
1817 auto parameter = GetParam();
1818 RunDisableSimulcastLayersWithMediaEngineTest(parameter.first,
1819 parameter.second);
1820}
1821
1822INSTANTIATE_TEST_SUITE_P(
1823 DisableSimulcastLayersInSender,
1824 RtpSenderReceiverTest,
1825 ::testing::ValuesIn(kDisableSimulcastLayersParameters));
1826
deadbeef70ab1a12015-09-28 16:53:55 -07001827} // namespace webrtc