blob: bcca2da162643bf51e512855ab0ed20e319e5897 [file] [log] [blame]
deadbeef70ab1a12015-09-28 16:53:55 -07001/*
kjellanderb24317b2016-02-10 07:54:43 -08002 * Copyright 2012 The WebRTC project authors. All Rights Reserved.
deadbeef70ab1a12015-09-28 16:53:55 -07003 *
kjellanderb24317b2016-02-10 07:54:43 -08004 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
deadbeef70ab1a12015-09-28 16:53:55 -07009 */
10
Yves Gerey3e707812018-11-28 16:47:49 +010011#include <stddef.h>
Jonas Olssona4d87372019-07-05 19:08:33 +020012
Yves Gerey3e707812018-11-28 16:47:49 +010013#include <cstdint>
Harald Alvestrandc24a2182022-02-23 13:44:59 +000014#include <iterator>
kwibergd1fe2812016-04-27 06:47:29 -070015#include <memory>
deadbeef70ab1a12015-09-28 16:53:55 -070016#include <string>
Tommif888bb52015-12-12 01:37:01 +010017#include <utility>
Yves Gerey3e707812018-11-28 16:47:49 +010018#include <vector>
deadbeef70ab1a12015-09-28 16:53:55 -070019
Amit Hilbuch2297d332019-02-19 12:49:22 -080020#include "absl/algorithm/container.h"
Yves Gerey3e707812018-11-28 16:47:49 +010021#include "absl/memory/memory.h"
22#include "absl/types/optional.h"
23#include "api/audio_options.h"
Steve Anton10542f22019-01-11 09:11:00 -080024#include "api/crypto/crypto_options.h"
25#include "api/crypto/frame_decryptor_interface.h"
26#include "api/crypto/frame_encryptor_interface.h"
27#include "api/dtmf_sender_interface.h"
28#include "api/media_stream_interface.h"
29#include "api/rtc_error.h"
Danil Chapovalov83bbe912019-08-07 12:24:53 +020030#include "api/rtc_event_log/rtc_event_log.h"
Steve Anton10542f22019-01-11 09:11:00 -080031#include "api/rtp_parameters.h"
Harald Alvestrandc24a2182022-02-23 13:44:59 +000032#include "api/rtp_receiver_interface.h"
Mirko Bonadeid9708072019-01-25 20:26:48 +010033#include "api/scoped_refptr.h"
Benjamin Wright84583f62018-10-04 14:22:34 -070034#include "api/test/fake_frame_decryptor.h"
35#include "api/test/fake_frame_encryptor.h"
Jonas Orelanda3aa9bd2019-04-17 07:38:40 +020036#include "api/video/builtin_video_bitrate_allocator_factory.h"
Harald Alvestrandc24a2182022-02-23 13:44:59 +000037#include "api/video/video_bitrate_allocator_factory.h"
38#include "api/video/video_codec_constants.h"
Yves Gerey3e707812018-11-28 16:47:49 +010039#include "media/base/codec.h"
Harald Alvestrandc24a2182022-02-23 13:44:59 +000040#include "media/base/delayable.h"
Steve Anton10542f22019-01-11 09:11:00 -080041#include "media/base/fake_media_engine.h"
42#include "media/base/media_channel.h"
43#include "media/base/media_config.h"
44#include "media/base/media_engine.h"
Harald Alvestrandc24a2182022-02-23 13:44:59 +000045#include "media/base/rid_description.h"
Steve Anton10542f22019-01-11 09:11:00 -080046#include "media/base/stream_params.h"
47#include "media/base/test_utils.h"
48#include "media/engine/fake_webrtc_call.h"
49#include "p2p/base/dtls_transport_internal.h"
50#include "p2p/base/fake_dtls_transport.h"
51#include "p2p/base/p2p_constants.h"
Ruslan Burakov501bfba2019-02-11 10:29:19 +010052#include "pc/audio_rtp_receiver.h"
Steve Anton10542f22019-01-11 09:11:00 -080053#include "pc/audio_track.h"
Yves Gerey3e707812018-11-28 16:47:49 +010054#include "pc/channel.h"
Steve Anton10542f22019-01-11 09:11:00 -080055#include "pc/dtls_srtp_transport.h"
56#include "pc/local_audio_source.h"
57#include "pc/media_stream.h"
Steve Anton10542f22019-01-11 09:11:00 -080058#include "pc/rtp_sender.h"
59#include "pc/rtp_transport_internal.h"
60#include "pc/test/fake_video_track_source.h"
Ruslan Burakov501bfba2019-02-11 10:29:19 +010061#include "pc/video_rtp_receiver.h"
Steve Anton10542f22019-01-11 09:11:00 -080062#include "pc/video_track.h"
Yves Gerey3e707812018-11-28 16:47:49 +010063#include "rtc_base/checks.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020064#include "rtc_base/gunit.h"
Yves Gerey3e707812018-11-28 16:47:49 +010065#include "rtc_base/thread.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020066#include "test/gmock.h"
67#include "test/gtest.h"
Tommi4ccdf932021-05-17 14:50:10 +020068#include "test/run_loop.h"
Jonas Orelanded99dae2022-03-09 09:28:10 +010069#include "test/scoped_key_value_config.h"
deadbeef70ab1a12015-09-28 16:53:55 -070070
71using ::testing::_;
Amit Hilbuch2297d332019-02-19 12:49:22 -080072using ::testing::ContainerEq;
deadbeef70ab1a12015-09-28 16:53:55 -070073using ::testing::Exactly;
deadbeef5dd42fd2016-05-02 16:20:01 -070074using ::testing::InvokeWithoutArgs;
skvladdc1c62c2016-03-16 19:07:43 -070075using ::testing::Return;
Amit Hilbuch2297d332019-02-19 12:49:22 -080076using RidList = std::vector<std::string>;
deadbeef70ab1a12015-09-28 16:53:55 -070077
deadbeef20cb0c12017-02-01 20:27:00 -080078namespace {
79
Seth Hampson845e8782018-03-02 11:34:10 -080080static const char kStreamId1[] = "local_stream_1";
deadbeef70ab1a12015-09-28 16:53:55 -070081static const char kVideoTrackId[] = "video_1";
82static const char kAudioTrackId[] = "audio_1";
Peter Boström0c4e06b2015-10-07 12:23:21 +020083static const uint32_t kVideoSsrc = 98;
deadbeeffac06552015-11-25 11:26:01 -080084static const uint32_t kVideoSsrc2 = 100;
Peter Boström0c4e06b2015-10-07 12:23:21 +020085static const uint32_t kAudioSsrc = 99;
deadbeeffac06552015-11-25 11:26:01 -080086static const uint32_t kAudioSsrc2 = 101;
Florent Castelli892acf02018-10-01 22:47:20 +020087static const uint32_t kVideoSsrcSimulcast = 102;
88static const uint32_t kVideoSimulcastLayerCount = 2;
deadbeef20cb0c12017-02-01 20:27:00 -080089static const int kDefaultTimeout = 10000; // 10 seconds.
Guido Urdaneta1ff16c82019-05-20 19:31:53 +020090
91class MockSetStreamsObserver
92 : public webrtc::RtpSenderBase::SetStreamsObserver {
93 public:
Danil Chapovalov3a353122020-05-15 11:16:53 +020094 MOCK_METHOD(void, OnSetStreams, (), (override));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +020095};
96
deadbeef20cb0c12017-02-01 20:27:00 -080097} // namespace
deadbeef70ab1a12015-09-28 16:53:55 -070098
99namespace webrtc {
100
Amit Hilbuch2297d332019-02-19 12:49:22 -0800101class RtpSenderReceiverTest
Mirko Bonadei6a489f22019-04-09 15:11:12 +0200102 : public ::testing::Test,
Fredrik Solenbergda2afbd2022-08-03 12:07:51 +0200103 public ::testing::WithParamInterface<std::pair<RidList, RidList>> {
tkchin3784b4a2016-06-24 19:31:47 -0700104 public:
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700105 RtpSenderReceiverTest()
Steve Anton47136dd2018-01-12 10:49:35 -0800106 : network_thread_(rtc::Thread::Current()),
107 worker_thread_(rtc::Thread::Current()),
Jonas Orelanda3aa9bd2019-04-17 07:38:40 +0200108 video_bitrate_allocator_factory_(
109 webrtc::CreateBuiltinVideoBitrateAllocatorFactory()),
Steve Anton47136dd2018-01-12 10:49:35 -0800110 // Create fake media engine/etc. so we can create channels to use to
111 // test RtpSenders/RtpReceivers.
Harald Alvestrand0ac50b92022-05-18 07:51:34 +0000112 media_engine_(std::make_unique<cricket::FakeMediaEngine>()),
Tomas Gunnarssone984aa22021-04-19 09:21:06 +0200113 fake_call_(worker_thread_, network_thread_),
Seth Hampson845e8782018-03-02 11:34:10 -0800114 local_stream_(MediaStream::Create(kStreamId1)) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200115 rtp_dtls_transport_ = std::make_unique<cricket::FakeDtlsTransport>(
Zhi Huange830e682018-03-30 10:48:35 -0700116 "fake_dtls_transport", cricket::ICE_CANDIDATE_COMPONENT_RTP);
117 rtp_transport_ = CreateDtlsSrtpTransport();
118
Harald Alvestrand485457f2022-05-23 08:46:57 +0000119 // Create the channels, discard the result; we get them later.
120 // Fake media channels are owned by the media engine.
121 media_engine_->voice().CreateMediaChannel(
Harald Alvestrand16579cc2023-02-09 13:01:24 +0000122 cricket::MediaChannel::Role::kBoth, &fake_call_, cricket::MediaConfig(),
123 cricket::AudioOptions(), webrtc::CryptoOptions());
Harald Alvestrand485457f2022-05-23 08:46:57 +0000124 media_engine_->video().CreateMediaChannel(
Harald Alvestrand16579cc2023-02-09 13:01:24 +0000125 cricket::MediaChannel::Role::kBoth, &fake_call_, cricket::MediaConfig(),
126 cricket::VideoOptions(), webrtc::CryptoOptions(),
127 video_bitrate_allocator_factory_.get());
128 // TODO(hta): Split into sender and receiver channels
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +0100129
Harald Alvestrand485457f2022-05-23 08:46:57 +0000130 voice_media_channel_ = absl::WrapUnique(media_engine_->GetVoiceChannel(0));
131 video_media_channel_ = absl::WrapUnique(media_engine_->GetVideoChannel(0));
Tomas Gunnarsson4f8a58c2022-01-19 11:36:23 +0100132
Harald Alvestrand485457f2022-05-23 08:46:57 +0000133 RTC_CHECK(voice_media_channel());
134 RTC_CHECK(video_media_channel());
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000135 // Create sender channel objects
136 voice_send_channel_ =
137 std::make_unique<cricket::VoiceMediaSendChannel>(voice_media_channel());
138 video_send_channel_ =
139 std::make_unique<cricket::VideoMediaSendChannel>(video_media_channel());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700140
141 // Create streams for predefined SSRCs. Streams need to exist in order
142 // for the senders and receievers to apply parameters to them.
143 // Normally these would be created by SetLocalDescription and
144 // SetRemoteDescription.
145 voice_media_channel_->AddSendStream(
146 cricket::StreamParams::CreateLegacy(kAudioSsrc));
147 voice_media_channel_->AddRecvStream(
148 cricket::StreamParams::CreateLegacy(kAudioSsrc));
149 voice_media_channel_->AddSendStream(
150 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
151 voice_media_channel_->AddRecvStream(
152 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
153 video_media_channel_->AddSendStream(
154 cricket::StreamParams::CreateLegacy(kVideoSsrc));
155 video_media_channel_->AddRecvStream(
156 cricket::StreamParams::CreateLegacy(kVideoSsrc));
157 video_media_channel_->AddSendStream(
158 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
159 video_media_channel_->AddRecvStream(
160 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
tkchin3784b4a2016-06-24 19:31:47 -0700161 }
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700162
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200163 ~RtpSenderReceiverTest() {
164 audio_rtp_sender_ = nullptr;
165 video_rtp_sender_ = nullptr;
166 audio_rtp_receiver_ = nullptr;
167 video_rtp_receiver_ = nullptr;
168 local_stream_ = nullptr;
169 video_track_ = nullptr;
170 audio_track_ = nullptr;
Tomas Gunnarsson0b5ec182021-04-01 16:49:42 +0200171 }
172
Zhi Huange830e682018-03-30 10:48:35 -0700173 std::unique_ptr<webrtc::RtpTransportInternal> CreateDtlsSrtpTransport() {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200174 auto dtls_srtp_transport = std::make_unique<webrtc::DtlsSrtpTransport>(
Jonas Orelanded99dae2022-03-09 09:28:10 +0100175 /*rtcp_mux_required=*/true, field_trials_);
Zhi Huange830e682018-03-30 10:48:35 -0700176 dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport_.get(),
177 /*rtcp_dtls_transport=*/nullptr);
178 return dtls_srtp_transport;
179 }
180
deadbeef20cb0c12017-02-01 20:27:00 -0800181 // Needed to use DTMF sender.
182 void AddDtmfCodec() {
183 cricket::AudioSendParameters params;
184 const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000,
185 0, 1);
186 params.codecs.push_back(kTelephoneEventCodec);
Harald Alvestrand485457f2022-05-23 08:46:57 +0000187 voice_media_channel()->SetSendParameters(params);
deadbeef20cb0c12017-02-01 20:27:00 -0800188 }
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700189
pbos5214a0a2016-12-16 15:39:11 -0800190 void AddVideoTrack() { AddVideoTrack(false); }
191
192 void AddVideoTrack(bool is_screencast) {
perkja3ede6c2016-03-08 01:27:48 +0100193 rtc::scoped_refptr<VideoTrackSourceInterface> source(
pbos5214a0a2016-12-16 15:39:11 -0800194 FakeVideoTrackSource::Create(is_screencast));
perkj773be362017-07-31 23:22:01 -0700195 video_track_ =
196 VideoTrack::Create(kVideoTrackId, source, rtc::Thread::Current());
Harald Alvestrand2f7ad282022-04-21 11:35:43 +0000197 EXPECT_TRUE(local_stream_->AddTrack(video_track_));
deadbeef70ab1a12015-09-28 16:53:55 -0700198 }
199
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700200 void CreateAudioRtpSender() { CreateAudioRtpSender(nullptr); }
201
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +0100202 void CreateAudioRtpSender(
203 const rtc::scoped_refptr<LocalAudioSource>& source) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700204 audio_track_ = AudioTrack::Create(kAudioTrackId, source);
Harald Alvestrand2f7ad282022-04-21 11:35:43 +0000205 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200206 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200207 std::make_unique<MockSetStreamsObserver>();
Steve Anton47136dd2018-01-12 10:49:35 -0800208 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200209 AudioRtpSender::Create(worker_thread_, audio_track_->id(), nullptr,
210 set_streams_observer.get());
Niels Möllerafb246b2022-04-20 14:26:50 +0200211 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_.get()));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200212 EXPECT_CALL(*set_streams_observer, OnSetStreams());
213 audio_rtp_sender_->SetStreams({local_stream_->id()});
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000214 audio_rtp_sender_->SetMediaChannel(voice_send_channel_.get());
deadbeeffac06552015-11-25 11:26:01 -0800215 audio_rtp_sender_->SetSsrc(kAudioSsrc);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700216 VerifyVoiceChannelInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700217 }
218
Steve Anton02ee47c2018-01-10 16:26:06 -0800219 void CreateAudioRtpSenderWithNoTrack() {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800220 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200221 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
Harald Alvestrandc0d44d92022-12-13 12:57:24 +0000222 audio_rtp_sender_->SetMediaChannel(
223 voice_media_channel()->AsVoiceSendChannel());
Steve Anton02ee47c2018-01-10 16:26:06 -0800224 }
225
Seth Hampson2d2c8882018-05-16 16:02:32 -0700226 void CreateVideoRtpSender(uint32_t ssrc) {
227 CreateVideoRtpSender(false, ssrc);
228 }
229
pbos5214a0a2016-12-16 15:39:11 -0800230 void CreateVideoRtpSender() { CreateVideoRtpSender(false); }
231
Amit Hilbuch2297d332019-02-19 12:49:22 -0800232 cricket::StreamParams CreateSimulcastStreamParams(int num_layers) {
Florent Castelli892acf02018-10-01 22:47:20 +0200233 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +0100234 ssrcs.reserve(num_layers);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800235 for (int i = 0; i < num_layers; ++i) {
Florent Castelli892acf02018-10-01 22:47:20 +0200236 ssrcs.push_back(kVideoSsrcSimulcast + i);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800237 }
238 return cricket::CreateSimStreamParams("cname", ssrcs);
239 }
240
241 uint32_t CreateVideoRtpSender(const cricket::StreamParams& stream_params) {
Florent Castelli892acf02018-10-01 22:47:20 +0200242 video_media_channel_->AddSendStream(stream_params);
243 uint32_t primary_ssrc = stream_params.first_ssrc();
244 CreateVideoRtpSender(primary_ssrc);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800245 return primary_ssrc;
246 }
247
248 uint32_t CreateVideoRtpSenderWithSimulcast(
249 int num_layers = kVideoSimulcastLayerCount) {
250 return CreateVideoRtpSender(CreateSimulcastStreamParams(num_layers));
251 }
252
253 uint32_t CreateVideoRtpSenderWithSimulcast(
254 const std::vector<std::string>& rids) {
255 cricket::StreamParams stream_params =
256 CreateSimulcastStreamParams(rids.size());
257 std::vector<cricket::RidDescription> rid_descriptions;
258 absl::c_transform(
259 rids, std::back_inserter(rid_descriptions), [](const std::string& rid) {
260 return cricket::RidDescription(rid, cricket::RidDirection::kSend);
261 });
262 stream_params.set_rids(rid_descriptions);
263 return CreateVideoRtpSender(stream_params);
Florent Castelli892acf02018-10-01 22:47:20 +0200264 }
265
Seth Hampson2d2c8882018-05-16 16:02:32 -0700266 void CreateVideoRtpSender(bool is_screencast, uint32_t ssrc = kVideoSsrc) {
pbos5214a0a2016-12-16 15:39:11 -0800267 AddVideoTrack(is_screencast);
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200268 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200269 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200270 video_rtp_sender_ = VideoRtpSender::Create(
271 worker_thread_, video_track_->id(), set_streams_observer.get());
Niels Möllerafb246b2022-04-20 14:26:50 +0200272 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200273 EXPECT_CALL(*set_streams_observer, OnSetStreams());
274 video_rtp_sender_->SetStreams({local_stream_->id()});
Harald Alvestrandc0d44d92022-12-13 12:57:24 +0000275 video_rtp_sender_->SetMediaChannel(
276 video_media_channel()->AsVideoSendChannel());
Seth Hampson2d2c8882018-05-16 16:02:32 -0700277 video_rtp_sender_->SetSsrc(ssrc);
278 VerifyVideoChannelInput(ssrc);
deadbeef70ab1a12015-09-28 16:53:55 -0700279 }
Steve Anton02ee47c2018-01-10 16:26:06 -0800280 void CreateVideoRtpSenderWithNoTrack() {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200281 video_rtp_sender_ =
282 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Harald Alvestrandc0d44d92022-12-13 12:57:24 +0000283 video_rtp_sender_->SetMediaChannel(
284 video_media_channel()->AsVideoSendChannel());
Steve Anton02ee47c2018-01-10 16:26:06 -0800285 }
286
deadbeef70ab1a12015-09-28 16:53:55 -0700287 void DestroyAudioRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700288 audio_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700289 VerifyVoiceChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700290 }
291
292 void DestroyVideoRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700293 video_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700294 VerifyVideoChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700295 }
296
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100297 void CreateAudioRtpReceiver(
298 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
Tommi4ccdf932021-05-17 14:50:10 +0200299 audio_rtp_receiver_ = rtc::make_ref_counted<AudioRtpReceiver>(
300 rtc::Thread::Current(), kAudioTrackId, streams,
301 /*is_unified_plan=*/true);
Harald Alvestrandc0d44d92022-12-13 12:57:24 +0000302 audio_rtp_receiver_->SetMediaChannel(
303 voice_media_channel()->AsVoiceReceiveChannel());
Steve Antond3679212018-01-17 17:41:02 -0800304 audio_rtp_receiver_->SetupMediaChannel(kAudioSsrc);
perkjd61bf802016-03-24 03:16:19 -0700305 audio_track_ = audio_rtp_receiver_->audio_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700306 VerifyVoiceChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700307 }
308
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100309 void CreateVideoRtpReceiver(
310 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
Tommi4ccdf932021-05-17 14:50:10 +0200311 video_rtp_receiver_ = rtc::make_ref_counted<VideoRtpReceiver>(
312 rtc::Thread::Current(), kVideoTrackId, streams);
Harald Alvestrandc0d44d92022-12-13 12:57:24 +0000313 video_rtp_receiver_->SetMediaChannel(
314 video_media_channel()->AsVideoReceiveChannel());
Steve Antond3679212018-01-17 17:41:02 -0800315 video_rtp_receiver_->SetupMediaChannel(kVideoSsrc);
perkjf0dcfe22016-03-10 18:32:00 +0100316 video_track_ = video_rtp_receiver_->video_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700317 VerifyVideoChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700318 }
319
Florent Castelli38332cd2018-11-20 14:08:06 +0100320 void CreateVideoRtpReceiverWithSimulcast(
321 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {},
322 int num_layers = kVideoSimulcastLayerCount) {
323 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +0100324 ssrcs.reserve(num_layers);
Florent Castelli38332cd2018-11-20 14:08:06 +0100325 for (int i = 0; i < num_layers; ++i)
326 ssrcs.push_back(kVideoSsrcSimulcast + i);
327 cricket::StreamParams stream_params =
328 cricket::CreateSimStreamParams("cname", ssrcs);
329 video_media_channel_->AddRecvStream(stream_params);
330 uint32_t primary_ssrc = stream_params.first_ssrc();
331
Tommi4ccdf932021-05-17 14:50:10 +0200332 video_rtp_receiver_ = rtc::make_ref_counted<VideoRtpReceiver>(
333 rtc::Thread::Current(), kVideoTrackId, streams);
Harald Alvestrandc0d44d92022-12-13 12:57:24 +0000334 video_rtp_receiver_->SetMediaChannel(
335 video_media_channel()->AsVideoReceiveChannel());
Florent Castelli38332cd2018-11-20 14:08:06 +0100336 video_rtp_receiver_->SetupMediaChannel(primary_ssrc);
337 video_track_ = video_rtp_receiver_->video_track();
338 }
339
deadbeef70ab1a12015-09-28 16:53:55 -0700340 void DestroyAudioRtpReceiver() {
Tommi4ccdf932021-05-17 14:50:10 +0200341 if (!audio_rtp_receiver_)
342 return;
Tommi6589def2022-02-17 23:36:47 +0100343 audio_rtp_receiver_->SetMediaChannel(nullptr);
deadbeef70ab1a12015-09-28 16:53:55 -0700344 audio_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700345 VerifyVoiceChannelNoOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700346 }
347
348 void DestroyVideoRtpReceiver() {
Tommi4ccdf932021-05-17 14:50:10 +0200349 if (!video_rtp_receiver_)
350 return;
351 video_rtp_receiver_->Stop();
Tommi6589def2022-02-17 23:36:47 +0100352 video_rtp_receiver_->SetMediaChannel(nullptr);
deadbeef70ab1a12015-09-28 16:53:55 -0700353 video_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700354 VerifyVideoChannelNoOutput();
355 }
356
357 void VerifyVoiceChannelInput() { VerifyVoiceChannelInput(kAudioSsrc); }
358
359 void VerifyVoiceChannelInput(uint32_t ssrc) {
360 // Verify that the media channel has an audio source, and the stream isn't
361 // muted.
Harald Alvestrand485457f2022-05-23 08:46:57 +0000362 EXPECT_TRUE(voice_media_channel()->HasSource(ssrc));
363 EXPECT_FALSE(voice_media_channel()->IsStreamMuted(ssrc));
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700364 }
365
366 void VerifyVideoChannelInput() { VerifyVideoChannelInput(kVideoSsrc); }
367
368 void VerifyVideoChannelInput(uint32_t ssrc) {
369 // Verify that the media channel has a video source,
370 EXPECT_TRUE(video_media_channel_->HasSource(ssrc));
371 }
372
373 void VerifyVoiceChannelNoInput() { VerifyVoiceChannelNoInput(kAudioSsrc); }
374
375 void VerifyVoiceChannelNoInput(uint32_t ssrc) {
376 // Verify that the media channel's source is reset.
Harald Alvestrand485457f2022-05-23 08:46:57 +0000377 EXPECT_FALSE(voice_media_channel()->HasSource(ssrc));
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700378 }
379
380 void VerifyVideoChannelNoInput() { VerifyVideoChannelNoInput(kVideoSsrc); }
381
382 void VerifyVideoChannelNoInput(uint32_t ssrc) {
383 // Verify that the media channel's source is reset.
384 EXPECT_FALSE(video_media_channel_->HasSource(ssrc));
385 }
386
387 void VerifyVoiceChannelOutput() {
388 // Verify that the volume is initialized to 1.
389 double volume;
Harald Alvestrand485457f2022-05-23 08:46:57 +0000390 EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700391 EXPECT_EQ(1, volume);
392 }
393
394 void VerifyVideoChannelOutput() {
395 // Verify that the media channel has a sink.
396 EXPECT_TRUE(video_media_channel_->HasSink(kVideoSsrc));
397 }
398
399 void VerifyVoiceChannelNoOutput() {
400 // Verify that the volume is reset to 0.
401 double volume;
Harald Alvestrand485457f2022-05-23 08:46:57 +0000402 EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700403 EXPECT_EQ(0, volume);
404 }
405
406 void VerifyVideoChannelNoOutput() {
407 // Verify that the media channel's sink is reset.
408 EXPECT_FALSE(video_media_channel_->HasSink(kVideoSsrc));
deadbeef70ab1a12015-09-28 16:53:55 -0700409 }
410
Amit Hilbuch2297d332019-02-19 12:49:22 -0800411 // Verifies that the encoding layers contain the specified RIDs.
412 bool VerifyEncodingLayers(const VideoRtpSender& sender,
413 const std::vector<std::string>& rids) {
414 bool has_failure = HasFailure();
415 RtpParameters parameters = sender.GetParameters();
416 std::vector<std::string> encoding_rids;
417 absl::c_transform(
418 parameters.encodings, std::back_inserter(encoding_rids),
419 [](const RtpEncodingParameters& encoding) { return encoding.rid; });
420 EXPECT_THAT(rids, ContainerEq(encoding_rids));
421 return has_failure || !HasFailure();
422 }
423
424 // Runs a test for disabling the encoding layers on the specified sender.
425 void RunDisableEncodingLayersTest(
426 const std::vector<std::string>& all_layers,
427 const std::vector<std::string>& disabled_layers,
428 VideoRtpSender* sender) {
429 std::vector<std::string> expected;
430 absl::c_copy_if(all_layers, std::back_inserter(expected),
431 [&disabled_layers](const std::string& rid) {
432 return !absl::c_linear_search(disabled_layers, rid);
433 });
434
435 EXPECT_TRUE(VerifyEncodingLayers(*sender, all_layers));
436 sender->DisableEncodingLayers(disabled_layers);
437 EXPECT_TRUE(VerifyEncodingLayers(*sender, expected));
438 }
439
440 // Runs a test for setting an encoding layer as inactive.
441 // This test assumes that some layers have already been disabled.
442 void RunSetLastLayerAsInactiveTest(VideoRtpSender* sender) {
443 auto parameters = sender->GetParameters();
444 if (parameters.encodings.size() == 0) {
445 return;
446 }
447
448 RtpEncodingParameters& encoding = parameters.encodings.back();
449 auto rid = encoding.rid;
450 EXPECT_TRUE(encoding.active);
451 encoding.active = false;
452 auto error = sender->SetParameters(parameters);
453 ASSERT_TRUE(error.ok());
454 parameters = sender->GetParameters();
455 RtpEncodingParameters& result_encoding = parameters.encodings.back();
456 EXPECT_EQ(rid, result_encoding.rid);
457 EXPECT_FALSE(result_encoding.active);
458 }
459
460 // Runs a test for disabling the encoding layers on a sender without a media
461 // channel.
462 void RunDisableSimulcastLayersWithoutMediaEngineTest(
463 const std::vector<std::string>& all_layers,
464 const std::vector<std::string>& disabled_layers) {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200465 auto sender = VideoRtpSender::Create(rtc::Thread::Current(), "1", nullptr);
Amit Hilbuch2297d332019-02-19 12:49:22 -0800466 RtpParameters parameters;
467 parameters.encodings.resize(all_layers.size());
468 for (size_t i = 0; i < all_layers.size(); ++i) {
469 parameters.encodings[i].rid = all_layers[i];
470 }
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800471 sender->set_init_send_encodings(parameters.encodings);
472 RunDisableEncodingLayersTest(all_layers, disabled_layers, sender.get());
473 RunSetLastLayerAsInactiveTest(sender.get());
Amit Hilbuch2297d332019-02-19 12:49:22 -0800474 }
475
476 // Runs a test for disabling the encoding layers on a sender with a media
477 // channel.
478 void RunDisableSimulcastLayersWithMediaEngineTest(
479 const std::vector<std::string>& all_layers,
480 const std::vector<std::string>& disabled_layers) {
481 uint32_t ssrc = CreateVideoRtpSenderWithSimulcast(all_layers);
482 RunDisableEncodingLayersTest(all_layers, disabled_layers,
483 video_rtp_sender_.get());
484
485 auto channel_parameters = video_media_channel_->GetRtpSendParameters(ssrc);
486 ASSERT_EQ(channel_parameters.encodings.size(), all_layers.size());
487 for (size_t i = 0; i < all_layers.size(); ++i) {
488 EXPECT_EQ(all_layers[i], channel_parameters.encodings[i].rid);
489 bool is_active = !absl::c_linear_search(disabled_layers, all_layers[i]);
490 EXPECT_EQ(is_active, channel_parameters.encodings[i].active);
491 }
492
493 RunSetLastLayerAsInactiveTest(video_rtp_sender_.get());
494 }
495
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200496 // Check that minimum Jitter Buffer delay is propagated to the underlying
Artem Titov880fa812021-07-30 22:30:23 +0200497 // `media_channel`.
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200498 void VerifyRtpReceiverDelayBehaviour(cricket::Delayable* media_channel,
499 RtpReceiverInterface* receiver,
500 uint32_t ssrc) {
501 receiver->SetJitterBufferMinimumDelay(/*delay_seconds=*/0.5);
502 absl::optional<int> delay_ms =
503 media_channel->GetBaseMinimumPlayoutDelayMs(ssrc); // In milliseconds.
504 EXPECT_DOUBLE_EQ(0.5, delay_ms.value_or(0) / 1000.0);
505 }
506
deadbeef70ab1a12015-09-28 16:53:55 -0700507 protected:
Harald Alvestrand485457f2022-05-23 08:46:57 +0000508 cricket::FakeVideoMediaChannel* video_media_channel() {
509 return video_media_channel_.get();
510 }
511 cricket::FakeVoiceMediaChannel* voice_media_channel() {
512 return voice_media_channel_.get();
513 }
514
Tommi4ccdf932021-05-17 14:50:10 +0200515 test::RunLoop run_loop_;
Steve Anton47136dd2018-01-12 10:49:35 -0800516 rtc::Thread* const network_thread_;
517 rtc::Thread* const worker_thread_;
Danil Chapovalov83bbe912019-08-07 12:24:53 +0200518 webrtc::RtcEventLogNull event_log_;
Artem Titov880fa812021-07-30 22:30:23 +0200519 // The `rtp_dtls_transport_` and `rtp_transport_` should be destroyed after
520 // the `channel_manager`.
Zhi Huange830e682018-03-30 10:48:35 -0700521 std::unique_ptr<cricket::DtlsTransportInternal> rtp_dtls_transport_;
522 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport_;
Jonas Orelanda3aa9bd2019-04-17 07:38:40 +0200523 std::unique_ptr<webrtc::VideoBitrateAllocatorFactory>
524 video_bitrate_allocator_factory_;
Harald Alvestrand0ac50b92022-05-18 07:51:34 +0000525 std::unique_ptr<cricket::FakeMediaEngine> media_engine_;
526 rtc::UniqueRandomIdGenerator ssrc_generator_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700527 cricket::FakeCall fake_call_;
Harald Alvestrand485457f2022-05-23 08:46:57 +0000528 std::unique_ptr<cricket::FakeVoiceMediaChannel> voice_media_channel_;
529 std::unique_ptr<cricket::FakeVideoMediaChannel> video_media_channel_;
Harald Alvestrand50454ef2022-12-15 16:49:13 +0000530 std::unique_ptr<cricket::VoiceMediaSendChannel> voice_send_channel_;
531 std::unique_ptr<cricket::VideoMediaSendChannel> video_send_channel_;
deadbeef70ab1a12015-09-28 16:53:55 -0700532 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
533 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
534 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
535 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
deadbeefe814a0d2017-02-25 18:15:09 -0800536 rtc::scoped_refptr<MediaStreamInterface> local_stream_;
deadbeef70ab1a12015-09-28 16:53:55 -0700537 rtc::scoped_refptr<VideoTrackInterface> video_track_;
538 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
Jonas Orelanded99dae2022-03-09 09:28:10 +0100539 webrtc::test::ScopedKeyValueConfig field_trials_;
deadbeef70ab1a12015-09-28 16:53:55 -0700540};
541
Artem Titov880fa812021-07-30 22:30:23 +0200542// Test that `voice_channel_` is updated when an audio track is associated
deadbeef70ab1a12015-09-28 16:53:55 -0700543// and disassociated with an AudioRtpSender.
544TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
545 CreateAudioRtpSender();
546 DestroyAudioRtpSender();
547}
548
Artem Titov880fa812021-07-30 22:30:23 +0200549// Test that `video_channel_` is updated when a video track is associated and
deadbeef70ab1a12015-09-28 16:53:55 -0700550// disassociated with a VideoRtpSender.
551TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
552 CreateVideoRtpSender();
553 DestroyVideoRtpSender();
554}
555
Artem Titov880fa812021-07-30 22:30:23 +0200556// Test that `voice_channel_` is updated when a remote audio track is
deadbeef70ab1a12015-09-28 16:53:55 -0700557// associated and disassociated with an AudioRtpReceiver.
558TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
559 CreateAudioRtpReceiver();
560 DestroyAudioRtpReceiver();
561}
562
Artem Titov880fa812021-07-30 22:30:23 +0200563// Test that `video_channel_` is updated when a remote video track is
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700564// associated and disassociated with a VideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700565TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
566 CreateVideoRtpReceiver();
567 DestroyVideoRtpReceiver();
568}
569
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100570TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiverWithStreams) {
571 CreateAudioRtpReceiver({local_stream_});
572 DestroyAudioRtpReceiver();
573}
574
575TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiverWithStreams) {
576 CreateVideoRtpReceiver({local_stream_});
577 DestroyVideoRtpReceiver();
578}
579
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700580// Test that the AudioRtpSender applies options from the local audio source.
581TEST_F(RtpSenderReceiverTest, LocalAudioSourceOptionsApplied) {
582 cricket::AudioOptions options;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100583 options.echo_cancellation = true;
deadbeef757146b2017-02-10 21:26:48 -0800584 auto source = LocalAudioSource::Create(&options);
Niels Möllere7cc8832022-01-04 15:20:03 +0100585 CreateAudioRtpSender(source);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700586
Harald Alvestrand485457f2022-05-23 08:46:57 +0000587 EXPECT_EQ(true, voice_media_channel()->options().echo_cancellation);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700588
589 DestroyAudioRtpSender();
590}
591
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700592// Test that the stream is muted when the track is disabled, and unmuted when
593// the track is enabled.
594TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) {
595 CreateAudioRtpSender();
596
597 audio_track_->set_enabled(false);
Harald Alvestrand485457f2022-05-23 08:46:57 +0000598 EXPECT_TRUE(voice_media_channel()->IsStreamMuted(kAudioSsrc));
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700599
600 audio_track_->set_enabled(true);
Harald Alvestrand485457f2022-05-23 08:46:57 +0000601 EXPECT_FALSE(voice_media_channel()->IsStreamMuted(kAudioSsrc));
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700602
603 DestroyAudioRtpSender();
604}
605
606// Test that the volume is set to 0 when the track is disabled, and back to
607// 1 when the track is enabled.
deadbeef70ab1a12015-09-28 16:53:55 -0700608TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
609 CreateAudioRtpReceiver();
610
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700611 double volume;
Harald Alvestrand485457f2022-05-23 08:46:57 +0000612 EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700613 EXPECT_EQ(1, volume);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700614
Tommi4ccdf932021-05-17 14:50:10 +0200615 // Handling of enable/disable is applied asynchronously.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700616 audio_track_->set_enabled(false);
Tommi4ccdf932021-05-17 14:50:10 +0200617 run_loop_.Flush();
618
Harald Alvestrand485457f2022-05-23 08:46:57 +0000619 EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700620 EXPECT_EQ(0, volume);
621
deadbeef70ab1a12015-09-28 16:53:55 -0700622 audio_track_->set_enabled(true);
Tommi4ccdf932021-05-17 14:50:10 +0200623 run_loop_.Flush();
Harald Alvestrand485457f2022-05-23 08:46:57 +0000624 EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700625 EXPECT_EQ(1, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700626
627 DestroyAudioRtpReceiver();
628}
629
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700630// Currently no action is taken when a remote video track is disabled or
631// enabled, so there's nothing to test here, other than what is normally
632// verified in DestroyVideoRtpSender.
deadbeef70ab1a12015-09-28 16:53:55 -0700633TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
634 CreateVideoRtpSender();
635
deadbeef70ab1a12015-09-28 16:53:55 -0700636 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700637 video_track_->set_enabled(true);
638
639 DestroyVideoRtpSender();
640}
641
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700642// Test that the state of the video track created by the VideoRtpReceiver is
643// updated when the receiver is destroyed.
perkjf0dcfe22016-03-10 18:32:00 +0100644TEST_F(RtpSenderReceiverTest, RemoteVideoTrackState) {
645 CreateVideoRtpReceiver();
646
647 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track_->state());
648 EXPECT_EQ(webrtc::MediaSourceInterface::kLive,
649 video_track_->GetSource()->state());
650
651 DestroyVideoRtpReceiver();
652
653 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track_->state());
654 EXPECT_EQ(webrtc::MediaSourceInterface::kEnded,
655 video_track_->GetSource()->state());
Tommi4ccdf932021-05-17 14:50:10 +0200656 DestroyVideoRtpReceiver();
perkjf0dcfe22016-03-10 18:32:00 +0100657}
658
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700659// Currently no action is taken when a remote video track is disabled or
660// enabled, so there's nothing to test here, other than what is normally
661// verified in DestroyVideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700662TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
663 CreateVideoRtpReceiver();
664
665 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700666 video_track_->set_enabled(true);
667
668 DestroyVideoRtpReceiver();
669}
670
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700671// Test that the AudioRtpReceiver applies volume changes from the track source
672// to the media channel.
deadbeef70ab1a12015-09-28 16:53:55 -0700673TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
674 CreateAudioRtpReceiver();
675
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700676 double volume;
677 audio_track_->GetSource()->SetVolume(0.5);
Tommi4ccdf932021-05-17 14:50:10 +0200678 run_loop_.Flush();
Harald Alvestrand485457f2022-05-23 08:46:57 +0000679 EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700680 EXPECT_EQ(0.5, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700681
682 // Disable the audio track, this should prevent setting the volume.
deadbeef70ab1a12015-09-28 16:53:55 -0700683 audio_track_->set_enabled(false);
Tommi4ccdf932021-05-17 14:50:10 +0200684 RTC_DCHECK_EQ(worker_thread_, run_loop_.task_queue());
685 run_loop_.Flush();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700686 audio_track_->GetSource()->SetVolume(0.8);
Harald Alvestrand485457f2022-05-23 08:46:57 +0000687 EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700688 EXPECT_EQ(0, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700689
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700690 // When the track is enabled, the previously set volume should take effect.
deadbeef70ab1a12015-09-28 16:53:55 -0700691 audio_track_->set_enabled(true);
Tommi4ccdf932021-05-17 14:50:10 +0200692 run_loop_.Flush();
Harald Alvestrand485457f2022-05-23 08:46:57 +0000693 EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700694 EXPECT_EQ(0.8, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700695
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700696 // Try changing volume one more time.
697 audio_track_->GetSource()->SetVolume(0.9);
Tommi4ccdf932021-05-17 14:50:10 +0200698 run_loop_.Flush();
Harald Alvestrand485457f2022-05-23 08:46:57 +0000699 EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700700 EXPECT_EQ(0.9, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700701
702 DestroyAudioRtpReceiver();
703}
704
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200705TEST_F(RtpSenderReceiverTest, AudioRtpReceiverDelay) {
706 CreateAudioRtpReceiver();
Harald Alvestrandc0d44d92022-12-13 12:57:24 +0000707 VerifyRtpReceiverDelayBehaviour(
708 voice_media_channel()->AsVoiceReceiveChannel(), audio_rtp_receiver_.get(),
709 kAudioSsrc);
Tommi4ccdf932021-05-17 14:50:10 +0200710 DestroyAudioRtpReceiver();
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200711}
712
713TEST_F(RtpSenderReceiverTest, VideoRtpReceiverDelay) {
714 CreateVideoRtpReceiver();
Harald Alvestrandc0d44d92022-12-13 12:57:24 +0000715 VerifyRtpReceiverDelayBehaviour(
716 video_media_channel()->AsVideoReceiveChannel(), video_rtp_receiver_.get(),
717 kVideoSsrc);
Tommi4ccdf932021-05-17 14:50:10 +0200718 DestroyVideoRtpReceiver();
Ruslan Burakov4bac79e2019-04-03 19:55:33 +0200719}
720
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700721// Test that the media channel isn't enabled for sending if the audio sender
722// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800723TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800724 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800725 rtc::scoped_refptr<AudioTrackInterface> track =
726 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700727
728 // Track but no SSRC.
Niels Möllerafb246b2022-04-20 14:26:50 +0200729 EXPECT_TRUE(audio_rtp_sender_->SetTrack(track.get()));
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700730 VerifyVoiceChannelNoInput();
731
732 // SSRC but no track.
733 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
734 audio_rtp_sender_->SetSsrc(kAudioSsrc);
735 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800736}
737
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700738// Test that the media channel isn't enabled for sending if the video sender
739// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800740TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800741 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700742
743 // Track but no SSRC.
Niels Möllerafb246b2022-04-20 14:26:50 +0200744 EXPECT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700745 VerifyVideoChannelNoInput();
746
747 // SSRC but no track.
748 EXPECT_TRUE(video_rtp_sender_->SetTrack(nullptr));
749 video_rtp_sender_->SetSsrc(kVideoSsrc);
750 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800751}
752
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700753// Test that the media channel is enabled for sending when the audio sender
754// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800755TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800756 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800757 rtc::scoped_refptr<AudioTrackInterface> track =
758 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700759 audio_rtp_sender_->SetSsrc(kAudioSsrc);
Niels Möllerafb246b2022-04-20 14:26:50 +0200760 audio_rtp_sender_->SetTrack(track.get());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700761 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800762
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700763 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800764}
765
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700766// Test that the media channel is enabled for sending when the audio sender
767// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800768TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800769 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800770 rtc::scoped_refptr<AudioTrackInterface> track =
771 AudioTrack::Create(kAudioTrackId, nullptr);
Niels Möllerafb246b2022-04-20 14:26:50 +0200772 audio_rtp_sender_->SetTrack(track.get());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700773 audio_rtp_sender_->SetSsrc(kAudioSsrc);
774 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800775
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700776 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800777}
778
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700779// Test that the media channel is enabled for sending when the video sender
780// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800781TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
nisseaf510af2016-03-21 08:20:42 -0700782 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800783 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700784 video_rtp_sender_->SetSsrc(kVideoSsrc);
Niels Möllerafb246b2022-04-20 14:26:50 +0200785 video_rtp_sender_->SetTrack(video_track_.get());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700786 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800787
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700788 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800789}
790
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700791// Test that the media channel is enabled for sending when the video sender
792// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800793TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
nisseaf510af2016-03-21 08:20:42 -0700794 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800795 CreateVideoRtpSenderWithNoTrack();
Niels Möllerafb246b2022-04-20 14:26:50 +0200796 video_rtp_sender_->SetTrack(video_track_.get());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700797 video_rtp_sender_->SetSsrc(kVideoSsrc);
798 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800799
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700800 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800801}
802
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700803// Test that the media channel stops sending when the audio sender's SSRC is set
804// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800805TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700806 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800807
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700808 audio_rtp_sender_->SetSsrc(0);
809 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800810}
811
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700812// Test that the media channel stops sending when the video sender's SSRC is set
813// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800814TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700815 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800816
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700817 audio_rtp_sender_->SetSsrc(0);
818 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800819}
820
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700821// Test that the media channel stops sending when the audio sender's track is
822// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800823TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700824 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800825
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700826 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
827 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800828}
829
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700830// Test that the media channel stops sending when the video sender's track is
831// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800832TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700833 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800834
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700835 video_rtp_sender_->SetSsrc(0);
836 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800837}
838
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700839// Test that when the audio sender's SSRC is changed, the media channel stops
840// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800841TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700842 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800843
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700844 audio_rtp_sender_->SetSsrc(kAudioSsrc2);
845 VerifyVoiceChannelNoInput(kAudioSsrc);
846 VerifyVoiceChannelInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800847
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700848 audio_rtp_sender_ = nullptr;
849 VerifyVoiceChannelNoInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800850}
851
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700852// Test that when the audio sender's SSRC is changed, the media channel stops
853// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800854TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700855 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800856
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700857 video_rtp_sender_->SetSsrc(kVideoSsrc2);
858 VerifyVideoChannelNoInput(kVideoSsrc);
859 VerifyVideoChannelInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800860
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700861 video_rtp_sender_ = nullptr;
862 VerifyVideoChannelNoInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800863}
864
skvladdc1c62c2016-03-16 19:07:43 -0700865TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) {
866 CreateAudioRtpSender();
867
skvladdc1c62c2016-03-16 19:07:43 -0700868 RtpParameters params = audio_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700869 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -0800870 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -0700871
872 DestroyAudioRtpSender();
873}
874
Florent Castelliacabb362022-10-18 17:05:16 +0200875TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParametersAsync) {
876 CreateAudioRtpSender();
877
878 RtpParameters params = audio_rtp_sender_->GetParameters();
879 EXPECT_EQ(1u, params.encodings.size());
880 absl::optional<webrtc::RTCError> result;
881 audio_rtp_sender_->SetParametersAsync(
882 params, [&result](webrtc::RTCError error) { result = error; });
883 run_loop_.Flush();
884 EXPECT_TRUE(result->ok());
885
886 DestroyAudioRtpSender();
887}
888
Florent Castelli892acf02018-10-01 22:47:20 +0200889TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParametersBeforeNegotiation) {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800890 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200891 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +0200892
893 RtpParameters params = audio_rtp_sender_->GetParameters();
894 ASSERT_EQ(1u, params.encodings.size());
895 params.encodings[0].max_bitrate_bps = 90000;
896 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
897
898 params = audio_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +0200899 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
Florent Castelliacabb362022-10-18 17:05:16 +0200900 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
901
902 DestroyAudioRtpSender();
903}
904
905TEST_F(RtpSenderReceiverTest,
906 AudioSenderCanSetParametersAsyncBeforeNegotiation) {
907 audio_rtp_sender_ =
908 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
909
910 absl::optional<webrtc::RTCError> result;
911 RtpParameters params = audio_rtp_sender_->GetParameters();
912 ASSERT_EQ(1u, params.encodings.size());
913 params.encodings[0].max_bitrate_bps = 90000;
914
915 audio_rtp_sender_->SetParametersAsync(
916 params, [&result](webrtc::RTCError error) { result = error; });
917 run_loop_.Flush();
918 EXPECT_TRUE(result->ok());
919
920 params = audio_rtp_sender_->GetParameters();
921 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
922
923 audio_rtp_sender_->SetParametersAsync(
924 params, [&result](webrtc::RTCError error) { result = error; });
925 run_loop_.Flush();
926 EXPECT_TRUE(result->ok());
Florent Castelli892acf02018-10-01 22:47:20 +0200927
928 DestroyAudioRtpSender();
929}
930
931TEST_F(RtpSenderReceiverTest, AudioSenderInitParametersMovedAfterNegotiation) {
932 audio_track_ = AudioTrack::Create(kAudioTrackId, nullptr);
Harald Alvestrand2f7ad282022-04-21 11:35:43 +0000933 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
Florent Castelli892acf02018-10-01 22:47:20 +0200934
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200935 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200936 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200937 audio_rtp_sender_ = AudioRtpSender::Create(
938 worker_thread_, audio_track_->id(), nullptr, set_streams_observer.get());
Niels Möllerafb246b2022-04-20 14:26:50 +0200939 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_.get()));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200940 EXPECT_CALL(*set_streams_observer, OnSetStreams());
941 audio_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli892acf02018-10-01 22:47:20 +0200942
943 std::vector<RtpEncodingParameters> init_encodings(1);
944 init_encodings[0].max_bitrate_bps = 60000;
945 audio_rtp_sender_->set_init_send_encodings(init_encodings);
946
947 RtpParameters params = audio_rtp_sender_->GetParameters();
948 ASSERT_EQ(1u, params.encodings.size());
949 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
950
951 // Simulate the setLocalDescription call
952 std::vector<uint32_t> ssrcs(1, 1);
953 cricket::StreamParams stream_params =
954 cricket::CreateSimStreamParams("cname", ssrcs);
Harald Alvestrand485457f2022-05-23 08:46:57 +0000955 voice_media_channel()->AddSendStream(stream_params);
Harald Alvestrandc0d44d92022-12-13 12:57:24 +0000956 audio_rtp_sender_->SetMediaChannel(
957 voice_media_channel()->AsVoiceSendChannel());
Florent Castelli892acf02018-10-01 22:47:20 +0200958 audio_rtp_sender_->SetSsrc(1);
959
960 params = audio_rtp_sender_->GetParameters();
961 ASSERT_EQ(1u, params.encodings.size());
962 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
963
964 DestroyAudioRtpSender();
965}
966
967TEST_F(RtpSenderReceiverTest,
968 AudioSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
Amit Hilbuchea7ef2a2019-02-19 15:20:21 -0800969 audio_rtp_sender_ =
Guido Urdaneta1ff16c82019-05-20 19:31:53 +0200970 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +0200971
972 RtpParameters params;
973 RTCError result = audio_rtp_sender_->SetParameters(params);
974 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
975 DestroyAudioRtpSender();
976}
977
Florent Castellicebf50f2018-05-03 15:31:53 +0200978TEST_F(RtpSenderReceiverTest,
979 AudioSenderMustCallGetParametersBeforeSetParameters) {
980 CreateAudioRtpSender();
981
982 RtpParameters params;
983 RTCError result = audio_rtp_sender_->SetParameters(params);
984 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
985
986 DestroyAudioRtpSender();
987}
988
989TEST_F(RtpSenderReceiverTest,
990 AudioSenderSetParametersInvalidatesTransactionId) {
991 CreateAudioRtpSender();
992
993 RtpParameters params = audio_rtp_sender_->GetParameters();
994 EXPECT_EQ(1u, params.encodings.size());
995 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
996 RTCError result = audio_rtp_sender_->SetParameters(params);
997 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
998
999 DestroyAudioRtpSender();
1000}
1001
Florent Castelliacabb362022-10-18 17:05:16 +02001002TEST_F(RtpSenderReceiverTest,
1003 AudioSenderSetParametersAsyncInvalidatesTransactionId) {
1004 CreateAudioRtpSender();
1005
1006 RtpParameters params = audio_rtp_sender_->GetParameters();
1007 EXPECT_EQ(1u, params.encodings.size());
1008 absl::optional<webrtc::RTCError> result;
1009 audio_rtp_sender_->SetParametersAsync(
1010 params, [&result](webrtc::RTCError error) { result = error; });
1011 run_loop_.Flush();
1012 EXPECT_TRUE(result->ok());
1013 audio_rtp_sender_->SetParametersAsync(
1014 params, [&result](webrtc::RTCError error) { result = error; });
1015 run_loop_.Flush();
1016 EXPECT_EQ(RTCErrorType::INVALID_STATE, result->type());
1017
1018 DestroyAudioRtpSender();
1019}
1020
Florent Castellicebf50f2018-05-03 15:31:53 +02001021TEST_F(RtpSenderReceiverTest, AudioSenderDetectTransactionIdModification) {
1022 CreateAudioRtpSender();
1023
1024 RtpParameters params = audio_rtp_sender_->GetParameters();
1025 params.transaction_id = "";
1026 RTCError result = audio_rtp_sender_->SetParameters(params);
1027 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1028
1029 DestroyAudioRtpSender();
1030}
1031
1032TEST_F(RtpSenderReceiverTest, AudioSenderCheckTransactionIdRefresh) {
1033 CreateAudioRtpSender();
1034
1035 RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001036 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 15:31:53 +02001037 auto saved_transaction_id = params.transaction_id;
1038 params = audio_rtp_sender_->GetParameters();
1039 EXPECT_NE(saved_transaction_id, params.transaction_id);
1040
1041 DestroyAudioRtpSender();
1042}
1043
1044TEST_F(RtpSenderReceiverTest, AudioSenderSetParametersOldValueFail) {
1045 CreateAudioRtpSender();
1046
1047 RtpParameters params = audio_rtp_sender_->GetParameters();
1048 RtpParameters second_params = audio_rtp_sender_->GetParameters();
1049
1050 RTCError result = audio_rtp_sender_->SetParameters(params);
1051 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
Seth Hampson2d2c8882018-05-16 16:02:32 -07001052 DestroyAudioRtpSender();
1053}
1054
1055TEST_F(RtpSenderReceiverTest, AudioSenderCantSetUnimplementedRtpParameters) {
1056 CreateAudioRtpSender();
1057 RtpParameters params = audio_rtp_sender_->GetParameters();
1058 EXPECT_EQ(1u, params.encodings.size());
1059
Florent Castelli87b3c512018-07-18 16:00:28 +02001060 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 16:02:32 -07001061 params.mid = "dummy_mid";
1062 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1063 audio_rtp_sender_->SetParameters(params).type());
1064 params = audio_rtp_sender_->GetParameters();
1065
Seth Hampson2d2c8882018-05-16 16:02:32 -07001066 DestroyAudioRtpSender();
1067}
1068
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001069TEST_F(RtpSenderReceiverTest, SetAudioMaxSendBitrate) {
1070 CreateAudioRtpSender();
1071
Harald Alvestrand485457f2022-05-23 08:46:57 +00001072 EXPECT_EQ(-1, voice_media_channel()->max_bps());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001073 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001074 EXPECT_EQ(1U, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -08001075 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001076 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -08001077 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001078
1079 // Read back the parameters and verify they have been changed.
1080 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001081 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001082 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001083
1084 // Verify that the audio channel received the new parameters.
Harald Alvestrand485457f2022-05-23 08:46:57 +00001085 params = voice_media_channel()->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001086 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001087 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001088
1089 // Verify that the global bitrate limit has not been changed.
Harald Alvestrand485457f2022-05-23 08:46:57 +00001090 EXPECT_EQ(-1, voice_media_channel()->max_bps());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001091
1092 DestroyAudioRtpSender();
1093}
1094
Seth Hampson24722b32017-12-22 09:36:42 -08001095TEST_F(RtpSenderReceiverTest, SetAudioBitratePriority) {
1096 CreateAudioRtpSender();
1097
1098 webrtc::RtpParameters 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(webrtc::kDefaultBitratePriority,
1101 params.encodings[0].bitrate_priority);
1102 double new_bitrate_priority = 2.0;
1103 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -08001104 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -08001105
1106 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001107 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001108 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1109
Harald Alvestrand485457f2022-05-23 08:46:57 +00001110 params = voice_media_channel()->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001111 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001112 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1113
1114 DestroyAudioRtpSender();
1115}
1116
skvladdc1c62c2016-03-16 19:07:43 -07001117TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) {
1118 CreateVideoRtpSender();
1119
skvladdc1c62c2016-03-16 19:07:43 -07001120 RtpParameters params = video_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001121 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -08001122 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -07001123
1124 DestroyVideoRtpSender();
1125}
1126
Florent Castelliacabb362022-10-18 17:05:16 +02001127TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParametersAsync) {
1128 CreateVideoRtpSender();
1129
1130 RtpParameters params = video_rtp_sender_->GetParameters();
1131 EXPECT_EQ(1u, params.encodings.size());
1132 absl::optional<webrtc::RTCError> result;
1133 video_rtp_sender_->SetParametersAsync(
1134 params, [&result](webrtc::RTCError error) { result = error; });
1135 run_loop_.Flush();
1136 EXPECT_TRUE(result->ok());
1137
1138 DestroyVideoRtpSender();
1139}
1140
Florent Castelli892acf02018-10-01 22:47:20 +02001141TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParametersBeforeNegotiation) {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001142 video_rtp_sender_ =
1143 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +02001144
1145 RtpParameters params = video_rtp_sender_->GetParameters();
1146 ASSERT_EQ(1u, params.encodings.size());
1147 params.encodings[0].max_bitrate_bps = 90000;
1148 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1149
1150 params = video_rtp_sender_->GetParameters();
1151 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1152 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
1153
1154 DestroyVideoRtpSender();
1155}
1156
Florent Castelliacabb362022-10-18 17:05:16 +02001157TEST_F(RtpSenderReceiverTest,
1158 VideoSenderCanSetParametersAsyncBeforeNegotiation) {
1159 video_rtp_sender_ =
1160 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
1161
1162 absl::optional<webrtc::RTCError> result;
1163 RtpParameters params = video_rtp_sender_->GetParameters();
1164 ASSERT_EQ(1u, params.encodings.size());
1165 params.encodings[0].max_bitrate_bps = 90000;
1166 video_rtp_sender_->SetParametersAsync(
1167 params, [&result](webrtc::RTCError error) { result = error; });
1168 run_loop_.Flush();
1169 EXPECT_TRUE(result->ok());
1170
1171 params = video_rtp_sender_->GetParameters();
1172 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
1173 video_rtp_sender_->SetParametersAsync(
1174 params, [&result](webrtc::RTCError error) { result = error; });
1175 run_loop_.Flush();
1176 EXPECT_TRUE(result->ok());
1177
1178 DestroyVideoRtpSender();
1179}
1180
Florent Castelli892acf02018-10-01 22:47:20 +02001181TEST_F(RtpSenderReceiverTest, VideoSenderInitParametersMovedAfterNegotiation) {
1182 AddVideoTrack(false);
1183
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001184 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001185 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001186 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1187 set_streams_observer.get());
Niels Möllerafb246b2022-04-20 14:26:50 +02001188 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001189 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1190 video_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli892acf02018-10-01 22:47:20 +02001191
1192 std::vector<RtpEncodingParameters> init_encodings(2);
1193 init_encodings[0].max_bitrate_bps = 60000;
1194 init_encodings[1].max_bitrate_bps = 900000;
1195 video_rtp_sender_->set_init_send_encodings(init_encodings);
1196
1197 RtpParameters params = video_rtp_sender_->GetParameters();
1198 ASSERT_EQ(2u, params.encodings.size());
1199 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1200 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
1201
1202 // Simulate the setLocalDescription call
1203 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +01001204 ssrcs.reserve(2);
Florent Castelli892acf02018-10-01 22:47:20 +02001205 for (int i = 0; i < 2; ++i)
1206 ssrcs.push_back(kVideoSsrcSimulcast + i);
1207 cricket::StreamParams stream_params =
1208 cricket::CreateSimStreamParams("cname", ssrcs);
Harald Alvestrand485457f2022-05-23 08:46:57 +00001209 video_media_channel()->AddSendStream(stream_params);
Harald Alvestrandc0d44d92022-12-13 12:57:24 +00001210 video_rtp_sender_->SetMediaChannel(
1211 video_media_channel()->AsVideoSendChannel());
Florent Castelli892acf02018-10-01 22:47:20 +02001212 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
1213
1214 params = video_rtp_sender_->GetParameters();
1215 ASSERT_EQ(2u, params.encodings.size());
1216 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1217 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
1218
1219 DestroyVideoRtpSender();
1220}
1221
1222TEST_F(RtpSenderReceiverTest,
1223 VideoSenderInitParametersMovedAfterManualSimulcastAndNegotiation) {
1224 AddVideoTrack(false);
1225
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001226 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001227 std::make_unique<MockSetStreamsObserver>();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001228 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1229 set_streams_observer.get());
Niels Möllerafb246b2022-04-20 14:26:50 +02001230 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001231 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1232 video_rtp_sender_->SetStreams({local_stream_->id()});
Florent Castelli892acf02018-10-01 22:47:20 +02001233
1234 std::vector<RtpEncodingParameters> init_encodings(1);
1235 init_encodings[0].max_bitrate_bps = 60000;
1236 video_rtp_sender_->set_init_send_encodings(init_encodings);
1237
1238 RtpParameters params = video_rtp_sender_->GetParameters();
1239 ASSERT_EQ(1u, params.encodings.size());
1240 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1241
1242 // Simulate the setLocalDescription call as if the user used SDP munging
1243 // to enable simulcast
1244 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +01001245 ssrcs.reserve(2);
Florent Castelli892acf02018-10-01 22:47:20 +02001246 for (int i = 0; i < 2; ++i)
1247 ssrcs.push_back(kVideoSsrcSimulcast + i);
1248 cricket::StreamParams stream_params =
1249 cricket::CreateSimStreamParams("cname", ssrcs);
Harald Alvestrand485457f2022-05-23 08:46:57 +00001250 video_media_channel()->AddSendStream(stream_params);
Harald Alvestrandc0d44d92022-12-13 12:57:24 +00001251 video_rtp_sender_->SetMediaChannel(
1252 video_media_channel()->AsVideoSendChannel());
Florent Castelli892acf02018-10-01 22:47:20 +02001253 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
1254
1255 params = video_rtp_sender_->GetParameters();
1256 ASSERT_EQ(2u, params.encodings.size());
1257 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1258
1259 DestroyVideoRtpSender();
1260}
1261
Harald Alvestrand3fe8b0d2022-07-01 07:36:59 +00001262#if GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
1263using RtpSenderReceiverDeathTest = RtpSenderReceiverTest;
1264
1265TEST_F(RtpSenderReceiverDeathTest,
1266 VideoSenderManualRemoveSimulcastFailsDeathTest) {
1267 AddVideoTrack(false);
1268
1269 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
1270 std::make_unique<MockSetStreamsObserver>();
1271 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1272 set_streams_observer.get());
1273 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
1274 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1275 video_rtp_sender_->SetStreams({local_stream_->id()});
1276
1277 std::vector<RtpEncodingParameters> init_encodings(2);
1278 init_encodings[0].max_bitrate_bps = 60000;
1279 init_encodings[1].max_bitrate_bps = 120000;
1280 video_rtp_sender_->set_init_send_encodings(init_encodings);
1281
1282 RtpParameters params = video_rtp_sender_->GetParameters();
1283 ASSERT_EQ(2u, params.encodings.size());
1284 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1285
1286 // Simulate the setLocalDescription call as if the user used SDP munging
1287 // to disable simulcast.
1288 std::vector<uint32_t> ssrcs;
1289 ssrcs.reserve(2);
1290 for (int i = 0; i < 2; ++i)
1291 ssrcs.push_back(kVideoSsrcSimulcast + i);
1292 cricket::StreamParams stream_params =
1293 cricket::StreamParams::CreateLegacy(kVideoSsrc);
1294 video_media_channel()->AddSendStream(stream_params);
Harald Alvestrandc0d44d92022-12-13 12:57:24 +00001295 video_rtp_sender_->SetMediaChannel(
1296 video_media_channel()->AsVideoSendChannel());
Harald Alvestrand3fe8b0d2022-07-01 07:36:59 +00001297 EXPECT_DEATH(video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast), "");
1298}
1299#endif
1300
Florent Castelli892acf02018-10-01 22:47:20 +02001301TEST_F(RtpSenderReceiverTest,
1302 VideoSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001303 video_rtp_sender_ =
1304 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
Florent Castelli892acf02018-10-01 22:47:20 +02001305
1306 RtpParameters params;
1307 RTCError result = video_rtp_sender_->SetParameters(params);
1308 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1309 DestroyVideoRtpSender();
1310}
1311
Florent Castellicebf50f2018-05-03 15:31:53 +02001312TEST_F(RtpSenderReceiverTest,
1313 VideoSenderMustCallGetParametersBeforeSetParameters) {
1314 CreateVideoRtpSender();
1315
1316 RtpParameters params;
1317 RTCError result = video_rtp_sender_->SetParameters(params);
1318 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1319
1320 DestroyVideoRtpSender();
1321}
1322
1323TEST_F(RtpSenderReceiverTest,
1324 VideoSenderSetParametersInvalidatesTransactionId) {
1325 CreateVideoRtpSender();
1326
1327 RtpParameters params = video_rtp_sender_->GetParameters();
1328 EXPECT_EQ(1u, params.encodings.size());
1329 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1330 RTCError result = video_rtp_sender_->SetParameters(params);
1331 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1332
1333 DestroyVideoRtpSender();
1334}
1335
Florent Castelliacabb362022-10-18 17:05:16 +02001336TEST_F(RtpSenderReceiverTest,
1337 VideoSenderSetParametersAsyncInvalidatesTransactionId) {
1338 CreateVideoRtpSender();
1339
1340 RtpParameters params = video_rtp_sender_->GetParameters();
1341 EXPECT_EQ(1u, params.encodings.size());
1342 absl::optional<webrtc::RTCError> result;
1343 video_rtp_sender_->SetParametersAsync(
1344 params, [&result](webrtc::RTCError error) { result = error; });
1345 run_loop_.Flush();
1346 EXPECT_TRUE(result->ok());
1347 video_rtp_sender_->SetParametersAsync(
1348 params, [&result](webrtc::RTCError error) { result = error; });
1349 run_loop_.Flush();
1350 EXPECT_EQ(RTCErrorType::INVALID_STATE, result->type());
1351
1352 DestroyVideoRtpSender();
1353}
1354
Florent Castellicebf50f2018-05-03 15:31:53 +02001355TEST_F(RtpSenderReceiverTest, VideoSenderDetectTransactionIdModification) {
1356 CreateVideoRtpSender();
1357
1358 RtpParameters params = video_rtp_sender_->GetParameters();
1359 params.transaction_id = "";
1360 RTCError result = video_rtp_sender_->SetParameters(params);
1361 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1362
1363 DestroyVideoRtpSender();
1364}
1365
1366TEST_F(RtpSenderReceiverTest, VideoSenderCheckTransactionIdRefresh) {
1367 CreateVideoRtpSender();
1368
1369 RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001370 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 15:31:53 +02001371 auto saved_transaction_id = params.transaction_id;
1372 params = video_rtp_sender_->GetParameters();
1373 EXPECT_NE(saved_transaction_id, params.transaction_id);
1374
1375 DestroyVideoRtpSender();
1376}
1377
1378TEST_F(RtpSenderReceiverTest, VideoSenderSetParametersOldValueFail) {
1379 CreateVideoRtpSender();
1380
1381 RtpParameters params = video_rtp_sender_->GetParameters();
1382 RtpParameters second_params = video_rtp_sender_->GetParameters();
1383
1384 RTCError result = video_rtp_sender_->SetParameters(params);
1385 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1386
1387 DestroyVideoRtpSender();
1388}
1389
Seth Hampson2d2c8882018-05-16 16:02:32 -07001390TEST_F(RtpSenderReceiverTest, VideoSenderCantSetUnimplementedRtpParameters) {
1391 CreateVideoRtpSender();
1392 RtpParameters params = video_rtp_sender_->GetParameters();
1393 EXPECT_EQ(1u, params.encodings.size());
1394
Florent Castelli87b3c512018-07-18 16:00:28 +02001395 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 16:02:32 -07001396 params.mid = "dummy_mid";
1397 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1398 video_rtp_sender_->SetParameters(params).type());
1399 params = video_rtp_sender_->GetParameters();
1400
Seth Hampson2d2c8882018-05-16 16:02:32 -07001401 DestroyVideoRtpSender();
1402}
1403
Florent Castellic1a0bcb2019-01-29 14:26:48 +01001404TEST_F(RtpSenderReceiverTest, VideoSenderCanSetScaleResolutionDownBy) {
1405 CreateVideoRtpSender();
1406
1407 RtpParameters params = video_rtp_sender_->GetParameters();
1408 params.encodings[0].scale_resolution_down_by = 2;
1409
1410 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1411 params = video_rtp_sender_->GetParameters();
1412 EXPECT_EQ(2, params.encodings[0].scale_resolution_down_by);
1413
1414 DestroyVideoRtpSender();
1415}
1416
1417TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidScaleResolutionDownBy) {
1418 CreateVideoRtpSender();
1419
1420 RtpParameters params = video_rtp_sender_->GetParameters();
1421 params.encodings[0].scale_resolution_down_by = 0.5;
1422 RTCError result = video_rtp_sender_->SetParameters(params);
1423 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1424
1425 DestroyVideoRtpSender();
1426}
1427
Ă…sa Perssonfb195962021-08-16 16:41:56 +02001428TEST_F(RtpSenderReceiverTest, VideoSenderCanSetNumTemporalLayers) {
1429 CreateVideoRtpSender();
1430
1431 RtpParameters params = video_rtp_sender_->GetParameters();
1432 params.encodings[0].num_temporal_layers = 2;
1433
1434 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1435 params = video_rtp_sender_->GetParameters();
1436 EXPECT_EQ(2, params.encodings[0].num_temporal_layers);
1437
1438 DestroyVideoRtpSender();
1439}
1440
1441TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidNumTemporalLayers) {
1442 CreateVideoRtpSender();
1443
1444 RtpParameters params = video_rtp_sender_->GetParameters();
1445 params.encodings[0].num_temporal_layers = webrtc::kMaxTemporalStreams + 1;
1446 RTCError result = video_rtp_sender_->SetParameters(params);
1447 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1448
1449 DestroyVideoRtpSender();
1450}
1451
Florent Castelli907dc802019-12-06 15:03:19 +01001452TEST_F(RtpSenderReceiverTest, VideoSenderCanSetMaxFramerate) {
1453 CreateVideoRtpSender();
1454
1455 RtpParameters params = video_rtp_sender_->GetParameters();
1456 params.encodings[0].max_framerate = 20;
1457
1458 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1459 params = video_rtp_sender_->GetParameters();
1460 EXPECT_EQ(20., params.encodings[0].max_framerate);
1461
1462 DestroyVideoRtpSender();
1463}
1464
1465TEST_F(RtpSenderReceiverTest, VideoSenderCanSetMaxFramerateZero) {
1466 CreateVideoRtpSender();
1467
1468 RtpParameters params = video_rtp_sender_->GetParameters();
1469 params.encodings[0].max_framerate = 0.;
1470
1471 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1472 params = video_rtp_sender_->GetParameters();
1473 EXPECT_EQ(0., params.encodings[0].max_framerate);
1474
1475 DestroyVideoRtpSender();
1476}
1477
1478TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidMaxFramerate) {
1479 CreateVideoRtpSender();
1480
1481 RtpParameters params = video_rtp_sender_->GetParameters();
1482 params.encodings[0].max_framerate = -5.;
1483 RTCError result = video_rtp_sender_->SetParameters(params);
1484 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1485
1486 DestroyVideoRtpSender();
1487}
1488
Seth Hampson2d2c8882018-05-16 16:02:32 -07001489// A video sender can have multiple simulcast layers, in which case it will
1490// contain multiple RtpEncodingParameters. This tests that if this is the case
1491// (simulcast), then we can't set the bitrate_priority, or max_bitrate_bps
1492// for any encodings besides at index 0, because these are both implemented
1493// "per-sender."
1494TEST_F(RtpSenderReceiverTest, VideoSenderCantSetPerSenderEncodingParameters) {
1495 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001496 CreateVideoRtpSenderWithSimulcast();
Seth Hampson2d2c8882018-05-16 16:02:32 -07001497 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001498 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Seth Hampson2d2c8882018-05-16 16:02:32 -07001499
1500 params.encodings[1].bitrate_priority = 2.0;
1501 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1502 video_rtp_sender_->SetParameters(params).type());
1503 params = video_rtp_sender_->GetParameters();
1504
Seth Hampson2d2c8882018-05-16 16:02:32 -07001505 DestroyVideoRtpSender();
1506}
1507
Florent Castelli892acf02018-10-01 22:47:20 +02001508TEST_F(RtpSenderReceiverTest, VideoSenderCantSetReadOnlyEncodingParameters) {
1509 // Add a simulcast specific send stream that contains 2 encoding parameters.
1510 CreateVideoRtpSenderWithSimulcast();
1511 RtpParameters params = video_rtp_sender_->GetParameters();
1512 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
1513
1514 for (size_t i = 0; i < params.encodings.size(); i++) {
1515 params.encodings[i].ssrc = 1337;
1516 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION,
1517 video_rtp_sender_->SetParameters(params).type());
1518 params = video_rtp_sender_->GetParameters();
1519 }
1520
1521 DestroyVideoRtpSender();
1522}
1523
Ă…sa Persson55659812018-06-18 17:51:32 +02001524TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrate) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001525 CreateVideoRtpSender();
1526
Harald Alvestrand485457f2022-05-23 08:46:57 +00001527 EXPECT_EQ(-1, video_media_channel()->max_bps());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001528 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001529 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001530 EXPECT_FALSE(params.encodings[0].min_bitrate_bps);
deadbeefe702b302017-02-04 12:09:01 -08001531 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Ă…sa Persson55659812018-06-18 17:51:32 +02001532 params.encodings[0].min_bitrate_bps = 100;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001533 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -08001534 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001535
1536 // Read back the parameters and verify they have been changed.
1537 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001538 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001539 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001540 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001541
1542 // Verify that the video channel received the new parameters.
Harald Alvestrand485457f2022-05-23 08:46:57 +00001543 params = video_media_channel()->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001544 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001545 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001546 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001547
1548 // Verify that the global bitrate limit has not been changed.
Harald Alvestrand485457f2022-05-23 08:46:57 +00001549 EXPECT_EQ(-1, video_media_channel()->max_bps());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001550
1551 DestroyVideoRtpSender();
1552}
1553
Ă…sa Persson55659812018-06-18 17:51:32 +02001554TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrateSimulcast) {
1555 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001556 CreateVideoRtpSenderWithSimulcast();
Ă…sa Persson55659812018-06-18 17:51:32 +02001557
1558 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001559 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001560 params.encodings[0].min_bitrate_bps = 100;
1561 params.encodings[0].max_bitrate_bps = 1000;
1562 params.encodings[1].min_bitrate_bps = 200;
1563 params.encodings[1].max_bitrate_bps = 2000;
1564 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1565
1566 // Verify that the video channel received the new parameters.
Harald Alvestrand485457f2022-05-23 08:46:57 +00001567 params = video_media_channel()->GetRtpSendParameters(kVideoSsrcSimulcast);
Florent Castelli892acf02018-10-01 22:47:20 +02001568 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001569 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
1570 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
1571 EXPECT_EQ(200, params.encodings[1].min_bitrate_bps);
1572 EXPECT_EQ(2000, params.encodings[1].max_bitrate_bps);
1573
1574 DestroyVideoRtpSender();
1575}
1576
Seth Hampson24722b32017-12-22 09:36:42 -08001577TEST_F(RtpSenderReceiverTest, SetVideoBitratePriority) {
1578 CreateVideoRtpSender();
1579
1580 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001581 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001582 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1583 params.encodings[0].bitrate_priority);
1584 double new_bitrate_priority = 2.0;
1585 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -08001586 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -08001587
1588 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001589 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001590 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1591
Harald Alvestrand485457f2022-05-23 08:46:57 +00001592 params = video_media_channel()->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001593 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001594 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1595
1596 DestroyVideoRtpSender();
1597}
1598
Florent Castelli38332cd2018-11-20 14:08:06 +01001599TEST_F(RtpSenderReceiverTest, VideoReceiverCanGetParametersWithSimulcast) {
1600 CreateVideoRtpReceiverWithSimulcast({}, 2);
1601
1602 RtpParameters params = video_rtp_receiver_->GetParameters();
1603 EXPECT_EQ(2u, params.encodings.size());
1604
1605 DestroyVideoRtpReceiver();
1606}
1607
Philipp Hanckeb83cd922022-11-09 11:06:38 +01001608TEST_F(RtpSenderReceiverTest, GenerateKeyFrameWithAudio) {
1609 CreateAudioRtpSender();
1610
1611 auto error = audio_rtp_sender_->GenerateKeyFrame({});
1612 EXPECT_FALSE(error.ok());
1613 EXPECT_EQ(error.type(), RTCErrorType::UNSUPPORTED_OPERATION);
1614
1615 DestroyAudioRtpSender();
1616}
1617
1618TEST_F(RtpSenderReceiverTest, GenerateKeyFrameWithVideo) {
1619 CreateVideoRtpSenderWithSimulcast({"1", "2", "3"});
1620
1621 auto error = video_rtp_sender_->GenerateKeyFrame({});
1622 EXPECT_TRUE(error.ok());
1623
1624 error = video_rtp_sender_->GenerateKeyFrame({"1"});
1625 EXPECT_TRUE(error.ok());
1626
1627 error = video_rtp_sender_->GenerateKeyFrame({""});
1628 EXPECT_FALSE(error.ok());
1629 EXPECT_EQ(error.type(), RTCErrorType::INVALID_PARAMETER);
1630
1631 error = video_rtp_sender_->GenerateKeyFrame({"no-such-rid"});
1632 EXPECT_FALSE(error.ok());
1633 EXPECT_EQ(error.type(), RTCErrorType::INVALID_PARAMETER);
1634
1635 DestroyVideoRtpSender();
1636}
1637
pbos5214a0a2016-12-16 15:39:11 -08001638// Test that makes sure that a video track content hint translates to the proper
1639// value for sources that are not screencast.
1640TEST_F(RtpSenderReceiverTest, PropagatesVideoTrackContentHint) {
1641 CreateVideoRtpSender();
1642
1643 video_track_->set_enabled(true);
1644
Artem Titov880fa812021-07-30 22:30:23 +02001645 // `video_track_` is not screencast by default.
Harald Alvestrand485457f2022-05-23 08:46:57 +00001646 EXPECT_EQ(false, video_media_channel()->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001647 // No content hint should be set by default.
1648 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1649 video_track_->content_hint());
1650 // Setting detailed should turn a non-screencast source into screencast mode.
1651 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Harald Alvestrand485457f2022-05-23 08:46:57 +00001652 EXPECT_EQ(true, video_media_channel()->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001653 // Removing the content hint should turn the track back into non-screencast
1654 // mode.
1655 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Harald Alvestrand485457f2022-05-23 08:46:57 +00001656 EXPECT_EQ(false, video_media_channel()->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001657 // Setting fluid should remain in non-screencast mode (its default).
1658 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Harald Alvestrand485457f2022-05-23 08:46:57 +00001659 EXPECT_EQ(false, video_media_channel()->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 08:53:10 +02001660 // Setting text should have the same effect as Detailed
1661 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
Harald Alvestrand485457f2022-05-23 08:46:57 +00001662 EXPECT_EQ(true, video_media_channel()->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001663
1664 DestroyVideoRtpSender();
1665}
1666
1667// Test that makes sure that a video track content hint translates to the proper
1668// value for screencast sources.
1669TEST_F(RtpSenderReceiverTest,
1670 PropagatesVideoTrackContentHintForScreencastSource) {
1671 CreateVideoRtpSender(true);
1672
1673 video_track_->set_enabled(true);
1674
Artem Titov880fa812021-07-30 22:30:23 +02001675 // `video_track_` with a screencast source should be screencast by default.
Harald Alvestrand485457f2022-05-23 08:46:57 +00001676 EXPECT_EQ(true, video_media_channel()->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001677 // No content hint should be set by default.
1678 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1679 video_track_->content_hint());
1680 // Setting fluid should turn a screencast source into non-screencast mode.
1681 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Harald Alvestrand485457f2022-05-23 08:46:57 +00001682 EXPECT_EQ(false, video_media_channel()->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001683 // Removing the content hint should turn the track back into screencast mode.
1684 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Harald Alvestrand485457f2022-05-23 08:46:57 +00001685 EXPECT_EQ(true, video_media_channel()->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001686 // Setting detailed should still remain in screencast mode (its default).
1687 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Harald Alvestrand485457f2022-05-23 08:46:57 +00001688 EXPECT_EQ(true, video_media_channel()->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 08:53:10 +02001689 // Setting text should have the same effect as Detailed
1690 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
Harald Alvestrand485457f2022-05-23 08:46:57 +00001691 EXPECT_EQ(true, video_media_channel()->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001692
1693 DestroyVideoRtpSender();
1694}
1695
1696// Test that makes sure any content hints that are set on a track before
1697// VideoRtpSender is ready to send are still applied when it gets ready to send.
1698TEST_F(RtpSenderReceiverTest,
1699 PropagatesVideoTrackContentHintSetBeforeEnabling) {
1700 AddVideoTrack();
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001701 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001702 std::make_unique<MockSetStreamsObserver>();
pbos5214a0a2016-12-16 15:39:11 -08001703 // Setting detailed overrides the default non-screencast mode. This should be
1704 // applied even if the track is set on construction.
1705 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001706 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1707 set_streams_observer.get());
Niels Möllerafb246b2022-04-20 14:26:50 +02001708 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
Guido Urdaneta1ff16c82019-05-20 19:31:53 +02001709 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1710 video_rtp_sender_->SetStreams({local_stream_->id()});
Harald Alvestrandc0d44d92022-12-13 12:57:24 +00001711 video_rtp_sender_->SetMediaChannel(
1712 video_media_channel()->AsVideoSendChannel());
pbos5214a0a2016-12-16 15:39:11 -08001713 video_track_->set_enabled(true);
1714
1715 // Sender is not ready to send (no SSRC) so no option should have been set.
Harald Alvestrand485457f2022-05-23 08:46:57 +00001716 EXPECT_EQ(absl::nullopt, video_media_channel()->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001717
1718 // Verify that the content hint is accounted for when video_rtp_sender_ does
1719 // get enabled.
1720 video_rtp_sender_->SetSsrc(kVideoSsrc);
Harald Alvestrand485457f2022-05-23 08:46:57 +00001721 EXPECT_EQ(true, video_media_channel()->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001722
1723 // And removing the hint should go back to false (to verify that false was
1724 // default correctly).
1725 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Harald Alvestrand485457f2022-05-23 08:46:57 +00001726 EXPECT_EQ(false, video_media_channel()->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001727
1728 DestroyVideoRtpSender();
1729}
1730
deadbeef20cb0c12017-02-01 20:27:00 -08001731TEST_F(RtpSenderReceiverTest, AudioSenderHasDtmfSender) {
1732 CreateAudioRtpSender();
1733 EXPECT_NE(nullptr, audio_rtp_sender_->GetDtmfSender());
1734}
1735
1736TEST_F(RtpSenderReceiverTest, VideoSenderDoesNotHaveDtmfSender) {
1737 CreateVideoRtpSender();
1738 EXPECT_EQ(nullptr, video_rtp_sender_->GetDtmfSender());
1739}
1740
Artem Titov880fa812021-07-30 22:30:23 +02001741// Test that the DTMF sender is really using `voice_channel_`, and thus returns
1742// true/false from CanSendDtmf based on what `voice_channel_` returns.
deadbeef20cb0c12017-02-01 20:27:00 -08001743TEST_F(RtpSenderReceiverTest, CanInsertDtmf) {
1744 AddDtmfCodec();
1745 CreateAudioRtpSender();
1746 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1747 ASSERT_NE(nullptr, dtmf_sender);
1748 EXPECT_TRUE(dtmf_sender->CanInsertDtmf());
1749}
1750
1751TEST_F(RtpSenderReceiverTest, CanNotInsertDtmf) {
1752 CreateAudioRtpSender();
1753 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1754 ASSERT_NE(nullptr, dtmf_sender);
1755 // DTMF codec has not been added, as it was in the above test.
1756 EXPECT_FALSE(dtmf_sender->CanInsertDtmf());
1757}
1758
1759TEST_F(RtpSenderReceiverTest, InsertDtmf) {
1760 AddDtmfCodec();
1761 CreateAudioRtpSender();
1762 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1763 ASSERT_NE(nullptr, dtmf_sender);
1764
Harald Alvestrand485457f2022-05-23 08:46:57 +00001765 EXPECT_EQ(0U, voice_media_channel()->dtmf_info_queue().size());
deadbeef20cb0c12017-02-01 20:27:00 -08001766
1767 // Insert DTMF
1768 const int expected_duration = 90;
1769 dtmf_sender->InsertDtmf("012", expected_duration, 100);
1770
1771 // Verify
Harald Alvestrand485457f2022-05-23 08:46:57 +00001772 ASSERT_EQ_WAIT(3U, voice_media_channel()->dtmf_info_queue().size(),
deadbeef20cb0c12017-02-01 20:27:00 -08001773 kDefaultTimeout);
1774 const uint32_t send_ssrc =
Harald Alvestrand485457f2022-05-23 08:46:57 +00001775 voice_media_channel()->send_streams()[0].first_ssrc();
1776 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel()->dtmf_info_queue()[0],
deadbeef20cb0c12017-02-01 20:27:00 -08001777 send_ssrc, 0, expected_duration));
Harald Alvestrand485457f2022-05-23 08:46:57 +00001778 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel()->dtmf_info_queue()[1],
deadbeef20cb0c12017-02-01 20:27:00 -08001779 send_ssrc, 1, expected_duration));
Harald Alvestrand485457f2022-05-23 08:46:57 +00001780 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel()->dtmf_info_queue()[2],
deadbeef20cb0c12017-02-01 20:27:00 -08001781 send_ssrc, 2, expected_duration));
1782}
1783
Benjamin Wright84583f62018-10-04 14:22:34 -07001784// Validate that the default FrameEncryptor setting is nullptr.
1785TEST_F(RtpSenderReceiverTest, AudioSenderCanSetFrameEncryptor) {
1786 CreateAudioRtpSender();
1787 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1788 new FakeFrameEncryptor());
1789 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1790 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1791 EXPECT_EQ(fake_frame_encryptor.get(),
1792 audio_rtp_sender_->GetFrameEncryptor().get());
1793}
1794
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001795// Validate that setting a FrameEncryptor after the send stream is stopped does
1796// nothing.
1797TEST_F(RtpSenderReceiverTest, AudioSenderCannotSetFrameEncryptorAfterStop) {
1798 CreateAudioRtpSender();
1799 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1800 new FakeFrameEncryptor());
1801 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1802 audio_rtp_sender_->Stop();
1803 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1804 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1805}
1806
Benjamin Wright84583f62018-10-04 14:22:34 -07001807// Validate that the default FrameEncryptor setting is nullptr.
1808TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetFrameDecryptor) {
1809 CreateAudioRtpReceiver();
1810 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
Tomas Gunnarssonb3517fe2022-03-18 19:32:38 +01001811 rtc::make_ref_counted<FakeFrameDecryptor>());
Benjamin Wright84583f62018-10-04 14:22:34 -07001812 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
1813 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1814 EXPECT_EQ(fake_frame_decryptor.get(),
1815 audio_rtp_receiver_->GetFrameDecryptor().get());
Tommi4ccdf932021-05-17 14:50:10 +02001816 DestroyAudioRtpReceiver();
Benjamin Wright84583f62018-10-04 14:22:34 -07001817}
1818
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001819// Validate that the default FrameEncryptor setting is nullptr.
1820TEST_F(RtpSenderReceiverTest, AudioReceiverCannotSetFrameDecryptorAfterStop) {
1821 CreateAudioRtpReceiver();
1822 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
Tomas Gunnarssonb3517fe2022-03-18 19:32:38 +01001823 rtc::make_ref_counted<FakeFrameDecryptor>());
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001824 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
Tommi6589def2022-02-17 23:36:47 +01001825 audio_rtp_receiver_->SetMediaChannel(nullptr);
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001826 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1827 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
Tommi4ccdf932021-05-17 14:50:10 +02001828 DestroyAudioRtpReceiver();
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001829}
1830
1831// Validate that the default FrameEncryptor setting is nullptr.
1832TEST_F(RtpSenderReceiverTest, VideoSenderCanSetFrameEncryptor) {
1833 CreateVideoRtpSender();
1834 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1835 new FakeFrameEncryptor());
1836 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1837 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1838 EXPECT_EQ(fake_frame_encryptor.get(),
1839 video_rtp_sender_->GetFrameEncryptor().get());
1840}
1841
1842// Validate that setting a FrameEncryptor after the send stream is stopped does
1843// nothing.
1844TEST_F(RtpSenderReceiverTest, VideoSenderCannotSetFrameEncryptorAfterStop) {
1845 CreateVideoRtpSender();
1846 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1847 new FakeFrameEncryptor());
1848 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1849 video_rtp_sender_->Stop();
1850 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1851 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1852}
1853
1854// Validate that the default FrameEncryptor setting is nullptr.
1855TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetFrameDecryptor) {
1856 CreateVideoRtpReceiver();
1857 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
Tomas Gunnarssonb3517fe2022-03-18 19:32:38 +01001858 rtc::make_ref_counted<FakeFrameDecryptor>());
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001859 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
1860 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1861 EXPECT_EQ(fake_frame_decryptor.get(),
1862 video_rtp_receiver_->GetFrameDecryptor().get());
Tommi4ccdf932021-05-17 14:50:10 +02001863 DestroyVideoRtpReceiver();
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001864}
1865
1866// Validate that the default FrameEncryptor setting is nullptr.
1867TEST_F(RtpSenderReceiverTest, VideoReceiverCannotSetFrameDecryptorAfterStop) {
1868 CreateVideoRtpReceiver();
1869 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
Tomas Gunnarssonb3517fe2022-03-18 19:32:38 +01001870 rtc::make_ref_counted<FakeFrameDecryptor>());
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001871 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
Tommi6589def2022-02-17 23:36:47 +01001872 video_rtp_receiver_->SetMediaChannel(nullptr);
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001873 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1874 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
Tommi4ccdf932021-05-17 14:50:10 +02001875 DestroyVideoRtpReceiver();
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001876}
1877
Amit Hilbuch619b2942019-02-26 15:55:19 -08001878// Checks that calling the internal methods for get/set parameters do not
1879// invalidate any parameters retreived by clients.
1880TEST_F(RtpSenderReceiverTest,
1881 InternalParameterMethodsDoNotInvalidateTransaction) {
1882 CreateVideoRtpSender();
1883 RtpParameters parameters = video_rtp_sender_->GetParameters();
1884 RtpParameters new_parameters = video_rtp_sender_->GetParametersInternal();
1885 new_parameters.encodings[0].active = false;
Florent Castelliacabb362022-10-18 17:05:16 +02001886 video_rtp_sender_->SetParametersInternal(new_parameters, nullptr, true);
Amit Hilbuch619b2942019-02-26 15:55:19 -08001887 new_parameters.encodings[0].active = true;
Florent Castelliacabb362022-10-18 17:05:16 +02001888 video_rtp_sender_->SetParametersInternal(new_parameters, nullptr, true);
Amit Hilbuch619b2942019-02-26 15:55:19 -08001889 parameters.encodings[0].active = false;
1890 EXPECT_TRUE(video_rtp_sender_->SetParameters(parameters).ok());
1891}
1892
Philipp Hanckee04c3972022-12-21 15:46:46 +01001893// Checks that the senders SetStreams eliminates duplicate stream ids.
1894TEST_F(RtpSenderReceiverTest, SenderSetStreamsEliminatesDuplicateIds) {
1895 AddVideoTrack();
1896 video_rtp_sender_ =
1897 VideoRtpSender::Create(worker_thread_, video_track_->id(), nullptr);
1898 video_rtp_sender_->SetStreams({"1", "2", "1"});
1899 EXPECT_EQ(video_rtp_sender_->stream_ids().size(), 2u);
1900}
1901
Amit Hilbuch2297d332019-02-19 12:49:22 -08001902// Helper method for syntactic sugar for accepting a vector with '{}' notation.
1903std::pair<RidList, RidList> CreatePairOfRidVectors(
1904 const std::vector<std::string>& first,
1905 const std::vector<std::string>& second) {
1906 return std::make_pair(first, second);
1907}
1908
1909// These parameters are used to test disabling simulcast layers.
1910const std::pair<RidList, RidList> kDisableSimulcastLayersParameters[] = {
1911 // Tests removing the first layer. This is a special case because
1912 // the first layer's SSRC is also the 'primary' SSRC used to associate the
1913 // parameters to the media channel.
1914 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"1"}),
1915 // Tests removing some layers.
1916 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"2", "4"}),
1917 // Tests simulcast rejected scenario all layers except first are rejected.
1918 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"2", "3", "4"}),
1919 // Tests removing all layers.
1920 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"1", "2", "3", "4"}),
1921};
1922
1923// Runs test for disabling layers on a sender without a media engine set.
1924TEST_P(RtpSenderReceiverTest, DisableSimulcastLayersWithoutMediaEngine) {
1925 auto parameter = GetParam();
1926 RunDisableSimulcastLayersWithoutMediaEngineTest(parameter.first,
1927 parameter.second);
1928}
1929
1930// Runs test for disabling layers on a sender with a media engine set.
1931TEST_P(RtpSenderReceiverTest, DisableSimulcastLayersWithMediaEngine) {
1932 auto parameter = GetParam();
1933 RunDisableSimulcastLayersWithMediaEngineTest(parameter.first,
1934 parameter.second);
1935}
1936
1937INSTANTIATE_TEST_SUITE_P(
1938 DisableSimulcastLayersInSender,
1939 RtpSenderReceiverTest,
1940 ::testing::ValuesIn(kDisableSimulcastLayersParameters));
1941
deadbeef70ab1a12015-09-28 16:53:55 -07001942} // namespace webrtc