blob: c10ac87cef033f7f2be07a37503cf9fec9d6c64a [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
deadbeef70ab1a12015-09-28 16:53:55 -0700459 protected:
Steve Anton47136dd2018-01-12 10:49:35 -0800460 rtc::Thread* const network_thread_;
461 rtc::Thread* const worker_thread_;
skvlad11a9cbf2016-10-07 11:53:05 -0700462 webrtc::RtcEventLogNullImpl event_log_;
Zhi Huange830e682018-03-30 10:48:35 -0700463 // The |rtp_dtls_transport_| and |rtp_transport_| should be destroyed after
464 // the |channel_manager|.
465 std::unique_ptr<cricket::DtlsTransportInternal> rtp_dtls_transport_;
466 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport_;
deadbeef112b2e92017-02-10 20:13:37 -0800467 // |media_engine_| is actually owned by |channel_manager_|.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700468 cricket::FakeMediaEngine* media_engine_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700469 cricket::ChannelManager channel_manager_;
470 cricket::FakeCall fake_call_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700471 cricket::VoiceChannel* voice_channel_;
472 cricket::VideoChannel* video_channel_;
473 cricket::FakeVoiceMediaChannel* voice_media_channel_;
474 cricket::FakeVideoMediaChannel* video_media_channel_;
deadbeef70ab1a12015-09-28 16:53:55 -0700475 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
476 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
477 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
478 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
deadbeefe814a0d2017-02-25 18:15:09 -0800479 rtc::scoped_refptr<MediaStreamInterface> local_stream_;
deadbeef70ab1a12015-09-28 16:53:55 -0700480 rtc::scoped_refptr<VideoTrackInterface> video_track_;
481 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
deadbeef20cb0c12017-02-01 20:27:00 -0800482 bool audio_sender_destroyed_signal_fired_ = false;
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800483 rtc::UniqueRandomIdGenerator ssrc_generator_;
deadbeef70ab1a12015-09-28 16:53:55 -0700484};
485
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700486// Test that |voice_channel_| is updated when an audio track is associated
deadbeef70ab1a12015-09-28 16:53:55 -0700487// and disassociated with an AudioRtpSender.
488TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
489 CreateAudioRtpSender();
490 DestroyAudioRtpSender();
491}
492
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700493// Test that |video_channel_| is updated when a video track is associated and
deadbeef70ab1a12015-09-28 16:53:55 -0700494// disassociated with a VideoRtpSender.
495TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
496 CreateVideoRtpSender();
497 DestroyVideoRtpSender();
498}
499
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700500// Test that |voice_channel_| is updated when a remote audio track is
deadbeef70ab1a12015-09-28 16:53:55 -0700501// associated and disassociated with an AudioRtpReceiver.
502TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
503 CreateAudioRtpReceiver();
504 DestroyAudioRtpReceiver();
505}
506
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700507// Test that |video_channel_| is updated when a remote video track is
508// associated and disassociated with a VideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700509TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
510 CreateVideoRtpReceiver();
511 DestroyVideoRtpReceiver();
512}
513
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100514TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiverWithStreams) {
515 CreateAudioRtpReceiver({local_stream_});
516 DestroyAudioRtpReceiver();
517}
518
519TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiverWithStreams) {
520 CreateVideoRtpReceiver({local_stream_});
521 DestroyVideoRtpReceiver();
522}
523
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700524// Test that the AudioRtpSender applies options from the local audio source.
525TEST_F(RtpSenderReceiverTest, LocalAudioSourceOptionsApplied) {
526 cricket::AudioOptions options;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100527 options.echo_cancellation = true;
deadbeef757146b2017-02-10 21:26:48 -0800528 auto source = LocalAudioSource::Create(&options);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700529 CreateAudioRtpSender(source.get());
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700530
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100531 EXPECT_EQ(true, voice_media_channel_->options().echo_cancellation);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700532
533 DestroyAudioRtpSender();
534}
535
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700536// Test that the stream is muted when the track is disabled, and unmuted when
537// the track is enabled.
538TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) {
539 CreateAudioRtpSender();
540
541 audio_track_->set_enabled(false);
542 EXPECT_TRUE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
543
544 audio_track_->set_enabled(true);
545 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
546
547 DestroyAudioRtpSender();
548}
549
550// Test that the volume is set to 0 when the track is disabled, and back to
551// 1 when the track is enabled.
deadbeef70ab1a12015-09-28 16:53:55 -0700552TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
553 CreateAudioRtpReceiver();
554
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700555 double volume;
556 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
557 EXPECT_EQ(1, volume);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700558
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700559 audio_track_->set_enabled(false);
560 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
561 EXPECT_EQ(0, volume);
562
deadbeef70ab1a12015-09-28 16:53:55 -0700563 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700564 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
565 EXPECT_EQ(1, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700566
567 DestroyAudioRtpReceiver();
568}
569
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700570// Currently no action is taken when a remote video track is disabled or
571// enabled, so there's nothing to test here, other than what is normally
572// verified in DestroyVideoRtpSender.
deadbeef70ab1a12015-09-28 16:53:55 -0700573TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
574 CreateVideoRtpSender();
575
deadbeef70ab1a12015-09-28 16:53:55 -0700576 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700577 video_track_->set_enabled(true);
578
579 DestroyVideoRtpSender();
580}
581
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700582// Test that the state of the video track created by the VideoRtpReceiver is
583// updated when the receiver is destroyed.
perkjf0dcfe22016-03-10 18:32:00 +0100584TEST_F(RtpSenderReceiverTest, RemoteVideoTrackState) {
585 CreateVideoRtpReceiver();
586
587 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track_->state());
588 EXPECT_EQ(webrtc::MediaSourceInterface::kLive,
589 video_track_->GetSource()->state());
590
591 DestroyVideoRtpReceiver();
592
593 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track_->state());
594 EXPECT_EQ(webrtc::MediaSourceInterface::kEnded,
595 video_track_->GetSource()->state());
596}
597
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700598// Currently no action is taken when a remote video track is disabled or
599// enabled, so there's nothing to test here, other than what is normally
600// verified in DestroyVideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700601TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
602 CreateVideoRtpReceiver();
603
604 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700605 video_track_->set_enabled(true);
606
607 DestroyVideoRtpReceiver();
608}
609
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700610// Test that the AudioRtpReceiver applies volume changes from the track source
611// to the media channel.
deadbeef70ab1a12015-09-28 16:53:55 -0700612TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
613 CreateAudioRtpReceiver();
614
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700615 double volume;
616 audio_track_->GetSource()->SetVolume(0.5);
617 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
618 EXPECT_EQ(0.5, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700619
620 // Disable the audio track, this should prevent setting the volume.
deadbeef70ab1a12015-09-28 16:53:55 -0700621 audio_track_->set_enabled(false);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700622 audio_track_->GetSource()->SetVolume(0.8);
623 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
624 EXPECT_EQ(0, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700625
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700626 // When the track is enabled, the previously set volume should take effect.
deadbeef70ab1a12015-09-28 16:53:55 -0700627 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700628 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
629 EXPECT_EQ(0.8, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700630
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700631 // Try changing volume one more time.
632 audio_track_->GetSource()->SetVolume(0.9);
633 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
634 EXPECT_EQ(0.9, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700635
636 DestroyAudioRtpReceiver();
637}
638
Ruslan Burakov7ea46052019-02-16 02:07:05 +0100639TEST_F(RtpSenderReceiverTest, RemoteAudioSourceLatencyCaching) {
640 absl::optional<int> delay_ms; // In milliseconds.
641 double latency_s = 0.5; // In seconds.
642 rtc::scoped_refptr<RemoteAudioSource> source =
643 new rtc::RefCountedObject<RemoteAudioSource>(rtc::Thread::Current());
644
645 // Check default value.
646 EXPECT_DOUBLE_EQ(source->GetLatency(), 0.0);
647
648 // Check caching behaviour.
649 source->SetLatency(latency_s);
650 EXPECT_DOUBLE_EQ(source->GetLatency(), latency_s);
651
652 // Check that cached value applied on the start.
653 source->Start(voice_media_channel_, kAudioSsrc);
654 delay_ms = voice_media_channel_->GetBaseMinimumPlayoutDelayMs(kAudioSsrc);
655 EXPECT_DOUBLE_EQ(latency_s, delay_ms.value_or(0) / 1000.0);
656
657 // Check that setting latency changes delay.
658 latency_s = 0.8;
659 source->SetLatency(latency_s);
660 delay_ms = voice_media_channel_->GetBaseMinimumPlayoutDelayMs(kAudioSsrc);
661 EXPECT_DOUBLE_EQ(latency_s, delay_ms.value_or(0) / 1000.0);
662 EXPECT_DOUBLE_EQ(latency_s, source->GetLatency());
663
664 // Check that if underlying delay is changed then remote source will reflect
665 // it.
666 delay_ms = 300;
667 voice_media_channel_->SetBaseMinimumPlayoutDelayMs(kAudioSsrc,
668 delay_ms.value());
669 EXPECT_DOUBLE_EQ(source->GetLatency(), delay_ms.value() / 1000.0);
670
671 // Check that after stop we get last cached value.
672 source->Stop(voice_media_channel_, kAudioSsrc);
673 EXPECT_DOUBLE_EQ(latency_s, source->GetLatency());
674
675 // Check that if we start source again with new ssrc then cached value is
676 // applied.
677 source->Start(voice_media_channel_, kAudioSsrc2);
678 delay_ms = voice_media_channel_->GetBaseMinimumPlayoutDelayMs(kAudioSsrc2);
679 EXPECT_DOUBLE_EQ(latency_s, delay_ms.value_or(0) / 1000.0);
680
681 // Check rounding behavior.
682 source->SetLatency(2 / 1000.0);
683 delay_ms = voice_media_channel_->GetBaseMinimumPlayoutDelayMs(kAudioSsrc2);
684 EXPECT_EQ(0, delay_ms.value_or(-1));
685 EXPECT_DOUBLE_EQ(0, source->GetLatency());
686}
687
688TEST_F(RtpSenderReceiverTest, RemoteAudioSourceLatencyNoCaching) {
689 int delay_ms = 300; // In milliseconds.
690 rtc::scoped_refptr<RemoteAudioSource> source =
691 new rtc::RefCountedObject<RemoteAudioSource>(rtc::Thread::Current());
692
693 // Set it to value different from default zero.
694 voice_media_channel_->SetBaseMinimumPlayoutDelayMs(kAudioSsrc, delay_ms);
695
696 // Check that calling GetLatency on the source that hasn't been started yet
697 // won't trigger caching.
698 EXPECT_DOUBLE_EQ(source->GetLatency(), 0);
699 source->Start(voice_media_channel_, kAudioSsrc);
700 EXPECT_DOUBLE_EQ(source->GetLatency(), delay_ms / 1000.0);
701}
702
703TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetLatency) {
704 CreateAudioRtpReceiver();
705
706 absl::optional<int> delay_ms; // In milliseconds.
707 double latency_s = 0.5; // In seconds.
708 audio_track_->GetSource()->SetLatency(latency_s);
709 delay_ms = voice_media_channel_->GetBaseMinimumPlayoutDelayMs(kAudioSsrc);
710 EXPECT_DOUBLE_EQ(latency_s, delay_ms.value_or(0) / 1000.0);
711
712 // Disabling the track should take no effect on previously set value.
713 audio_track_->set_enabled(false);
714 delay_ms = voice_media_channel_->GetBaseMinimumPlayoutDelayMs(kAudioSsrc);
715 EXPECT_DOUBLE_EQ(latency_s, delay_ms.value_or(0) / 1000.0);
716
717 // When the track is disabled, we still should be able to set latency.
718 latency_s = 0.3;
719 audio_track_->GetSource()->SetLatency(latency_s);
720 delay_ms = voice_media_channel_->GetBaseMinimumPlayoutDelayMs(kAudioSsrc);
721 EXPECT_DOUBLE_EQ(latency_s, delay_ms.value_or(0) / 1000.0);
722
723 // Enabling the track should take no effect on previously set value.
724 audio_track_->set_enabled(true);
725 delay_ms = voice_media_channel_->GetBaseMinimumPlayoutDelayMs(kAudioSsrc);
726 EXPECT_DOUBLE_EQ(latency_s, delay_ms.value_or(0) / 1000.0);
727
728 // We still should be able to change latency.
729 latency_s = 0.0;
730 audio_track_->GetSource()->SetLatency(latency_s);
731 delay_ms = voice_media_channel_->GetBaseMinimumPlayoutDelayMs(kAudioSsrc);
732 EXPECT_EQ(0, delay_ms.value_or(-1));
733 EXPECT_DOUBLE_EQ(latency_s, delay_ms.value_or(0) / 1000.0);
734}
735
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700736// Test that the media channel isn't enabled for sending if the audio sender
737// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800738TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800739 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800740 rtc::scoped_refptr<AudioTrackInterface> track =
741 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700742
743 // Track but no SSRC.
744 EXPECT_TRUE(audio_rtp_sender_->SetTrack(track));
745 VerifyVoiceChannelNoInput();
746
747 // SSRC but no track.
748 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
749 audio_rtp_sender_->SetSsrc(kAudioSsrc);
750 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800751}
752
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700753// Test that the media channel isn't enabled for sending if the video sender
754// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800755TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800756 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700757
758 // Track but no SSRC.
759 EXPECT_TRUE(video_rtp_sender_->SetTrack(video_track_));
760 VerifyVideoChannelNoInput();
761
762 // SSRC but no track.
763 EXPECT_TRUE(video_rtp_sender_->SetTrack(nullptr));
764 video_rtp_sender_->SetSsrc(kVideoSsrc);
765 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800766}
767
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700768// Test that the media channel is enabled for sending when the audio sender
769// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800770TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800771 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800772 rtc::scoped_refptr<AudioTrackInterface> track =
773 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700774 audio_rtp_sender_->SetSsrc(kAudioSsrc);
775 audio_rtp_sender_->SetTrack(track);
776 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800777
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700778 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800779}
780
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700781// Test that the media channel is enabled for sending when the audio sender
782// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800783TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800784 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800785 rtc::scoped_refptr<AudioTrackInterface> track =
786 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700787 audio_rtp_sender_->SetTrack(track);
788 audio_rtp_sender_->SetSsrc(kAudioSsrc);
789 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800790
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700791 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800792}
793
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700794// Test that the media channel is enabled for sending when the video sender
795// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800796TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
nisseaf510af2016-03-21 08:20:42 -0700797 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800798 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700799 video_rtp_sender_->SetSsrc(kVideoSsrc);
800 video_rtp_sender_->SetTrack(video_track_);
801 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800802
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700803 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800804}
805
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700806// Test that the media channel is enabled for sending when the video sender
807// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800808TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
nisseaf510af2016-03-21 08:20:42 -0700809 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800810 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700811 video_rtp_sender_->SetTrack(video_track_);
812 video_rtp_sender_->SetSsrc(kVideoSsrc);
813 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800814
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700815 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800816}
817
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700818// Test that the media channel stops sending when the audio sender's SSRC is set
819// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800820TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700821 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800822
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700823 audio_rtp_sender_->SetSsrc(0);
824 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800825}
826
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700827// Test that the media channel stops sending when the video sender's SSRC is set
828// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800829TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700830 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800831
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700832 audio_rtp_sender_->SetSsrc(0);
833 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800834}
835
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700836// Test that the media channel stops sending when the audio sender's track is
837// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800838TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700839 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800840
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700841 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
842 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800843}
844
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700845// Test that the media channel stops sending when the video sender's track is
846// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800847TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700848 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800849
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700850 video_rtp_sender_->SetSsrc(0);
851 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800852}
853
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700854// Test that when the audio sender's SSRC is changed, the media channel stops
855// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800856TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700857 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800858
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700859 audio_rtp_sender_->SetSsrc(kAudioSsrc2);
860 VerifyVoiceChannelNoInput(kAudioSsrc);
861 VerifyVoiceChannelInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800862
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700863 audio_rtp_sender_ = nullptr;
864 VerifyVoiceChannelNoInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800865}
866
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700867// Test that when the audio sender's SSRC is changed, the media channel stops
868// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800869TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700870 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800871
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700872 video_rtp_sender_->SetSsrc(kVideoSsrc2);
873 VerifyVideoChannelNoInput(kVideoSsrc);
874 VerifyVideoChannelInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800875
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700876 video_rtp_sender_ = nullptr;
877 VerifyVideoChannelNoInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800878}
879
skvladdc1c62c2016-03-16 19:07:43 -0700880TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) {
881 CreateAudioRtpSender();
882
skvladdc1c62c2016-03-16 19:07:43 -0700883 RtpParameters params = audio_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700884 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -0800885 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -0700886
887 DestroyAudioRtpSender();
888}
889
Florent Castelli892acf02018-10-01 22:47:20 +0200890TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParametersBeforeNegotiation) {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800891 audio_rtp_sender_ =
892 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +0200893
894 RtpParameters params = audio_rtp_sender_->GetParameters();
895 ASSERT_EQ(1u, params.encodings.size());
896 params.encodings[0].max_bitrate_bps = 90000;
897 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
898
899 params = audio_rtp_sender_->GetParameters();
900 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
901 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
902
903 DestroyAudioRtpSender();
904}
905
906TEST_F(RtpSenderReceiverTest, AudioSenderInitParametersMovedAfterNegotiation) {
907 audio_track_ = AudioTrack::Create(kAudioTrackId, nullptr);
908 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
909
910 audio_rtp_sender_ =
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800911 AudioRtpSender::Create(worker_thread_, audio_track_->id(), nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +0200912 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_));
913 audio_rtp_sender_->set_stream_ids({local_stream_->id()});
914
915 std::vector<RtpEncodingParameters> init_encodings(1);
916 init_encodings[0].max_bitrate_bps = 60000;
917 audio_rtp_sender_->set_init_send_encodings(init_encodings);
918
919 RtpParameters params = audio_rtp_sender_->GetParameters();
920 ASSERT_EQ(1u, params.encodings.size());
921 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
922
923 // Simulate the setLocalDescription call
924 std::vector<uint32_t> ssrcs(1, 1);
925 cricket::StreamParams stream_params =
926 cricket::CreateSimStreamParams("cname", ssrcs);
927 voice_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800928 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +0200929 audio_rtp_sender_->SetSsrc(1);
930
931 params = audio_rtp_sender_->GetParameters();
932 ASSERT_EQ(1u, params.encodings.size());
933 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
934
935 DestroyAudioRtpSender();
936}
937
938TEST_F(RtpSenderReceiverTest,
939 AudioSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800940 audio_rtp_sender_ =
941 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +0200942
943 RtpParameters params;
944 RTCError result = audio_rtp_sender_->SetParameters(params);
945 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
946 DestroyAudioRtpSender();
947}
948
Florent Castellicebf50f2018-05-03 15:31:53 +0200949TEST_F(RtpSenderReceiverTest,
950 AudioSenderMustCallGetParametersBeforeSetParameters) {
951 CreateAudioRtpSender();
952
953 RtpParameters params;
954 RTCError result = audio_rtp_sender_->SetParameters(params);
955 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
956
957 DestroyAudioRtpSender();
958}
959
960TEST_F(RtpSenderReceiverTest,
961 AudioSenderSetParametersInvalidatesTransactionId) {
962 CreateAudioRtpSender();
963
964 RtpParameters params = audio_rtp_sender_->GetParameters();
965 EXPECT_EQ(1u, params.encodings.size());
966 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
967 RTCError result = audio_rtp_sender_->SetParameters(params);
968 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
969
970 DestroyAudioRtpSender();
971}
972
973TEST_F(RtpSenderReceiverTest, AudioSenderDetectTransactionIdModification) {
974 CreateAudioRtpSender();
975
976 RtpParameters params = audio_rtp_sender_->GetParameters();
977 params.transaction_id = "";
978 RTCError result = audio_rtp_sender_->SetParameters(params);
979 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
980
981 DestroyAudioRtpSender();
982}
983
984TEST_F(RtpSenderReceiverTest, AudioSenderCheckTransactionIdRefresh) {
985 CreateAudioRtpSender();
986
987 RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200988 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 15:31:53 +0200989 auto saved_transaction_id = params.transaction_id;
990 params = audio_rtp_sender_->GetParameters();
991 EXPECT_NE(saved_transaction_id, params.transaction_id);
992
993 DestroyAudioRtpSender();
994}
995
996TEST_F(RtpSenderReceiverTest, AudioSenderSetParametersOldValueFail) {
997 CreateAudioRtpSender();
998
999 RtpParameters params = audio_rtp_sender_->GetParameters();
1000 RtpParameters second_params = audio_rtp_sender_->GetParameters();
1001
1002 RTCError result = audio_rtp_sender_->SetParameters(params);
1003 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
Seth Hampson2d2c8882018-05-16 16:02:32 -07001004 DestroyAudioRtpSender();
1005}
1006
1007TEST_F(RtpSenderReceiverTest, AudioSenderCantSetUnimplementedRtpParameters) {
1008 CreateAudioRtpSender();
1009 RtpParameters params = audio_rtp_sender_->GetParameters();
1010 EXPECT_EQ(1u, params.encodings.size());
1011
Florent Castelli87b3c512018-07-18 16:00:28 +02001012 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 16:02:32 -07001013 params.mid = "dummy_mid";
1014 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1015 audio_rtp_sender_->SetParameters(params).type());
1016 params = audio_rtp_sender_->GetParameters();
1017
Seth Hampson2d2c8882018-05-16 16:02:32 -07001018 DestroyAudioRtpSender();
1019}
1020
1021TEST_F(RtpSenderReceiverTest,
1022 AudioSenderCantSetUnimplementedRtpEncodingParameters) {
1023 CreateAudioRtpSender();
1024 RtpParameters params = audio_rtp_sender_->GetParameters();
1025 EXPECT_EQ(1u, params.encodings.size());
1026
Henrik Grunelle1301a82018-12-13 12:13:22 +00001027 // Unimplemented RtpParameters: codec_payload_type, fec, rtx, dtx, ptime,
Amit Hilbuchaa584152019-02-06 17:09:52 -08001028 // scale_framerate_down_by, dependency_rids.
Henrik Grunelle1301a82018-12-13 12:13:22 +00001029 params.encodings[0].codec_payload_type = 1;
1030 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1031 audio_rtp_sender_->SetParameters(params).type());
1032 params = audio_rtp_sender_->GetParameters();
1033
Seth Hampson2d2c8882018-05-16 16:02:32 -07001034 params.encodings[0].fec = RtpFecParameters();
1035 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1036 audio_rtp_sender_->SetParameters(params).type());
1037 params = audio_rtp_sender_->GetParameters();
1038
1039 params.encodings[0].rtx = RtpRtxParameters();
1040 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1041 audio_rtp_sender_->SetParameters(params).type());
1042 params = audio_rtp_sender_->GetParameters();
1043
1044 params.encodings[0].dtx = DtxStatus::ENABLED;
1045 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1046 audio_rtp_sender_->SetParameters(params).type());
1047 params = audio_rtp_sender_->GetParameters();
1048
1049 params.encodings[0].ptime = 1;
1050 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1051 audio_rtp_sender_->SetParameters(params).type());
1052 params = audio_rtp_sender_->GetParameters();
1053
Seth Hampson2d2c8882018-05-16 16:02:32 -07001054 params.encodings[0].dependency_rids.push_back("dummy_rid");
1055 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1056 audio_rtp_sender_->SetParameters(params).type());
Florent Castellicebf50f2018-05-03 15:31:53 +02001057
1058 DestroyAudioRtpSender();
1059}
1060
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001061TEST_F(RtpSenderReceiverTest, SetAudioMaxSendBitrate) {
1062 CreateAudioRtpSender();
1063
1064 EXPECT_EQ(-1, voice_media_channel_->max_bps());
1065 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001066 EXPECT_EQ(1U, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -08001067 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001068 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -08001069 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001070
1071 // Read back the parameters and verify they have been changed.
1072 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001073 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001074 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001075
1076 // Verify that the audio channel received the new parameters.
1077 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001078 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001079 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001080
1081 // Verify that the global bitrate limit has not been changed.
1082 EXPECT_EQ(-1, voice_media_channel_->max_bps());
1083
1084 DestroyAudioRtpSender();
1085}
1086
Seth Hampson24722b32017-12-22 09:36:42 -08001087TEST_F(RtpSenderReceiverTest, SetAudioBitratePriority) {
1088 CreateAudioRtpSender();
1089
1090 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001091 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001092 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1093 params.encodings[0].bitrate_priority);
1094 double new_bitrate_priority = 2.0;
1095 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -08001096 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -08001097
1098 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001099 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001100 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1101
1102 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001103 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001104 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1105
1106 DestroyAudioRtpSender();
1107}
1108
skvladdc1c62c2016-03-16 19:07:43 -07001109TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) {
1110 CreateVideoRtpSender();
1111
skvladdc1c62c2016-03-16 19:07:43 -07001112 RtpParameters params = video_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001113 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -08001114 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -07001115
1116 DestroyVideoRtpSender();
1117}
1118
Florent Castelli892acf02018-10-01 22:47:20 +02001119TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParametersBeforeNegotiation) {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -08001120 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, /*id=*/"");
Florent Castelli892acf02018-10-01 22:47:20 +02001121
1122 RtpParameters params = video_rtp_sender_->GetParameters();
1123 ASSERT_EQ(1u, params.encodings.size());
1124 params.encodings[0].max_bitrate_bps = 90000;
1125 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1126
1127 params = video_rtp_sender_->GetParameters();
1128 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1129 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
1130
1131 DestroyVideoRtpSender();
1132}
1133
1134TEST_F(RtpSenderReceiverTest, VideoSenderInitParametersMovedAfterNegotiation) {
1135 AddVideoTrack(false);
1136
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -08001137 video_rtp_sender_ =
1138 VideoRtpSender::Create(worker_thread_, video_track_->id());
Florent Castelli892acf02018-10-01 22:47:20 +02001139 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
1140 video_rtp_sender_->set_stream_ids({local_stream_->id()});
1141
1142 std::vector<RtpEncodingParameters> init_encodings(2);
1143 init_encodings[0].max_bitrate_bps = 60000;
1144 init_encodings[1].max_bitrate_bps = 900000;
1145 video_rtp_sender_->set_init_send_encodings(init_encodings);
1146
1147 RtpParameters params = video_rtp_sender_->GetParameters();
1148 ASSERT_EQ(2u, params.encodings.size());
1149 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1150 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
1151
1152 // Simulate the setLocalDescription call
1153 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +01001154 ssrcs.reserve(2);
Florent Castelli892acf02018-10-01 22:47:20 +02001155 for (int i = 0; i < 2; ++i)
1156 ssrcs.push_back(kVideoSsrcSimulcast + i);
1157 cricket::StreamParams stream_params =
1158 cricket::CreateSimStreamParams("cname", ssrcs);
1159 video_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -08001160 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +02001161 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
1162
1163 params = video_rtp_sender_->GetParameters();
1164 ASSERT_EQ(2u, params.encodings.size());
1165 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1166 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
1167
1168 DestroyVideoRtpSender();
1169}
1170
1171TEST_F(RtpSenderReceiverTest,
1172 VideoSenderInitParametersMovedAfterManualSimulcastAndNegotiation) {
1173 AddVideoTrack(false);
1174
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -08001175 video_rtp_sender_ =
1176 VideoRtpSender::Create(worker_thread_, video_track_->id());
Florent Castelli892acf02018-10-01 22:47:20 +02001177 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
1178 video_rtp_sender_->set_stream_ids({local_stream_->id()});
1179
1180 std::vector<RtpEncodingParameters> init_encodings(1);
1181 init_encodings[0].max_bitrate_bps = 60000;
1182 video_rtp_sender_->set_init_send_encodings(init_encodings);
1183
1184 RtpParameters params = video_rtp_sender_->GetParameters();
1185 ASSERT_EQ(1u, params.encodings.size());
1186 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1187
1188 // Simulate the setLocalDescription call as if the user used SDP munging
1189 // to enable simulcast
1190 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +01001191 ssrcs.reserve(2);
Florent Castelli892acf02018-10-01 22:47:20 +02001192 for (int i = 0; i < 2; ++i)
1193 ssrcs.push_back(kVideoSsrcSimulcast + i);
1194 cricket::StreamParams stream_params =
1195 cricket::CreateSimStreamParams("cname", ssrcs);
1196 video_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -08001197 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +02001198 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
1199
1200 params = video_rtp_sender_->GetParameters();
1201 ASSERT_EQ(2u, params.encodings.size());
1202 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1203
1204 DestroyVideoRtpSender();
1205}
1206
1207TEST_F(RtpSenderReceiverTest,
1208 VideoSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -08001209 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, /*id=*/"");
Florent Castelli892acf02018-10-01 22:47:20 +02001210
1211 RtpParameters params;
1212 RTCError result = video_rtp_sender_->SetParameters(params);
1213 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1214 DestroyVideoRtpSender();
1215}
1216
Florent Castellicebf50f2018-05-03 15:31:53 +02001217TEST_F(RtpSenderReceiverTest,
1218 VideoSenderMustCallGetParametersBeforeSetParameters) {
1219 CreateVideoRtpSender();
1220
1221 RtpParameters params;
1222 RTCError result = video_rtp_sender_->SetParameters(params);
1223 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1224
1225 DestroyVideoRtpSender();
1226}
1227
1228TEST_F(RtpSenderReceiverTest,
1229 VideoSenderSetParametersInvalidatesTransactionId) {
1230 CreateVideoRtpSender();
1231
1232 RtpParameters params = video_rtp_sender_->GetParameters();
1233 EXPECT_EQ(1u, params.encodings.size());
1234 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1235 RTCError result = video_rtp_sender_->SetParameters(params);
1236 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1237
1238 DestroyVideoRtpSender();
1239}
1240
1241TEST_F(RtpSenderReceiverTest, VideoSenderDetectTransactionIdModification) {
1242 CreateVideoRtpSender();
1243
1244 RtpParameters params = video_rtp_sender_->GetParameters();
1245 params.transaction_id = "";
1246 RTCError result = video_rtp_sender_->SetParameters(params);
1247 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1248
1249 DestroyVideoRtpSender();
1250}
1251
1252TEST_F(RtpSenderReceiverTest, VideoSenderCheckTransactionIdRefresh) {
1253 CreateVideoRtpSender();
1254
1255 RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001256 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 15:31:53 +02001257 auto saved_transaction_id = params.transaction_id;
1258 params = video_rtp_sender_->GetParameters();
1259 EXPECT_NE(saved_transaction_id, params.transaction_id);
1260
1261 DestroyVideoRtpSender();
1262}
1263
1264TEST_F(RtpSenderReceiverTest, VideoSenderSetParametersOldValueFail) {
1265 CreateVideoRtpSender();
1266
1267 RtpParameters params = video_rtp_sender_->GetParameters();
1268 RtpParameters second_params = video_rtp_sender_->GetParameters();
1269
1270 RTCError result = video_rtp_sender_->SetParameters(params);
1271 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1272
1273 DestroyVideoRtpSender();
1274}
1275
Seth Hampson2d2c8882018-05-16 16:02:32 -07001276TEST_F(RtpSenderReceiverTest, VideoSenderCantSetUnimplementedRtpParameters) {
1277 CreateVideoRtpSender();
1278 RtpParameters params = video_rtp_sender_->GetParameters();
1279 EXPECT_EQ(1u, params.encodings.size());
1280
Florent Castelli87b3c512018-07-18 16:00:28 +02001281 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 16:02:32 -07001282 params.mid = "dummy_mid";
1283 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1284 video_rtp_sender_->SetParameters(params).type());
1285 params = video_rtp_sender_->GetParameters();
1286
Seth Hampson2d2c8882018-05-16 16:02:32 -07001287 DestroyVideoRtpSender();
1288}
1289
1290TEST_F(RtpSenderReceiverTest,
1291 VideoSenderCantSetUnimplementedEncodingParameters) {
1292 CreateVideoRtpSender();
1293 RtpParameters params = video_rtp_sender_->GetParameters();
1294 EXPECT_EQ(1u, params.encodings.size());
1295
Henrik Grunelle1301a82018-12-13 12:13:22 +00001296 // Unimplemented RtpParameters: codec_payload_type, fec, rtx, dtx, ptime,
Amit Hilbuchaa584152019-02-06 17:09:52 -08001297 // scale_framerate_down_by, dependency_rids.
Henrik Grunelle1301a82018-12-13 12:13:22 +00001298 params.encodings[0].codec_payload_type = 1;
1299 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1300 video_rtp_sender_->SetParameters(params).type());
1301 params = video_rtp_sender_->GetParameters();
1302
Seth Hampson2d2c8882018-05-16 16:02:32 -07001303 params.encodings[0].fec = RtpFecParameters();
1304 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1305 video_rtp_sender_->SetParameters(params).type());
1306 params = video_rtp_sender_->GetParameters();
1307
1308 params.encodings[0].rtx = RtpRtxParameters();
1309 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1310 video_rtp_sender_->SetParameters(params).type());
1311 params = video_rtp_sender_->GetParameters();
1312
1313 params.encodings[0].dtx = DtxStatus::ENABLED;
1314 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1315 video_rtp_sender_->SetParameters(params).type());
1316 params = video_rtp_sender_->GetParameters();
1317
1318 params.encodings[0].ptime = 1;
1319 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1320 video_rtp_sender_->SetParameters(params).type());
1321 params = video_rtp_sender_->GetParameters();
1322
Seth Hampson2d2c8882018-05-16 16:02:32 -07001323 params.encodings[0].dependency_rids.push_back("dummy_rid");
1324 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1325 video_rtp_sender_->SetParameters(params).type());
1326
1327 DestroyVideoRtpSender();
1328}
1329
Florent Castellic1a0bcb2019-01-29 14:26:48 +01001330TEST_F(RtpSenderReceiverTest, VideoSenderCanSetScaleResolutionDownBy) {
1331 CreateVideoRtpSender();
1332
1333 RtpParameters params = video_rtp_sender_->GetParameters();
1334 params.encodings[0].scale_resolution_down_by = 2;
1335
1336 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1337 params = video_rtp_sender_->GetParameters();
1338 EXPECT_EQ(2, params.encodings[0].scale_resolution_down_by);
1339
1340 DestroyVideoRtpSender();
1341}
1342
1343TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidScaleResolutionDownBy) {
1344 CreateVideoRtpSender();
1345
1346 RtpParameters params = video_rtp_sender_->GetParameters();
1347 params.encodings[0].scale_resolution_down_by = 0.5;
1348 RTCError result = video_rtp_sender_->SetParameters(params);
1349 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1350
1351 DestroyVideoRtpSender();
1352}
1353
Florent Castelli892acf02018-10-01 22:47:20 +02001354TEST_F(RtpSenderReceiverTest,
1355 VideoSenderCantSetUnimplementedEncodingParametersWithSimulcast) {
1356 CreateVideoRtpSenderWithSimulcast();
1357 RtpParameters params = video_rtp_sender_->GetParameters();
1358 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
1359
Henrik Grunelle1301a82018-12-13 12:13:22 +00001360 // Unimplemented RtpParameters: codec_payload_type, fec, rtx, dtx, ptime,
Amit Hilbuchaa584152019-02-06 17:09:52 -08001361 // scale_framerate_down_by, dependency_rids.
Florent Castelli892acf02018-10-01 22:47:20 +02001362 for (size_t i = 0; i < params.encodings.size(); i++) {
Henrik Grunelle1301a82018-12-13 12:13:22 +00001363 params.encodings[i].codec_payload_type = 1;
1364 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1365 video_rtp_sender_->SetParameters(params).type());
1366 params = video_rtp_sender_->GetParameters();
1367
Florent Castelli892acf02018-10-01 22:47:20 +02001368 params.encodings[i].fec = RtpFecParameters();
1369 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1370 video_rtp_sender_->SetParameters(params).type());
1371 params = video_rtp_sender_->GetParameters();
1372
1373 params.encodings[i].rtx = RtpRtxParameters();
1374 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1375 video_rtp_sender_->SetParameters(params).type());
1376 params = video_rtp_sender_->GetParameters();
1377
1378 params.encodings[i].dtx = DtxStatus::ENABLED;
1379 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1380 video_rtp_sender_->SetParameters(params).type());
1381 params = video_rtp_sender_->GetParameters();
1382
1383 params.encodings[i].ptime = 1;
1384 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1385 video_rtp_sender_->SetParameters(params).type());
1386 params = video_rtp_sender_->GetParameters();
1387
Florent Castelli892acf02018-10-01 22:47:20 +02001388 params.encodings[i].dependency_rids.push_back("dummy_rid");
1389 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1390 video_rtp_sender_->SetParameters(params).type());
1391 }
1392
1393 DestroyVideoRtpSender();
1394}
1395
Seth Hampson2d2c8882018-05-16 16:02:32 -07001396// A video sender can have multiple simulcast layers, in which case it will
1397// contain multiple RtpEncodingParameters. This tests that if this is the case
1398// (simulcast), then we can't set the bitrate_priority, or max_bitrate_bps
1399// for any encodings besides at index 0, because these are both implemented
1400// "per-sender."
1401TEST_F(RtpSenderReceiverTest, VideoSenderCantSetPerSenderEncodingParameters) {
1402 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001403 CreateVideoRtpSenderWithSimulcast();
Seth Hampson2d2c8882018-05-16 16:02:32 -07001404 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001405 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Seth Hampson2d2c8882018-05-16 16:02:32 -07001406
1407 params.encodings[1].bitrate_priority = 2.0;
1408 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1409 video_rtp_sender_->SetParameters(params).type());
1410 params = video_rtp_sender_->GetParameters();
1411
Seth Hampson2d2c8882018-05-16 16:02:32 -07001412 DestroyVideoRtpSender();
1413}
1414
Florent Castelli892acf02018-10-01 22:47:20 +02001415TEST_F(RtpSenderReceiverTest, VideoSenderCantSetReadOnlyEncodingParameters) {
1416 // Add a simulcast specific send stream that contains 2 encoding parameters.
1417 CreateVideoRtpSenderWithSimulcast();
1418 RtpParameters params = video_rtp_sender_->GetParameters();
1419 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
1420
1421 for (size_t i = 0; i < params.encodings.size(); i++) {
1422 params.encodings[i].ssrc = 1337;
1423 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION,
1424 video_rtp_sender_->SetParameters(params).type());
1425 params = video_rtp_sender_->GetParameters();
1426 }
1427
1428 DestroyVideoRtpSender();
1429}
1430
Ă…sa Persson55659812018-06-18 17:51:32 +02001431TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrate) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001432 CreateVideoRtpSender();
1433
1434 EXPECT_EQ(-1, video_media_channel_->max_bps());
1435 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001436 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001437 EXPECT_FALSE(params.encodings[0].min_bitrate_bps);
deadbeefe702b302017-02-04 12:09:01 -08001438 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Ă…sa Persson55659812018-06-18 17:51:32 +02001439 params.encodings[0].min_bitrate_bps = 100;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001440 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -08001441 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001442
1443 // Read back the parameters and verify they have been changed.
1444 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001445 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001446 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001447 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001448
1449 // Verify that the video channel received the new parameters.
1450 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001451 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001452 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001453 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001454
1455 // Verify that the global bitrate limit has not been changed.
1456 EXPECT_EQ(-1, video_media_channel_->max_bps());
1457
1458 DestroyVideoRtpSender();
1459}
1460
Ă…sa Persson55659812018-06-18 17:51:32 +02001461TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrateSimulcast) {
1462 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001463 CreateVideoRtpSenderWithSimulcast();
Ă…sa Persson55659812018-06-18 17:51:32 +02001464
1465 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001466 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001467 params.encodings[0].min_bitrate_bps = 100;
1468 params.encodings[0].max_bitrate_bps = 1000;
1469 params.encodings[1].min_bitrate_bps = 200;
1470 params.encodings[1].max_bitrate_bps = 2000;
1471 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1472
1473 // Verify that the video channel received the new parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001474 params = video_media_channel_->GetRtpSendParameters(kVideoSsrcSimulcast);
1475 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001476 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
1477 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
1478 EXPECT_EQ(200, params.encodings[1].min_bitrate_bps);
1479 EXPECT_EQ(2000, params.encodings[1].max_bitrate_bps);
1480
1481 DestroyVideoRtpSender();
1482}
1483
Seth Hampson24722b32017-12-22 09:36:42 -08001484TEST_F(RtpSenderReceiverTest, SetVideoBitratePriority) {
1485 CreateVideoRtpSender();
1486
1487 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001488 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001489 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1490 params.encodings[0].bitrate_priority);
1491 double new_bitrate_priority = 2.0;
1492 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -08001493 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -08001494
1495 params = video_rtp_sender_->GetParameters();
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 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001500 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001501 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1502
1503 DestroyVideoRtpSender();
1504}
1505
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001506TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetParameters) {
1507 CreateAudioRtpReceiver();
1508
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001509 RtpParameters params = audio_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001510 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001511 EXPECT_TRUE(audio_rtp_receiver_->SetParameters(params));
1512
1513 DestroyAudioRtpReceiver();
1514}
1515
1516TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetParameters) {
1517 CreateVideoRtpReceiver();
1518
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001519 RtpParameters params = video_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001520 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001521 EXPECT_TRUE(video_rtp_receiver_->SetParameters(params));
1522
1523 DestroyVideoRtpReceiver();
1524}
1525
Florent Castelli38332cd2018-11-20 14:08:06 +01001526TEST_F(RtpSenderReceiverTest, VideoReceiverCanGetParametersWithSimulcast) {
1527 CreateVideoRtpReceiverWithSimulcast({}, 2);
1528
1529 RtpParameters params = video_rtp_receiver_->GetParameters();
1530 EXPECT_EQ(2u, params.encodings.size());
1531
1532 DestroyVideoRtpReceiver();
1533}
1534
pbos5214a0a2016-12-16 15:39:11 -08001535// Test that makes sure that a video track content hint translates to the proper
1536// value for sources that are not screencast.
1537TEST_F(RtpSenderReceiverTest, PropagatesVideoTrackContentHint) {
1538 CreateVideoRtpSender();
1539
1540 video_track_->set_enabled(true);
1541
1542 // |video_track_| is not screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001543 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001544 // No content hint should be set by default.
1545 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1546 video_track_->content_hint());
1547 // Setting detailed should turn a non-screencast source into screencast mode.
1548 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001549 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001550 // Removing the content hint should turn the track back into non-screencast
1551 // mode.
1552 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001553 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001554 // Setting fluid should remain in non-screencast mode (its default).
1555 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001556 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 08:53:10 +02001557 // Setting text should have the same effect as Detailed
1558 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
1559 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001560
1561 DestroyVideoRtpSender();
1562}
1563
1564// Test that makes sure that a video track content hint translates to the proper
1565// value for screencast sources.
1566TEST_F(RtpSenderReceiverTest,
1567 PropagatesVideoTrackContentHintForScreencastSource) {
1568 CreateVideoRtpSender(true);
1569
1570 video_track_->set_enabled(true);
1571
1572 // |video_track_| with a screencast source should be screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001573 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001574 // No content hint should be set by default.
1575 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1576 video_track_->content_hint());
1577 // Setting fluid should turn a screencast source into non-screencast mode.
1578 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001579 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001580 // Removing the content hint should turn the track back into screencast mode.
1581 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001582 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001583 // Setting detailed should still remain in screencast mode (its default).
1584 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001585 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 08:53:10 +02001586 // Setting text should have the same effect as Detailed
1587 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
1588 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001589
1590 DestroyVideoRtpSender();
1591}
1592
1593// Test that makes sure any content hints that are set on a track before
1594// VideoRtpSender is ready to send are still applied when it gets ready to send.
1595TEST_F(RtpSenderReceiverTest,
1596 PropagatesVideoTrackContentHintSetBeforeEnabling) {
1597 AddVideoTrack();
1598 // Setting detailed overrides the default non-screencast mode. This should be
1599 // applied even if the track is set on construction.
1600 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -08001601 video_rtp_sender_ =
1602 VideoRtpSender::Create(worker_thread_, video_track_->id());
Steve Anton111fdfd2018-06-25 13:03:36 -07001603 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
1604 video_rtp_sender_->set_stream_ids({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -08001605 video_rtp_sender_->SetMediaChannel(video_media_channel_);
pbos5214a0a2016-12-16 15:39:11 -08001606 video_track_->set_enabled(true);
1607
1608 // Sender is not ready to send (no SSRC) so no option should have been set.
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001609 EXPECT_EQ(absl::nullopt, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001610
1611 // Verify that the content hint is accounted for when video_rtp_sender_ does
1612 // get enabled.
1613 video_rtp_sender_->SetSsrc(kVideoSsrc);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001614 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001615
1616 // And removing the hint should go back to false (to verify that false was
1617 // default correctly).
1618 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001619 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001620
1621 DestroyVideoRtpSender();
1622}
1623
deadbeef20cb0c12017-02-01 20:27:00 -08001624TEST_F(RtpSenderReceiverTest, AudioSenderHasDtmfSender) {
1625 CreateAudioRtpSender();
1626 EXPECT_NE(nullptr, audio_rtp_sender_->GetDtmfSender());
1627}
1628
1629TEST_F(RtpSenderReceiverTest, VideoSenderDoesNotHaveDtmfSender) {
1630 CreateVideoRtpSender();
1631 EXPECT_EQ(nullptr, video_rtp_sender_->GetDtmfSender());
1632}
1633
1634// Test that the DTMF sender is really using |voice_channel_|, and thus returns
1635// true/false from CanSendDtmf based on what |voice_channel_| returns.
1636TEST_F(RtpSenderReceiverTest, CanInsertDtmf) {
1637 AddDtmfCodec();
1638 CreateAudioRtpSender();
1639 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1640 ASSERT_NE(nullptr, dtmf_sender);
1641 EXPECT_TRUE(dtmf_sender->CanInsertDtmf());
1642}
1643
1644TEST_F(RtpSenderReceiverTest, CanNotInsertDtmf) {
1645 CreateAudioRtpSender();
1646 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1647 ASSERT_NE(nullptr, dtmf_sender);
1648 // DTMF codec has not been added, as it was in the above test.
1649 EXPECT_FALSE(dtmf_sender->CanInsertDtmf());
1650}
1651
1652TEST_F(RtpSenderReceiverTest, InsertDtmf) {
1653 AddDtmfCodec();
1654 CreateAudioRtpSender();
1655 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1656 ASSERT_NE(nullptr, dtmf_sender);
1657
1658 EXPECT_EQ(0U, voice_media_channel_->dtmf_info_queue().size());
1659
1660 // Insert DTMF
1661 const int expected_duration = 90;
1662 dtmf_sender->InsertDtmf("012", expected_duration, 100);
1663
1664 // Verify
1665 ASSERT_EQ_WAIT(3U, voice_media_channel_->dtmf_info_queue().size(),
1666 kDefaultTimeout);
1667 const uint32_t send_ssrc =
1668 voice_media_channel_->send_streams()[0].first_ssrc();
1669 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[0],
1670 send_ssrc, 0, expected_duration));
1671 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[1],
1672 send_ssrc, 1, expected_duration));
1673 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[2],
1674 send_ssrc, 2, expected_duration));
1675}
1676
1677// Make sure the signal from "GetOnDestroyedSignal()" fires when the sender is
1678// destroyed, which is needed for the DTMF sender.
1679TEST_F(RtpSenderReceiverTest, TestOnDestroyedSignal) {
1680 CreateAudioRtpSender();
1681 EXPECT_FALSE(audio_sender_destroyed_signal_fired_);
1682 audio_rtp_sender_ = nullptr;
1683 EXPECT_TRUE(audio_sender_destroyed_signal_fired_);
1684}
1685
Benjamin Wright84583f62018-10-04 14:22:34 -07001686// Validate that the default FrameEncryptor setting is nullptr.
1687TEST_F(RtpSenderReceiverTest, AudioSenderCanSetFrameEncryptor) {
1688 CreateAudioRtpSender();
1689 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1690 new FakeFrameEncryptor());
1691 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1692 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1693 EXPECT_EQ(fake_frame_encryptor.get(),
1694 audio_rtp_sender_->GetFrameEncryptor().get());
1695}
1696
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001697// Validate that setting a FrameEncryptor after the send stream is stopped does
1698// nothing.
1699TEST_F(RtpSenderReceiverTest, AudioSenderCannotSetFrameEncryptorAfterStop) {
1700 CreateAudioRtpSender();
1701 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1702 new FakeFrameEncryptor());
1703 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1704 audio_rtp_sender_->Stop();
1705 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1706 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1707}
1708
Benjamin Wright84583f62018-10-04 14:22:34 -07001709// Validate that the default FrameEncryptor setting is nullptr.
1710TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetFrameDecryptor) {
1711 CreateAudioRtpReceiver();
1712 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1713 new FakeFrameDecryptor());
1714 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
1715 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1716 EXPECT_EQ(fake_frame_decryptor.get(),
1717 audio_rtp_receiver_->GetFrameDecryptor().get());
1718}
1719
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001720// Validate that the default FrameEncryptor setting is nullptr.
1721TEST_F(RtpSenderReceiverTest, AudioReceiverCannotSetFrameDecryptorAfterStop) {
1722 CreateAudioRtpReceiver();
1723 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1724 new FakeFrameDecryptor());
1725 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
1726 audio_rtp_receiver_->Stop();
1727 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1728 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1729}
1730
1731// Validate that the default FrameEncryptor setting is nullptr.
1732TEST_F(RtpSenderReceiverTest, VideoSenderCanSetFrameEncryptor) {
1733 CreateVideoRtpSender();
1734 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1735 new FakeFrameEncryptor());
1736 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1737 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1738 EXPECT_EQ(fake_frame_encryptor.get(),
1739 video_rtp_sender_->GetFrameEncryptor().get());
1740}
1741
1742// Validate that setting a FrameEncryptor after the send stream is stopped does
1743// nothing.
1744TEST_F(RtpSenderReceiverTest, VideoSenderCannotSetFrameEncryptorAfterStop) {
1745 CreateVideoRtpSender();
1746 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1747 new FakeFrameEncryptor());
1748 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1749 video_rtp_sender_->Stop();
1750 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1751 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1752}
1753
1754// Validate that the default FrameEncryptor setting is nullptr.
1755TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetFrameDecryptor) {
1756 CreateVideoRtpReceiver();
1757 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1758 new FakeFrameDecryptor());
1759 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
1760 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1761 EXPECT_EQ(fake_frame_decryptor.get(),
1762 video_rtp_receiver_->GetFrameDecryptor().get());
1763}
1764
1765// Validate that the default FrameEncryptor setting is nullptr.
1766TEST_F(RtpSenderReceiverTest, VideoReceiverCannotSetFrameDecryptorAfterStop) {
1767 CreateVideoRtpReceiver();
1768 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1769 new FakeFrameDecryptor());
1770 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
1771 video_rtp_receiver_->Stop();
1772 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1773 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1774}
1775
Amit Hilbuch2297d332019-02-19 12:49:22 -08001776// Helper method for syntactic sugar for accepting a vector with '{}' notation.
1777std::pair<RidList, RidList> CreatePairOfRidVectors(
1778 const std::vector<std::string>& first,
1779 const std::vector<std::string>& second) {
1780 return std::make_pair(first, second);
1781}
1782
1783// These parameters are used to test disabling simulcast layers.
1784const std::pair<RidList, RidList> kDisableSimulcastLayersParameters[] = {
1785 // Tests removing the first layer. This is a special case because
1786 // the first layer's SSRC is also the 'primary' SSRC used to associate the
1787 // parameters to the media channel.
1788 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"1"}),
1789 // Tests removing some layers.
1790 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"2", "4"}),
1791 // Tests simulcast rejected scenario all layers except first are rejected.
1792 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"2", "3", "4"}),
1793 // Tests removing all layers.
1794 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"1", "2", "3", "4"}),
1795};
1796
1797// Runs test for disabling layers on a sender without a media engine set.
1798TEST_P(RtpSenderReceiverTest, DisableSimulcastLayersWithoutMediaEngine) {
1799 auto parameter = GetParam();
1800 RunDisableSimulcastLayersWithoutMediaEngineTest(parameter.first,
1801 parameter.second);
1802}
1803
1804// Runs test for disabling layers on a sender with a media engine set.
1805TEST_P(RtpSenderReceiverTest, DisableSimulcastLayersWithMediaEngine) {
1806 auto parameter = GetParam();
1807 RunDisableSimulcastLayersWithMediaEngineTest(parameter.first,
1808 parameter.second);
1809}
1810
1811INSTANTIATE_TEST_SUITE_P(
1812 DisableSimulcastLayersInSender,
1813 RtpSenderReceiverTest,
1814 ::testing::ValuesIn(kDisableSimulcastLayersParameters));
1815
deadbeef70ab1a12015-09-28 16:53:55 -07001816} // namespace webrtc