1 /*
2 * Copyright 2012 The WebRTC project authors. All Rights Reserved.
3 *
4 * 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.
9 */
10
11 #include <stddef.h>
12
13 #include <cstdint>
14 #include <iterator>
15 #include <memory>
16 #include <string>
17 #include <utility>
18 #include <vector>
19
20 #include "absl/algorithm/container.h"
21 #include "absl/memory/memory.h"
22 #include "absl/types/optional.h"
23 #include "api/audio_options.h"
24 #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"
30 #include "api/rtc_event_log/rtc_event_log.h"
31 #include "api/rtp_parameters.h"
32 #include "api/rtp_receiver_interface.h"
33 #include "api/scoped_refptr.h"
34 #include "api/test/fake_frame_decryptor.h"
35 #include "api/test/fake_frame_encryptor.h"
36 #include "api/video/builtin_video_bitrate_allocator_factory.h"
37 #include "api/video/video_bitrate_allocator_factory.h"
38 #include "api/video/video_codec_constants.h"
39 #include "media/base/codec.h"
40 #include "media/base/delayable.h"
41 #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"
45 #include "media/base/rid_description.h"
46 #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"
52 #include "pc/audio_rtp_receiver.h"
53 #include "pc/audio_track.h"
54 #include "pc/channel.h"
55 #include "pc/dtls_srtp_transport.h"
56 #include "pc/local_audio_source.h"
57 #include "pc/media_stream.h"
58 #include "pc/rtp_sender.h"
59 #include "pc/rtp_transport_internal.h"
60 #include "pc/test/fake_video_track_source.h"
61 #include "pc/video_rtp_receiver.h"
62 #include "pc/video_track.h"
63 #include "rtc_base/checks.h"
64 #include "rtc_base/gunit.h"
65 #include "rtc_base/thread.h"
66 #include "test/gmock.h"
67 #include "test/gtest.h"
68 #include "test/run_loop.h"
69 #include "test/scoped_key_value_config.h"
70
71 using ::testing::_;
72 using ::testing::ContainerEq;
73 using ::testing::Exactly;
74 using ::testing::InvokeWithoutArgs;
75 using ::testing::Return;
76 using RidList = std::vector<std::string>;
77
78 namespace {
79
80 static const char kStreamId1[] = "local_stream_1";
81 static const char kVideoTrackId[] = "video_1";
82 static const char kAudioTrackId[] = "audio_1";
83 static const uint32_t kVideoSsrc = 98;
84 static const uint32_t kVideoSsrc2 = 100;
85 static const uint32_t kAudioSsrc = 99;
86 static const uint32_t kAudioSsrc2 = 101;
87 static const uint32_t kVideoSsrcSimulcast = 102;
88 static const uint32_t kVideoSimulcastLayerCount = 2;
89 static const int kDefaultTimeout = 10000; // 10 seconds.
90
91 class MockSetStreamsObserver
92 : public webrtc::RtpSenderBase::SetStreamsObserver {
93 public:
94 MOCK_METHOD(void, OnSetStreams, (), (override));
95 };
96
97 } // namespace
98
99 namespace webrtc {
100
101 class RtpSenderReceiverTest
102 : public ::testing::Test,
103 public ::testing::WithParamInterface<std::pair<RidList, RidList>> {
104 public:
RtpSenderReceiverTest()105 RtpSenderReceiverTest()
106 : network_thread_(rtc::Thread::Current()),
107 worker_thread_(rtc::Thread::Current()),
108 video_bitrate_allocator_factory_(
109 webrtc::CreateBuiltinVideoBitrateAllocatorFactory()),
110 // Create fake media engine/etc. so we can create channels to use to
111 // test RtpSenders/RtpReceivers.
112 media_engine_(std::make_unique<cricket::FakeMediaEngine>()),
113 fake_call_(worker_thread_, network_thread_),
114 local_stream_(MediaStream::Create(kStreamId1)) {
115 rtp_dtls_transport_ = std::make_unique<cricket::FakeDtlsTransport>(
116 "fake_dtls_transport", cricket::ICE_CANDIDATE_COMPONENT_RTP);
117 rtp_transport_ = CreateDtlsSrtpTransport();
118
119 // 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(
122 &fake_call_, cricket::MediaConfig(), cricket::AudioOptions(),
123 webrtc::CryptoOptions());
124 media_engine_->video().CreateMediaChannel(
125 &fake_call_, cricket::MediaConfig(), cricket::VideoOptions(),
126 webrtc::CryptoOptions(), video_bitrate_allocator_factory_.get());
127
128 voice_media_channel_ = absl::WrapUnique(media_engine_->GetVoiceChannel(0));
129 video_media_channel_ = absl::WrapUnique(media_engine_->GetVideoChannel(0));
130
131 RTC_CHECK(voice_media_channel());
132 RTC_CHECK(video_media_channel());
133
134 // Create streams for predefined SSRCs. Streams need to exist in order
135 // for the senders and receievers to apply parameters to them.
136 // Normally these would be created by SetLocalDescription and
137 // SetRemoteDescription.
138 voice_media_channel_->AddSendStream(
139 cricket::StreamParams::CreateLegacy(kAudioSsrc));
140 voice_media_channel_->AddRecvStream(
141 cricket::StreamParams::CreateLegacy(kAudioSsrc));
142 voice_media_channel_->AddSendStream(
143 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
144 voice_media_channel_->AddRecvStream(
145 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
146 video_media_channel_->AddSendStream(
147 cricket::StreamParams::CreateLegacy(kVideoSsrc));
148 video_media_channel_->AddRecvStream(
149 cricket::StreamParams::CreateLegacy(kVideoSsrc));
150 video_media_channel_->AddSendStream(
151 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
152 video_media_channel_->AddRecvStream(
153 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
154 }
155
~RtpSenderReceiverTest()156 ~RtpSenderReceiverTest() {
157 audio_rtp_sender_ = nullptr;
158 video_rtp_sender_ = nullptr;
159 audio_rtp_receiver_ = nullptr;
160 video_rtp_receiver_ = nullptr;
161 local_stream_ = nullptr;
162 video_track_ = nullptr;
163 audio_track_ = nullptr;
164 }
165
CreateDtlsSrtpTransport()166 std::unique_ptr<webrtc::RtpTransportInternal> CreateDtlsSrtpTransport() {
167 auto dtls_srtp_transport = std::make_unique<webrtc::DtlsSrtpTransport>(
168 /*rtcp_mux_required=*/true, field_trials_);
169 dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport_.get(),
170 /*rtcp_dtls_transport=*/nullptr);
171 return dtls_srtp_transport;
172 }
173
174 // Needed to use DTMF sender.
AddDtmfCodec()175 void AddDtmfCodec() {
176 cricket::AudioSendParameters params;
177 const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000,
178 0, 1);
179 params.codecs.push_back(kTelephoneEventCodec);
180 voice_media_channel()->SetSendParameters(params);
181 }
182
AddVideoTrack()183 void AddVideoTrack() { AddVideoTrack(false); }
184
AddVideoTrack(bool is_screencast)185 void AddVideoTrack(bool is_screencast) {
186 rtc::scoped_refptr<VideoTrackSourceInterface> source(
187 FakeVideoTrackSource::Create(is_screencast));
188 video_track_ =
189 VideoTrack::Create(kVideoTrackId, source, rtc::Thread::Current());
190 EXPECT_TRUE(local_stream_->AddTrack(video_track_));
191 }
192
CreateAudioRtpSender()193 void CreateAudioRtpSender() { CreateAudioRtpSender(nullptr); }
194
CreateAudioRtpSender(const rtc::scoped_refptr<LocalAudioSource> & source)195 void CreateAudioRtpSender(
196 const rtc::scoped_refptr<LocalAudioSource>& source) {
197 audio_track_ = AudioTrack::Create(kAudioTrackId, source);
198 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
199 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
200 std::make_unique<MockSetStreamsObserver>();
201 audio_rtp_sender_ =
202 AudioRtpSender::Create(worker_thread_, audio_track_->id(), nullptr,
203 set_streams_observer.get());
204 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_.get()));
205 EXPECT_CALL(*set_streams_observer, OnSetStreams());
206 audio_rtp_sender_->SetStreams({local_stream_->id()});
207 audio_rtp_sender_->SetMediaChannel(voice_media_channel());
208 audio_rtp_sender_->SetSsrc(kAudioSsrc);
209 VerifyVoiceChannelInput();
210 }
211
CreateAudioRtpSenderWithNoTrack()212 void CreateAudioRtpSenderWithNoTrack() {
213 audio_rtp_sender_ =
214 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
215 audio_rtp_sender_->SetMediaChannel(voice_media_channel());
216 }
217
CreateVideoRtpSender(uint32_t ssrc)218 void CreateVideoRtpSender(uint32_t ssrc) {
219 CreateVideoRtpSender(false, ssrc);
220 }
221
CreateVideoRtpSender()222 void CreateVideoRtpSender() { CreateVideoRtpSender(false); }
223
CreateSimulcastStreamParams(int num_layers)224 cricket::StreamParams CreateSimulcastStreamParams(int num_layers) {
225 std::vector<uint32_t> ssrcs;
226 ssrcs.reserve(num_layers);
227 for (int i = 0; i < num_layers; ++i) {
228 ssrcs.push_back(kVideoSsrcSimulcast + i);
229 }
230 return cricket::CreateSimStreamParams("cname", ssrcs);
231 }
232
CreateVideoRtpSender(const cricket::StreamParams & stream_params)233 uint32_t CreateVideoRtpSender(const cricket::StreamParams& stream_params) {
234 video_media_channel_->AddSendStream(stream_params);
235 uint32_t primary_ssrc = stream_params.first_ssrc();
236 CreateVideoRtpSender(primary_ssrc);
237 return primary_ssrc;
238 }
239
CreateVideoRtpSenderWithSimulcast(int num_layers=kVideoSimulcastLayerCount)240 uint32_t CreateVideoRtpSenderWithSimulcast(
241 int num_layers = kVideoSimulcastLayerCount) {
242 return CreateVideoRtpSender(CreateSimulcastStreamParams(num_layers));
243 }
244
CreateVideoRtpSenderWithSimulcast(const std::vector<std::string> & rids)245 uint32_t CreateVideoRtpSenderWithSimulcast(
246 const std::vector<std::string>& rids) {
247 cricket::StreamParams stream_params =
248 CreateSimulcastStreamParams(rids.size());
249 std::vector<cricket::RidDescription> rid_descriptions;
250 absl::c_transform(
251 rids, std::back_inserter(rid_descriptions), [](const std::string& rid) {
252 return cricket::RidDescription(rid, cricket::RidDirection::kSend);
253 });
254 stream_params.set_rids(rid_descriptions);
255 return CreateVideoRtpSender(stream_params);
256 }
257
CreateVideoRtpSender(bool is_screencast,uint32_t ssrc=kVideoSsrc)258 void CreateVideoRtpSender(bool is_screencast, uint32_t ssrc = kVideoSsrc) {
259 AddVideoTrack(is_screencast);
260 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
261 std::make_unique<MockSetStreamsObserver>();
262 video_rtp_sender_ = VideoRtpSender::Create(
263 worker_thread_, video_track_->id(), set_streams_observer.get());
264 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
265 EXPECT_CALL(*set_streams_observer, OnSetStreams());
266 video_rtp_sender_->SetStreams({local_stream_->id()});
267 video_rtp_sender_->SetMediaChannel(video_media_channel());
268 video_rtp_sender_->SetSsrc(ssrc);
269 VerifyVideoChannelInput(ssrc);
270 }
CreateVideoRtpSenderWithNoTrack()271 void CreateVideoRtpSenderWithNoTrack() {
272 video_rtp_sender_ =
273 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
274 video_rtp_sender_->SetMediaChannel(video_media_channel());
275 }
276
DestroyAudioRtpSender()277 void DestroyAudioRtpSender() {
278 audio_rtp_sender_ = nullptr;
279 VerifyVoiceChannelNoInput();
280 }
281
DestroyVideoRtpSender()282 void DestroyVideoRtpSender() {
283 video_rtp_sender_ = nullptr;
284 VerifyVideoChannelNoInput();
285 }
286
CreateAudioRtpReceiver(std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams={})287 void CreateAudioRtpReceiver(
288 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
289 audio_rtp_receiver_ = rtc::make_ref_counted<AudioRtpReceiver>(
290 rtc::Thread::Current(), kAudioTrackId, streams,
291 /*is_unified_plan=*/true);
292 audio_rtp_receiver_->SetMediaChannel(voice_media_channel());
293 audio_rtp_receiver_->SetupMediaChannel(kAudioSsrc);
294 audio_track_ = audio_rtp_receiver_->audio_track();
295 VerifyVoiceChannelOutput();
296 }
297
CreateVideoRtpReceiver(std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams={})298 void CreateVideoRtpReceiver(
299 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
300 video_rtp_receiver_ = rtc::make_ref_counted<VideoRtpReceiver>(
301 rtc::Thread::Current(), kVideoTrackId, streams);
302 video_rtp_receiver_->SetMediaChannel(video_media_channel());
303 video_rtp_receiver_->SetupMediaChannel(kVideoSsrc);
304 video_track_ = video_rtp_receiver_->video_track();
305 VerifyVideoChannelOutput();
306 }
307
CreateVideoRtpReceiverWithSimulcast(std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams={},int num_layers=kVideoSimulcastLayerCount)308 void CreateVideoRtpReceiverWithSimulcast(
309 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {},
310 int num_layers = kVideoSimulcastLayerCount) {
311 std::vector<uint32_t> ssrcs;
312 ssrcs.reserve(num_layers);
313 for (int i = 0; i < num_layers; ++i)
314 ssrcs.push_back(kVideoSsrcSimulcast + i);
315 cricket::StreamParams stream_params =
316 cricket::CreateSimStreamParams("cname", ssrcs);
317 video_media_channel_->AddRecvStream(stream_params);
318 uint32_t primary_ssrc = stream_params.first_ssrc();
319
320 video_rtp_receiver_ = rtc::make_ref_counted<VideoRtpReceiver>(
321 rtc::Thread::Current(), kVideoTrackId, streams);
322 video_rtp_receiver_->SetMediaChannel(video_media_channel());
323 video_rtp_receiver_->SetupMediaChannel(primary_ssrc);
324 video_track_ = video_rtp_receiver_->video_track();
325 }
326
DestroyAudioRtpReceiver()327 void DestroyAudioRtpReceiver() {
328 if (!audio_rtp_receiver_)
329 return;
330 audio_rtp_receiver_->SetMediaChannel(nullptr);
331 audio_rtp_receiver_ = nullptr;
332 VerifyVoiceChannelNoOutput();
333 }
334
DestroyVideoRtpReceiver()335 void DestroyVideoRtpReceiver() {
336 if (!video_rtp_receiver_)
337 return;
338 video_rtp_receiver_->Stop();
339 video_rtp_receiver_->SetMediaChannel(nullptr);
340 video_rtp_receiver_ = nullptr;
341 VerifyVideoChannelNoOutput();
342 }
343
VerifyVoiceChannelInput()344 void VerifyVoiceChannelInput() { VerifyVoiceChannelInput(kAudioSsrc); }
345
VerifyVoiceChannelInput(uint32_t ssrc)346 void VerifyVoiceChannelInput(uint32_t ssrc) {
347 // Verify that the media channel has an audio source, and the stream isn't
348 // muted.
349 EXPECT_TRUE(voice_media_channel()->HasSource(ssrc));
350 EXPECT_FALSE(voice_media_channel()->IsStreamMuted(ssrc));
351 }
352
VerifyVideoChannelInput()353 void VerifyVideoChannelInput() { VerifyVideoChannelInput(kVideoSsrc); }
354
VerifyVideoChannelInput(uint32_t ssrc)355 void VerifyVideoChannelInput(uint32_t ssrc) {
356 // Verify that the media channel has a video source,
357 EXPECT_TRUE(video_media_channel_->HasSource(ssrc));
358 }
359
VerifyVoiceChannelNoInput()360 void VerifyVoiceChannelNoInput() { VerifyVoiceChannelNoInput(kAudioSsrc); }
361
VerifyVoiceChannelNoInput(uint32_t ssrc)362 void VerifyVoiceChannelNoInput(uint32_t ssrc) {
363 // Verify that the media channel's source is reset.
364 EXPECT_FALSE(voice_media_channel()->HasSource(ssrc));
365 }
366
VerifyVideoChannelNoInput()367 void VerifyVideoChannelNoInput() { VerifyVideoChannelNoInput(kVideoSsrc); }
368
VerifyVideoChannelNoInput(uint32_t ssrc)369 void VerifyVideoChannelNoInput(uint32_t ssrc) {
370 // Verify that the media channel's source is reset.
371 EXPECT_FALSE(video_media_channel_->HasSource(ssrc));
372 }
373
VerifyVoiceChannelOutput()374 void VerifyVoiceChannelOutput() {
375 // Verify that the volume is initialized to 1.
376 double volume;
377 EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
378 EXPECT_EQ(1, volume);
379 }
380
VerifyVideoChannelOutput()381 void VerifyVideoChannelOutput() {
382 // Verify that the media channel has a sink.
383 EXPECT_TRUE(video_media_channel_->HasSink(kVideoSsrc));
384 }
385
VerifyVoiceChannelNoOutput()386 void VerifyVoiceChannelNoOutput() {
387 // Verify that the volume is reset to 0.
388 double volume;
389 EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
390 EXPECT_EQ(0, volume);
391 }
392
VerifyVideoChannelNoOutput()393 void VerifyVideoChannelNoOutput() {
394 // Verify that the media channel's sink is reset.
395 EXPECT_FALSE(video_media_channel_->HasSink(kVideoSsrc));
396 }
397
398 // Verifies that the encoding layers contain the specified RIDs.
VerifyEncodingLayers(const VideoRtpSender & sender,const std::vector<std::string> & rids)399 bool VerifyEncodingLayers(const VideoRtpSender& sender,
400 const std::vector<std::string>& rids) {
401 bool has_failure = HasFailure();
402 RtpParameters parameters = sender.GetParameters();
403 std::vector<std::string> encoding_rids;
404 absl::c_transform(
405 parameters.encodings, std::back_inserter(encoding_rids),
406 [](const RtpEncodingParameters& encoding) { return encoding.rid; });
407 EXPECT_THAT(rids, ContainerEq(encoding_rids));
408 return has_failure || !HasFailure();
409 }
410
411 // Runs a test for disabling the encoding layers on the specified sender.
RunDisableEncodingLayersTest(const std::vector<std::string> & all_layers,const std::vector<std::string> & disabled_layers,VideoRtpSender * sender)412 void RunDisableEncodingLayersTest(
413 const std::vector<std::string>& all_layers,
414 const std::vector<std::string>& disabled_layers,
415 VideoRtpSender* sender) {
416 std::vector<std::string> expected;
417 absl::c_copy_if(all_layers, std::back_inserter(expected),
418 [&disabled_layers](const std::string& rid) {
419 return !absl::c_linear_search(disabled_layers, rid);
420 });
421
422 EXPECT_TRUE(VerifyEncodingLayers(*sender, all_layers));
423 sender->DisableEncodingLayers(disabled_layers);
424 EXPECT_TRUE(VerifyEncodingLayers(*sender, expected));
425 }
426
427 // Runs a test for setting an encoding layer as inactive.
428 // This test assumes that some layers have already been disabled.
RunSetLastLayerAsInactiveTest(VideoRtpSender * sender)429 void RunSetLastLayerAsInactiveTest(VideoRtpSender* sender) {
430 auto parameters = sender->GetParameters();
431 if (parameters.encodings.size() == 0) {
432 return;
433 }
434
435 RtpEncodingParameters& encoding = parameters.encodings.back();
436 auto rid = encoding.rid;
437 EXPECT_TRUE(encoding.active);
438 encoding.active = false;
439 auto error = sender->SetParameters(parameters);
440 ASSERT_TRUE(error.ok());
441 parameters = sender->GetParameters();
442 RtpEncodingParameters& result_encoding = parameters.encodings.back();
443 EXPECT_EQ(rid, result_encoding.rid);
444 EXPECT_FALSE(result_encoding.active);
445 }
446
447 // Runs a test for disabling the encoding layers on a sender without a media
448 // channel.
RunDisableSimulcastLayersWithoutMediaEngineTest(const std::vector<std::string> & all_layers,const std::vector<std::string> & disabled_layers)449 void RunDisableSimulcastLayersWithoutMediaEngineTest(
450 const std::vector<std::string>& all_layers,
451 const std::vector<std::string>& disabled_layers) {
452 auto sender = VideoRtpSender::Create(rtc::Thread::Current(), "1", nullptr);
453 RtpParameters parameters;
454 parameters.encodings.resize(all_layers.size());
455 for (size_t i = 0; i < all_layers.size(); ++i) {
456 parameters.encodings[i].rid = all_layers[i];
457 }
458 sender->set_init_send_encodings(parameters.encodings);
459 RunDisableEncodingLayersTest(all_layers, disabled_layers, sender.get());
460 RunSetLastLayerAsInactiveTest(sender.get());
461 }
462
463 // Runs a test for disabling the encoding layers on a sender with a media
464 // channel.
RunDisableSimulcastLayersWithMediaEngineTest(const std::vector<std::string> & all_layers,const std::vector<std::string> & disabled_layers)465 void RunDisableSimulcastLayersWithMediaEngineTest(
466 const std::vector<std::string>& all_layers,
467 const std::vector<std::string>& disabled_layers) {
468 uint32_t ssrc = CreateVideoRtpSenderWithSimulcast(all_layers);
469 RunDisableEncodingLayersTest(all_layers, disabled_layers,
470 video_rtp_sender_.get());
471
472 auto channel_parameters = video_media_channel_->GetRtpSendParameters(ssrc);
473 ASSERT_EQ(channel_parameters.encodings.size(), all_layers.size());
474 for (size_t i = 0; i < all_layers.size(); ++i) {
475 EXPECT_EQ(all_layers[i], channel_parameters.encodings[i].rid);
476 bool is_active = !absl::c_linear_search(disabled_layers, all_layers[i]);
477 EXPECT_EQ(is_active, channel_parameters.encodings[i].active);
478 }
479
480 RunSetLastLayerAsInactiveTest(video_rtp_sender_.get());
481 }
482
483 // Check that minimum Jitter Buffer delay is propagated to the underlying
484 // `media_channel`.
VerifyRtpReceiverDelayBehaviour(cricket::Delayable * media_channel,RtpReceiverInterface * receiver,uint32_t ssrc)485 void VerifyRtpReceiverDelayBehaviour(cricket::Delayable* media_channel,
486 RtpReceiverInterface* receiver,
487 uint32_t ssrc) {
488 receiver->SetJitterBufferMinimumDelay(/*delay_seconds=*/0.5);
489 absl::optional<int> delay_ms =
490 media_channel->GetBaseMinimumPlayoutDelayMs(ssrc); // In milliseconds.
491 EXPECT_DOUBLE_EQ(0.5, delay_ms.value_or(0) / 1000.0);
492 }
493
494 protected:
video_media_channel()495 cricket::FakeVideoMediaChannel* video_media_channel() {
496 return video_media_channel_.get();
497 }
voice_media_channel()498 cricket::FakeVoiceMediaChannel* voice_media_channel() {
499 return voice_media_channel_.get();
500 }
501
502 test::RunLoop run_loop_;
503 rtc::Thread* const network_thread_;
504 rtc::Thread* const worker_thread_;
505 webrtc::RtcEventLogNull event_log_;
506 // The `rtp_dtls_transport_` and `rtp_transport_` should be destroyed after
507 // the `channel_manager`.
508 std::unique_ptr<cricket::DtlsTransportInternal> rtp_dtls_transport_;
509 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport_;
510 std::unique_ptr<webrtc::VideoBitrateAllocatorFactory>
511 video_bitrate_allocator_factory_;
512 std::unique_ptr<cricket::FakeMediaEngine> media_engine_;
513 rtc::UniqueRandomIdGenerator ssrc_generator_;
514 cricket::FakeCall fake_call_;
515 std::unique_ptr<cricket::FakeVoiceMediaChannel> voice_media_channel_;
516 std::unique_ptr<cricket::FakeVideoMediaChannel> video_media_channel_;
517 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
518 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
519 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
520 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
521 rtc::scoped_refptr<MediaStreamInterface> local_stream_;
522 rtc::scoped_refptr<VideoTrackInterface> video_track_;
523 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
524 webrtc::test::ScopedKeyValueConfig field_trials_;
525 };
526
527 // Test that `voice_channel_` is updated when an audio track is associated
528 // and disassociated with an AudioRtpSender.
TEST_F(RtpSenderReceiverTest,AddAndDestroyAudioRtpSender)529 TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
530 CreateAudioRtpSender();
531 DestroyAudioRtpSender();
532 }
533
534 // Test that `video_channel_` is updated when a video track is associated and
535 // disassociated with a VideoRtpSender.
TEST_F(RtpSenderReceiverTest,AddAndDestroyVideoRtpSender)536 TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
537 CreateVideoRtpSender();
538 DestroyVideoRtpSender();
539 }
540
541 // Test that `voice_channel_` is updated when a remote audio track is
542 // associated and disassociated with an AudioRtpReceiver.
TEST_F(RtpSenderReceiverTest,AddAndDestroyAudioRtpReceiver)543 TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
544 CreateAudioRtpReceiver();
545 DestroyAudioRtpReceiver();
546 }
547
548 // Test that `video_channel_` is updated when a remote video track is
549 // associated and disassociated with a VideoRtpReceiver.
TEST_F(RtpSenderReceiverTest,AddAndDestroyVideoRtpReceiver)550 TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
551 CreateVideoRtpReceiver();
552 DestroyVideoRtpReceiver();
553 }
554
TEST_F(RtpSenderReceiverTest,AddAndDestroyAudioRtpReceiverWithStreams)555 TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiverWithStreams) {
556 CreateAudioRtpReceiver({local_stream_});
557 DestroyAudioRtpReceiver();
558 }
559
TEST_F(RtpSenderReceiverTest,AddAndDestroyVideoRtpReceiverWithStreams)560 TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiverWithStreams) {
561 CreateVideoRtpReceiver({local_stream_});
562 DestroyVideoRtpReceiver();
563 }
564
565 // Test that the AudioRtpSender applies options from the local audio source.
TEST_F(RtpSenderReceiverTest,LocalAudioSourceOptionsApplied)566 TEST_F(RtpSenderReceiverTest, LocalAudioSourceOptionsApplied) {
567 cricket::AudioOptions options;
568 options.echo_cancellation = true;
569 auto source = LocalAudioSource::Create(&options);
570 CreateAudioRtpSender(source);
571
572 EXPECT_EQ(true, voice_media_channel()->options().echo_cancellation);
573
574 DestroyAudioRtpSender();
575 }
576
577 // Test that the stream is muted when the track is disabled, and unmuted when
578 // the track is enabled.
TEST_F(RtpSenderReceiverTest,LocalAudioTrackDisable)579 TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) {
580 CreateAudioRtpSender();
581
582 audio_track_->set_enabled(false);
583 EXPECT_TRUE(voice_media_channel()->IsStreamMuted(kAudioSsrc));
584
585 audio_track_->set_enabled(true);
586 EXPECT_FALSE(voice_media_channel()->IsStreamMuted(kAudioSsrc));
587
588 DestroyAudioRtpSender();
589 }
590
591 // Test that the volume is set to 0 when the track is disabled, and back to
592 // 1 when the track is enabled.
TEST_F(RtpSenderReceiverTest,RemoteAudioTrackDisable)593 TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
594 CreateAudioRtpReceiver();
595
596 double volume;
597 EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
598 EXPECT_EQ(1, volume);
599
600 // Handling of enable/disable is applied asynchronously.
601 audio_track_->set_enabled(false);
602 run_loop_.Flush();
603
604 EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
605 EXPECT_EQ(0, volume);
606
607 audio_track_->set_enabled(true);
608 run_loop_.Flush();
609 EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
610 EXPECT_EQ(1, volume);
611
612 DestroyAudioRtpReceiver();
613 }
614
615 // Currently no action is taken when a remote video track is disabled or
616 // enabled, so there's nothing to test here, other than what is normally
617 // verified in DestroyVideoRtpSender.
TEST_F(RtpSenderReceiverTest,LocalVideoTrackDisable)618 TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
619 CreateVideoRtpSender();
620
621 video_track_->set_enabled(false);
622 video_track_->set_enabled(true);
623
624 DestroyVideoRtpSender();
625 }
626
627 // Test that the state of the video track created by the VideoRtpReceiver is
628 // updated when the receiver is destroyed.
TEST_F(RtpSenderReceiverTest,RemoteVideoTrackState)629 TEST_F(RtpSenderReceiverTest, RemoteVideoTrackState) {
630 CreateVideoRtpReceiver();
631
632 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track_->state());
633 EXPECT_EQ(webrtc::MediaSourceInterface::kLive,
634 video_track_->GetSource()->state());
635
636 DestroyVideoRtpReceiver();
637
638 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track_->state());
639 EXPECT_EQ(webrtc::MediaSourceInterface::kEnded,
640 video_track_->GetSource()->state());
641 DestroyVideoRtpReceiver();
642 }
643
644 // Currently no action is taken when a remote video track is disabled or
645 // enabled, so there's nothing to test here, other than what is normally
646 // verified in DestroyVideoRtpReceiver.
TEST_F(RtpSenderReceiverTest,RemoteVideoTrackDisable)647 TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
648 CreateVideoRtpReceiver();
649
650 video_track_->set_enabled(false);
651 video_track_->set_enabled(true);
652
653 DestroyVideoRtpReceiver();
654 }
655
656 // Test that the AudioRtpReceiver applies volume changes from the track source
657 // to the media channel.
TEST_F(RtpSenderReceiverTest,RemoteAudioTrackSetVolume)658 TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
659 CreateAudioRtpReceiver();
660
661 double volume;
662 audio_track_->GetSource()->SetVolume(0.5);
663 run_loop_.Flush();
664 EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
665 EXPECT_EQ(0.5, volume);
666
667 // Disable the audio track, this should prevent setting the volume.
668 audio_track_->set_enabled(false);
669 RTC_DCHECK_EQ(worker_thread_, run_loop_.task_queue());
670 run_loop_.Flush();
671 audio_track_->GetSource()->SetVolume(0.8);
672 EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
673 EXPECT_EQ(0, volume);
674
675 // When the track is enabled, the previously set volume should take effect.
676 audio_track_->set_enabled(true);
677 run_loop_.Flush();
678 EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
679 EXPECT_EQ(0.8, volume);
680
681 // Try changing volume one more time.
682 audio_track_->GetSource()->SetVolume(0.9);
683 run_loop_.Flush();
684 EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
685 EXPECT_EQ(0.9, volume);
686
687 DestroyAudioRtpReceiver();
688 }
689
TEST_F(RtpSenderReceiverTest,AudioRtpReceiverDelay)690 TEST_F(RtpSenderReceiverTest, AudioRtpReceiverDelay) {
691 CreateAudioRtpReceiver();
692 VerifyRtpReceiverDelayBehaviour(voice_media_channel(),
693 audio_rtp_receiver_.get(), kAudioSsrc);
694 DestroyAudioRtpReceiver();
695 }
696
TEST_F(RtpSenderReceiverTest,VideoRtpReceiverDelay)697 TEST_F(RtpSenderReceiverTest, VideoRtpReceiverDelay) {
698 CreateVideoRtpReceiver();
699 VerifyRtpReceiverDelayBehaviour(video_media_channel(),
700 video_rtp_receiver_.get(), kVideoSsrc);
701 DestroyVideoRtpReceiver();
702 }
703
704 // Test that the media channel isn't enabled for sending if the audio sender
705 // doesn't have both a track and SSRC.
TEST_F(RtpSenderReceiverTest,AudioSenderWithoutTrackAndSsrc)706 TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
707 CreateAudioRtpSenderWithNoTrack();
708 rtc::scoped_refptr<AudioTrackInterface> track =
709 AudioTrack::Create(kAudioTrackId, nullptr);
710
711 // Track but no SSRC.
712 EXPECT_TRUE(audio_rtp_sender_->SetTrack(track.get()));
713 VerifyVoiceChannelNoInput();
714
715 // SSRC but no track.
716 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
717 audio_rtp_sender_->SetSsrc(kAudioSsrc);
718 VerifyVoiceChannelNoInput();
719 }
720
721 // Test that the media channel isn't enabled for sending if the video sender
722 // doesn't have both a track and SSRC.
TEST_F(RtpSenderReceiverTest,VideoSenderWithoutTrackAndSsrc)723 TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
724 CreateVideoRtpSenderWithNoTrack();
725
726 // Track but no SSRC.
727 EXPECT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
728 VerifyVideoChannelNoInput();
729
730 // SSRC but no track.
731 EXPECT_TRUE(video_rtp_sender_->SetTrack(nullptr));
732 video_rtp_sender_->SetSsrc(kVideoSsrc);
733 VerifyVideoChannelNoInput();
734 }
735
736 // Test that the media channel is enabled for sending when the audio sender
737 // has a track and SSRC, when the SSRC is set first.
TEST_F(RtpSenderReceiverTest,AudioSenderEarlyWarmupSsrcThenTrack)738 TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
739 CreateAudioRtpSenderWithNoTrack();
740 rtc::scoped_refptr<AudioTrackInterface> track =
741 AudioTrack::Create(kAudioTrackId, nullptr);
742 audio_rtp_sender_->SetSsrc(kAudioSsrc);
743 audio_rtp_sender_->SetTrack(track.get());
744 VerifyVoiceChannelInput();
745
746 DestroyAudioRtpSender();
747 }
748
749 // Test that the media channel is enabled for sending when the audio sender
750 // has a track and SSRC, when the SSRC is set last.
TEST_F(RtpSenderReceiverTest,AudioSenderEarlyWarmupTrackThenSsrc)751 TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
752 CreateAudioRtpSenderWithNoTrack();
753 rtc::scoped_refptr<AudioTrackInterface> track =
754 AudioTrack::Create(kAudioTrackId, nullptr);
755 audio_rtp_sender_->SetTrack(track.get());
756 audio_rtp_sender_->SetSsrc(kAudioSsrc);
757 VerifyVoiceChannelInput();
758
759 DestroyAudioRtpSender();
760 }
761
762 // Test that the media channel is enabled for sending when the video sender
763 // has a track and SSRC, when the SSRC is set first.
TEST_F(RtpSenderReceiverTest,VideoSenderEarlyWarmupSsrcThenTrack)764 TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
765 AddVideoTrack();
766 CreateVideoRtpSenderWithNoTrack();
767 video_rtp_sender_->SetSsrc(kVideoSsrc);
768 video_rtp_sender_->SetTrack(video_track_.get());
769 VerifyVideoChannelInput();
770
771 DestroyVideoRtpSender();
772 }
773
774 // Test that the media channel is enabled for sending when the video sender
775 // has a track and SSRC, when the SSRC is set last.
TEST_F(RtpSenderReceiverTest,VideoSenderEarlyWarmupTrackThenSsrc)776 TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
777 AddVideoTrack();
778 CreateVideoRtpSenderWithNoTrack();
779 video_rtp_sender_->SetTrack(video_track_.get());
780 video_rtp_sender_->SetSsrc(kVideoSsrc);
781 VerifyVideoChannelInput();
782
783 DestroyVideoRtpSender();
784 }
785
786 // Test that the media channel stops sending when the audio sender's SSRC is set
787 // to 0.
TEST_F(RtpSenderReceiverTest,AudioSenderSsrcSetToZero)788 TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
789 CreateAudioRtpSender();
790
791 audio_rtp_sender_->SetSsrc(0);
792 VerifyVoiceChannelNoInput();
793 }
794
795 // Test that the media channel stops sending when the video sender's SSRC is set
796 // to 0.
TEST_F(RtpSenderReceiverTest,VideoSenderSsrcSetToZero)797 TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
798 CreateAudioRtpSender();
799
800 audio_rtp_sender_->SetSsrc(0);
801 VerifyVideoChannelNoInput();
802 }
803
804 // Test that the media channel stops sending when the audio sender's track is
805 // set to null.
TEST_F(RtpSenderReceiverTest,AudioSenderTrackSetToNull)806 TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) {
807 CreateAudioRtpSender();
808
809 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
810 VerifyVoiceChannelNoInput();
811 }
812
813 // Test that the media channel stops sending when the video sender's track is
814 // set to null.
TEST_F(RtpSenderReceiverTest,VideoSenderTrackSetToNull)815 TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
816 CreateVideoRtpSender();
817
818 video_rtp_sender_->SetSsrc(0);
819 VerifyVideoChannelNoInput();
820 }
821
822 // Test that when the audio sender's SSRC is changed, the media channel stops
823 // sending with the old SSRC and starts sending with the new one.
TEST_F(RtpSenderReceiverTest,AudioSenderSsrcChanged)824 TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
825 CreateAudioRtpSender();
826
827 audio_rtp_sender_->SetSsrc(kAudioSsrc2);
828 VerifyVoiceChannelNoInput(kAudioSsrc);
829 VerifyVoiceChannelInput(kAudioSsrc2);
830
831 audio_rtp_sender_ = nullptr;
832 VerifyVoiceChannelNoInput(kAudioSsrc2);
833 }
834
835 // Test that when the audio sender's SSRC is changed, the media channel stops
836 // sending with the old SSRC and starts sending with the new one.
TEST_F(RtpSenderReceiverTest,VideoSenderSsrcChanged)837 TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) {
838 CreateVideoRtpSender();
839
840 video_rtp_sender_->SetSsrc(kVideoSsrc2);
841 VerifyVideoChannelNoInput(kVideoSsrc);
842 VerifyVideoChannelInput(kVideoSsrc2);
843
844 video_rtp_sender_ = nullptr;
845 VerifyVideoChannelNoInput(kVideoSsrc2);
846 }
847
TEST_F(RtpSenderReceiverTest,AudioSenderCanSetParameters)848 TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) {
849 CreateAudioRtpSender();
850
851 RtpParameters params = audio_rtp_sender_->GetParameters();
852 EXPECT_EQ(1u, params.encodings.size());
853 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
854
855 DestroyAudioRtpSender();
856 }
857
TEST_F(RtpSenderReceiverTest,AudioSenderCanSetParametersAsync)858 TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParametersAsync) {
859 CreateAudioRtpSender();
860
861 RtpParameters params = audio_rtp_sender_->GetParameters();
862 EXPECT_EQ(1u, params.encodings.size());
863 absl::optional<webrtc::RTCError> result;
864 audio_rtp_sender_->SetParametersAsync(
865 params, [&result](webrtc::RTCError error) { result = error; });
866 run_loop_.Flush();
867 EXPECT_TRUE(result->ok());
868
869 DestroyAudioRtpSender();
870 }
871
TEST_F(RtpSenderReceiverTest,AudioSenderCanSetParametersBeforeNegotiation)872 TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParametersBeforeNegotiation) {
873 audio_rtp_sender_ =
874 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
875
876 RtpParameters params = audio_rtp_sender_->GetParameters();
877 ASSERT_EQ(1u, params.encodings.size());
878 params.encodings[0].max_bitrate_bps = 90000;
879 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
880
881 params = audio_rtp_sender_->GetParameters();
882 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
883 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
884
885 DestroyAudioRtpSender();
886 }
887
TEST_F(RtpSenderReceiverTest,AudioSenderCanSetParametersAsyncBeforeNegotiation)888 TEST_F(RtpSenderReceiverTest,
889 AudioSenderCanSetParametersAsyncBeforeNegotiation) {
890 audio_rtp_sender_ =
891 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
892
893 absl::optional<webrtc::RTCError> result;
894 RtpParameters params = audio_rtp_sender_->GetParameters();
895 ASSERT_EQ(1u, params.encodings.size());
896 params.encodings[0].max_bitrate_bps = 90000;
897
898 audio_rtp_sender_->SetParametersAsync(
899 params, [&result](webrtc::RTCError error) { result = error; });
900 run_loop_.Flush();
901 EXPECT_TRUE(result->ok());
902
903 params = audio_rtp_sender_->GetParameters();
904 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
905
906 audio_rtp_sender_->SetParametersAsync(
907 params, [&result](webrtc::RTCError error) { result = error; });
908 run_loop_.Flush();
909 EXPECT_TRUE(result->ok());
910
911 DestroyAudioRtpSender();
912 }
913
TEST_F(RtpSenderReceiverTest,AudioSenderInitParametersMovedAfterNegotiation)914 TEST_F(RtpSenderReceiverTest, AudioSenderInitParametersMovedAfterNegotiation) {
915 audio_track_ = AudioTrack::Create(kAudioTrackId, nullptr);
916 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
917
918 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
919 std::make_unique<MockSetStreamsObserver>();
920 audio_rtp_sender_ = AudioRtpSender::Create(
921 worker_thread_, audio_track_->id(), nullptr, set_streams_observer.get());
922 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_.get()));
923 EXPECT_CALL(*set_streams_observer, OnSetStreams());
924 audio_rtp_sender_->SetStreams({local_stream_->id()});
925
926 std::vector<RtpEncodingParameters> init_encodings(1);
927 init_encodings[0].max_bitrate_bps = 60000;
928 audio_rtp_sender_->set_init_send_encodings(init_encodings);
929
930 RtpParameters params = audio_rtp_sender_->GetParameters();
931 ASSERT_EQ(1u, params.encodings.size());
932 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
933
934 // Simulate the setLocalDescription call
935 std::vector<uint32_t> ssrcs(1, 1);
936 cricket::StreamParams stream_params =
937 cricket::CreateSimStreamParams("cname", ssrcs);
938 voice_media_channel()->AddSendStream(stream_params);
939 audio_rtp_sender_->SetMediaChannel(voice_media_channel());
940 audio_rtp_sender_->SetSsrc(1);
941
942 params = audio_rtp_sender_->GetParameters();
943 ASSERT_EQ(1u, params.encodings.size());
944 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
945
946 DestroyAudioRtpSender();
947 }
948
TEST_F(RtpSenderReceiverTest,AudioSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation)949 TEST_F(RtpSenderReceiverTest,
950 AudioSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
951 audio_rtp_sender_ =
952 AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
953
954 RtpParameters params;
955 RTCError result = audio_rtp_sender_->SetParameters(params);
956 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
957 DestroyAudioRtpSender();
958 }
959
TEST_F(RtpSenderReceiverTest,AudioSenderMustCallGetParametersBeforeSetParameters)960 TEST_F(RtpSenderReceiverTest,
961 AudioSenderMustCallGetParametersBeforeSetParameters) {
962 CreateAudioRtpSender();
963
964 RtpParameters params;
965 RTCError result = audio_rtp_sender_->SetParameters(params);
966 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
967
968 DestroyAudioRtpSender();
969 }
970
TEST_F(RtpSenderReceiverTest,AudioSenderSetParametersInvalidatesTransactionId)971 TEST_F(RtpSenderReceiverTest,
972 AudioSenderSetParametersInvalidatesTransactionId) {
973 CreateAudioRtpSender();
974
975 RtpParameters params = audio_rtp_sender_->GetParameters();
976 EXPECT_EQ(1u, params.encodings.size());
977 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
978 RTCError result = audio_rtp_sender_->SetParameters(params);
979 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
980
981 DestroyAudioRtpSender();
982 }
983
TEST_F(RtpSenderReceiverTest,AudioSenderSetParametersAsyncInvalidatesTransactionId)984 TEST_F(RtpSenderReceiverTest,
985 AudioSenderSetParametersAsyncInvalidatesTransactionId) {
986 CreateAudioRtpSender();
987
988 RtpParameters params = audio_rtp_sender_->GetParameters();
989 EXPECT_EQ(1u, params.encodings.size());
990 absl::optional<webrtc::RTCError> result;
991 audio_rtp_sender_->SetParametersAsync(
992 params, [&result](webrtc::RTCError error) { result = error; });
993 run_loop_.Flush();
994 EXPECT_TRUE(result->ok());
995 audio_rtp_sender_->SetParametersAsync(
996 params, [&result](webrtc::RTCError error) { result = error; });
997 run_loop_.Flush();
998 EXPECT_EQ(RTCErrorType::INVALID_STATE, result->type());
999
1000 DestroyAudioRtpSender();
1001 }
1002
TEST_F(RtpSenderReceiverTest,AudioSenderDetectTransactionIdModification)1003 TEST_F(RtpSenderReceiverTest, AudioSenderDetectTransactionIdModification) {
1004 CreateAudioRtpSender();
1005
1006 RtpParameters params = audio_rtp_sender_->GetParameters();
1007 params.transaction_id = "";
1008 RTCError result = audio_rtp_sender_->SetParameters(params);
1009 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1010
1011 DestroyAudioRtpSender();
1012 }
1013
TEST_F(RtpSenderReceiverTest,AudioSenderCheckTransactionIdRefresh)1014 TEST_F(RtpSenderReceiverTest, AudioSenderCheckTransactionIdRefresh) {
1015 CreateAudioRtpSender();
1016
1017 RtpParameters params = audio_rtp_sender_->GetParameters();
1018 EXPECT_NE(params.transaction_id.size(), 0U);
1019 auto saved_transaction_id = params.transaction_id;
1020 params = audio_rtp_sender_->GetParameters();
1021 EXPECT_NE(saved_transaction_id, params.transaction_id);
1022
1023 DestroyAudioRtpSender();
1024 }
1025
TEST_F(RtpSenderReceiverTest,AudioSenderSetParametersOldValueFail)1026 TEST_F(RtpSenderReceiverTest, AudioSenderSetParametersOldValueFail) {
1027 CreateAudioRtpSender();
1028
1029 RtpParameters params = audio_rtp_sender_->GetParameters();
1030 RtpParameters second_params = audio_rtp_sender_->GetParameters();
1031
1032 RTCError result = audio_rtp_sender_->SetParameters(params);
1033 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1034 DestroyAudioRtpSender();
1035 }
1036
TEST_F(RtpSenderReceiverTest,AudioSenderCantSetUnimplementedRtpParameters)1037 TEST_F(RtpSenderReceiverTest, AudioSenderCantSetUnimplementedRtpParameters) {
1038 CreateAudioRtpSender();
1039 RtpParameters params = audio_rtp_sender_->GetParameters();
1040 EXPECT_EQ(1u, params.encodings.size());
1041
1042 // Unimplemented RtpParameters: mid
1043 params.mid = "dummy_mid";
1044 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1045 audio_rtp_sender_->SetParameters(params).type());
1046 params = audio_rtp_sender_->GetParameters();
1047
1048 DestroyAudioRtpSender();
1049 }
1050
TEST_F(RtpSenderReceiverTest,SetAudioMaxSendBitrate)1051 TEST_F(RtpSenderReceiverTest, SetAudioMaxSendBitrate) {
1052 CreateAudioRtpSender();
1053
1054 EXPECT_EQ(-1, voice_media_channel()->max_bps());
1055 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
1056 EXPECT_EQ(1U, params.encodings.size());
1057 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
1058 params.encodings[0].max_bitrate_bps = 1000;
1059 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
1060
1061 // Read back the parameters and verify they have been changed.
1062 params = audio_rtp_sender_->GetParameters();
1063 EXPECT_EQ(1U, params.encodings.size());
1064 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
1065
1066 // Verify that the audio channel received the new parameters.
1067 params = voice_media_channel()->GetRtpSendParameters(kAudioSsrc);
1068 EXPECT_EQ(1U, params.encodings.size());
1069 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
1070
1071 // Verify that the global bitrate limit has not been changed.
1072 EXPECT_EQ(-1, voice_media_channel()->max_bps());
1073
1074 DestroyAudioRtpSender();
1075 }
1076
TEST_F(RtpSenderReceiverTest,SetAudioBitratePriority)1077 TEST_F(RtpSenderReceiverTest, SetAudioBitratePriority) {
1078 CreateAudioRtpSender();
1079
1080 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
1081 EXPECT_EQ(1U, params.encodings.size());
1082 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1083 params.encodings[0].bitrate_priority);
1084 double new_bitrate_priority = 2.0;
1085 params.encodings[0].bitrate_priority = new_bitrate_priority;
1086 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
1087
1088 params = audio_rtp_sender_->GetParameters();
1089 EXPECT_EQ(1U, params.encodings.size());
1090 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1091
1092 params = voice_media_channel()->GetRtpSendParameters(kAudioSsrc);
1093 EXPECT_EQ(1U, params.encodings.size());
1094 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1095
1096 DestroyAudioRtpSender();
1097 }
1098
TEST_F(RtpSenderReceiverTest,VideoSenderCanSetParameters)1099 TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) {
1100 CreateVideoRtpSender();
1101
1102 RtpParameters params = video_rtp_sender_->GetParameters();
1103 EXPECT_EQ(1u, params.encodings.size());
1104 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1105
1106 DestroyVideoRtpSender();
1107 }
1108
TEST_F(RtpSenderReceiverTest,VideoSenderCanSetParametersAsync)1109 TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParametersAsync) {
1110 CreateVideoRtpSender();
1111
1112 RtpParameters params = video_rtp_sender_->GetParameters();
1113 EXPECT_EQ(1u, params.encodings.size());
1114 absl::optional<webrtc::RTCError> result;
1115 video_rtp_sender_->SetParametersAsync(
1116 params, [&result](webrtc::RTCError error) { result = error; });
1117 run_loop_.Flush();
1118 EXPECT_TRUE(result->ok());
1119
1120 DestroyVideoRtpSender();
1121 }
1122
TEST_F(RtpSenderReceiverTest,VideoSenderCanSetParametersBeforeNegotiation)1123 TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParametersBeforeNegotiation) {
1124 video_rtp_sender_ =
1125 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
1126
1127 RtpParameters params = video_rtp_sender_->GetParameters();
1128 ASSERT_EQ(1u, params.encodings.size());
1129 params.encodings[0].max_bitrate_bps = 90000;
1130 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1131
1132 params = video_rtp_sender_->GetParameters();
1133 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1134 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
1135
1136 DestroyVideoRtpSender();
1137 }
1138
TEST_F(RtpSenderReceiverTest,VideoSenderCanSetParametersAsyncBeforeNegotiation)1139 TEST_F(RtpSenderReceiverTest,
1140 VideoSenderCanSetParametersAsyncBeforeNegotiation) {
1141 video_rtp_sender_ =
1142 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
1143
1144 absl::optional<webrtc::RTCError> result;
1145 RtpParameters params = video_rtp_sender_->GetParameters();
1146 ASSERT_EQ(1u, params.encodings.size());
1147 params.encodings[0].max_bitrate_bps = 90000;
1148 video_rtp_sender_->SetParametersAsync(
1149 params, [&result](webrtc::RTCError error) { result = error; });
1150 run_loop_.Flush();
1151 EXPECT_TRUE(result->ok());
1152
1153 params = video_rtp_sender_->GetParameters();
1154 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
1155 video_rtp_sender_->SetParametersAsync(
1156 params, [&result](webrtc::RTCError error) { result = error; });
1157 run_loop_.Flush();
1158 EXPECT_TRUE(result->ok());
1159
1160 DestroyVideoRtpSender();
1161 }
1162
TEST_F(RtpSenderReceiverTest,VideoSenderInitParametersMovedAfterNegotiation)1163 TEST_F(RtpSenderReceiverTest, VideoSenderInitParametersMovedAfterNegotiation) {
1164 AddVideoTrack(false);
1165
1166 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
1167 std::make_unique<MockSetStreamsObserver>();
1168 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1169 set_streams_observer.get());
1170 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
1171 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1172 video_rtp_sender_->SetStreams({local_stream_->id()});
1173
1174 std::vector<RtpEncodingParameters> init_encodings(2);
1175 init_encodings[0].max_bitrate_bps = 60000;
1176 init_encodings[1].max_bitrate_bps = 900000;
1177 video_rtp_sender_->set_init_send_encodings(init_encodings);
1178
1179 RtpParameters params = video_rtp_sender_->GetParameters();
1180 ASSERT_EQ(2u, params.encodings.size());
1181 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1182 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
1183
1184 // Simulate the setLocalDescription call
1185 std::vector<uint32_t> ssrcs;
1186 ssrcs.reserve(2);
1187 for (int i = 0; i < 2; ++i)
1188 ssrcs.push_back(kVideoSsrcSimulcast + i);
1189 cricket::StreamParams stream_params =
1190 cricket::CreateSimStreamParams("cname", ssrcs);
1191 video_media_channel()->AddSendStream(stream_params);
1192 video_rtp_sender_->SetMediaChannel(video_media_channel());
1193 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
1194
1195 params = video_rtp_sender_->GetParameters();
1196 ASSERT_EQ(2u, params.encodings.size());
1197 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1198 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
1199
1200 DestroyVideoRtpSender();
1201 }
1202
TEST_F(RtpSenderReceiverTest,VideoSenderInitParametersMovedAfterManualSimulcastAndNegotiation)1203 TEST_F(RtpSenderReceiverTest,
1204 VideoSenderInitParametersMovedAfterManualSimulcastAndNegotiation) {
1205 AddVideoTrack(false);
1206
1207 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
1208 std::make_unique<MockSetStreamsObserver>();
1209 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1210 set_streams_observer.get());
1211 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
1212 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1213 video_rtp_sender_->SetStreams({local_stream_->id()});
1214
1215 std::vector<RtpEncodingParameters> init_encodings(1);
1216 init_encodings[0].max_bitrate_bps = 60000;
1217 video_rtp_sender_->set_init_send_encodings(init_encodings);
1218
1219 RtpParameters params = video_rtp_sender_->GetParameters();
1220 ASSERT_EQ(1u, params.encodings.size());
1221 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1222
1223 // Simulate the setLocalDescription call as if the user used SDP munging
1224 // to enable simulcast
1225 std::vector<uint32_t> ssrcs;
1226 ssrcs.reserve(2);
1227 for (int i = 0; i < 2; ++i)
1228 ssrcs.push_back(kVideoSsrcSimulcast + i);
1229 cricket::StreamParams stream_params =
1230 cricket::CreateSimStreamParams("cname", ssrcs);
1231 video_media_channel()->AddSendStream(stream_params);
1232 video_rtp_sender_->SetMediaChannel(video_media_channel());
1233 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
1234
1235 params = video_rtp_sender_->GetParameters();
1236 ASSERT_EQ(2u, params.encodings.size());
1237 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1238
1239 DestroyVideoRtpSender();
1240 }
1241
1242 #if GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
1243 using RtpSenderReceiverDeathTest = RtpSenderReceiverTest;
1244
TEST_F(RtpSenderReceiverDeathTest,VideoSenderManualRemoveSimulcastFailsDeathTest)1245 TEST_F(RtpSenderReceiverDeathTest,
1246 VideoSenderManualRemoveSimulcastFailsDeathTest) {
1247 AddVideoTrack(false);
1248
1249 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
1250 std::make_unique<MockSetStreamsObserver>();
1251 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1252 set_streams_observer.get());
1253 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
1254 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1255 video_rtp_sender_->SetStreams({local_stream_->id()});
1256
1257 std::vector<RtpEncodingParameters> init_encodings(2);
1258 init_encodings[0].max_bitrate_bps = 60000;
1259 init_encodings[1].max_bitrate_bps = 120000;
1260 video_rtp_sender_->set_init_send_encodings(init_encodings);
1261
1262 RtpParameters params = video_rtp_sender_->GetParameters();
1263 ASSERT_EQ(2u, params.encodings.size());
1264 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1265
1266 // Simulate the setLocalDescription call as if the user used SDP munging
1267 // to disable simulcast.
1268 std::vector<uint32_t> ssrcs;
1269 ssrcs.reserve(2);
1270 for (int i = 0; i < 2; ++i)
1271 ssrcs.push_back(kVideoSsrcSimulcast + i);
1272 cricket::StreamParams stream_params =
1273 cricket::StreamParams::CreateLegacy(kVideoSsrc);
1274 video_media_channel()->AddSendStream(stream_params);
1275 video_rtp_sender_->SetMediaChannel(video_media_channel());
1276 EXPECT_DEATH(video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast), "");
1277 }
1278 #endif
1279
TEST_F(RtpSenderReceiverTest,VideoSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation)1280 TEST_F(RtpSenderReceiverTest,
1281 VideoSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
1282 video_rtp_sender_ =
1283 VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
1284
1285 RtpParameters params;
1286 RTCError result = video_rtp_sender_->SetParameters(params);
1287 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1288 DestroyVideoRtpSender();
1289 }
1290
TEST_F(RtpSenderReceiverTest,VideoSenderMustCallGetParametersBeforeSetParameters)1291 TEST_F(RtpSenderReceiverTest,
1292 VideoSenderMustCallGetParametersBeforeSetParameters) {
1293 CreateVideoRtpSender();
1294
1295 RtpParameters params;
1296 RTCError result = video_rtp_sender_->SetParameters(params);
1297 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1298
1299 DestroyVideoRtpSender();
1300 }
1301
TEST_F(RtpSenderReceiverTest,VideoSenderSetParametersInvalidatesTransactionId)1302 TEST_F(RtpSenderReceiverTest,
1303 VideoSenderSetParametersInvalidatesTransactionId) {
1304 CreateVideoRtpSender();
1305
1306 RtpParameters params = video_rtp_sender_->GetParameters();
1307 EXPECT_EQ(1u, params.encodings.size());
1308 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1309 RTCError result = video_rtp_sender_->SetParameters(params);
1310 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1311
1312 DestroyVideoRtpSender();
1313 }
1314
TEST_F(RtpSenderReceiverTest,VideoSenderSetParametersAsyncInvalidatesTransactionId)1315 TEST_F(RtpSenderReceiverTest,
1316 VideoSenderSetParametersAsyncInvalidatesTransactionId) {
1317 CreateVideoRtpSender();
1318
1319 RtpParameters params = video_rtp_sender_->GetParameters();
1320 EXPECT_EQ(1u, params.encodings.size());
1321 absl::optional<webrtc::RTCError> result;
1322 video_rtp_sender_->SetParametersAsync(
1323 params, [&result](webrtc::RTCError error) { result = error; });
1324 run_loop_.Flush();
1325 EXPECT_TRUE(result->ok());
1326 video_rtp_sender_->SetParametersAsync(
1327 params, [&result](webrtc::RTCError error) { result = error; });
1328 run_loop_.Flush();
1329 EXPECT_EQ(RTCErrorType::INVALID_STATE, result->type());
1330
1331 DestroyVideoRtpSender();
1332 }
1333
TEST_F(RtpSenderReceiverTest,VideoSenderDetectTransactionIdModification)1334 TEST_F(RtpSenderReceiverTest, VideoSenderDetectTransactionIdModification) {
1335 CreateVideoRtpSender();
1336
1337 RtpParameters params = video_rtp_sender_->GetParameters();
1338 params.transaction_id = "";
1339 RTCError result = video_rtp_sender_->SetParameters(params);
1340 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1341
1342 DestroyVideoRtpSender();
1343 }
1344
TEST_F(RtpSenderReceiverTest,VideoSenderCheckTransactionIdRefresh)1345 TEST_F(RtpSenderReceiverTest, VideoSenderCheckTransactionIdRefresh) {
1346 CreateVideoRtpSender();
1347
1348 RtpParameters params = video_rtp_sender_->GetParameters();
1349 EXPECT_NE(params.transaction_id.size(), 0U);
1350 auto saved_transaction_id = params.transaction_id;
1351 params = video_rtp_sender_->GetParameters();
1352 EXPECT_NE(saved_transaction_id, params.transaction_id);
1353
1354 DestroyVideoRtpSender();
1355 }
1356
TEST_F(RtpSenderReceiverTest,VideoSenderSetParametersOldValueFail)1357 TEST_F(RtpSenderReceiverTest, VideoSenderSetParametersOldValueFail) {
1358 CreateVideoRtpSender();
1359
1360 RtpParameters params = video_rtp_sender_->GetParameters();
1361 RtpParameters second_params = video_rtp_sender_->GetParameters();
1362
1363 RTCError result = video_rtp_sender_->SetParameters(params);
1364 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1365
1366 DestroyVideoRtpSender();
1367 }
1368
TEST_F(RtpSenderReceiverTest,VideoSenderCantSetUnimplementedRtpParameters)1369 TEST_F(RtpSenderReceiverTest, VideoSenderCantSetUnimplementedRtpParameters) {
1370 CreateVideoRtpSender();
1371 RtpParameters params = video_rtp_sender_->GetParameters();
1372 EXPECT_EQ(1u, params.encodings.size());
1373
1374 // Unimplemented RtpParameters: mid
1375 params.mid = "dummy_mid";
1376 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1377 video_rtp_sender_->SetParameters(params).type());
1378 params = video_rtp_sender_->GetParameters();
1379
1380 DestroyVideoRtpSender();
1381 }
1382
TEST_F(RtpSenderReceiverTest,VideoSenderCanSetScaleResolutionDownBy)1383 TEST_F(RtpSenderReceiverTest, VideoSenderCanSetScaleResolutionDownBy) {
1384 CreateVideoRtpSender();
1385
1386 RtpParameters params = video_rtp_sender_->GetParameters();
1387 params.encodings[0].scale_resolution_down_by = 2;
1388
1389 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1390 params = video_rtp_sender_->GetParameters();
1391 EXPECT_EQ(2, params.encodings[0].scale_resolution_down_by);
1392
1393 DestroyVideoRtpSender();
1394 }
1395
TEST_F(RtpSenderReceiverTest,VideoSenderDetectInvalidScaleResolutionDownBy)1396 TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidScaleResolutionDownBy) {
1397 CreateVideoRtpSender();
1398
1399 RtpParameters params = video_rtp_sender_->GetParameters();
1400 params.encodings[0].scale_resolution_down_by = 0.5;
1401 RTCError result = video_rtp_sender_->SetParameters(params);
1402 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1403
1404 DestroyVideoRtpSender();
1405 }
1406
TEST_F(RtpSenderReceiverTest,VideoSenderCanSetNumTemporalLayers)1407 TEST_F(RtpSenderReceiverTest, VideoSenderCanSetNumTemporalLayers) {
1408 CreateVideoRtpSender();
1409
1410 RtpParameters params = video_rtp_sender_->GetParameters();
1411 params.encodings[0].num_temporal_layers = 2;
1412
1413 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1414 params = video_rtp_sender_->GetParameters();
1415 EXPECT_EQ(2, params.encodings[0].num_temporal_layers);
1416
1417 DestroyVideoRtpSender();
1418 }
1419
TEST_F(RtpSenderReceiverTest,VideoSenderDetectInvalidNumTemporalLayers)1420 TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidNumTemporalLayers) {
1421 CreateVideoRtpSender();
1422
1423 RtpParameters params = video_rtp_sender_->GetParameters();
1424 params.encodings[0].num_temporal_layers = webrtc::kMaxTemporalStreams + 1;
1425 RTCError result = video_rtp_sender_->SetParameters(params);
1426 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1427
1428 DestroyVideoRtpSender();
1429 }
1430
TEST_F(RtpSenderReceiverTest,VideoSenderCanSetMaxFramerate)1431 TEST_F(RtpSenderReceiverTest, VideoSenderCanSetMaxFramerate) {
1432 CreateVideoRtpSender();
1433
1434 RtpParameters params = video_rtp_sender_->GetParameters();
1435 params.encodings[0].max_framerate = 20;
1436
1437 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1438 params = video_rtp_sender_->GetParameters();
1439 EXPECT_EQ(20., params.encodings[0].max_framerate);
1440
1441 DestroyVideoRtpSender();
1442 }
1443
TEST_F(RtpSenderReceiverTest,VideoSenderCanSetMaxFramerateZero)1444 TEST_F(RtpSenderReceiverTest, VideoSenderCanSetMaxFramerateZero) {
1445 CreateVideoRtpSender();
1446
1447 RtpParameters params = video_rtp_sender_->GetParameters();
1448 params.encodings[0].max_framerate = 0.;
1449
1450 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1451 params = video_rtp_sender_->GetParameters();
1452 EXPECT_EQ(0., params.encodings[0].max_framerate);
1453
1454 DestroyVideoRtpSender();
1455 }
1456
TEST_F(RtpSenderReceiverTest,VideoSenderDetectInvalidMaxFramerate)1457 TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidMaxFramerate) {
1458 CreateVideoRtpSender();
1459
1460 RtpParameters params = video_rtp_sender_->GetParameters();
1461 params.encodings[0].max_framerate = -5.;
1462 RTCError result = video_rtp_sender_->SetParameters(params);
1463 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1464
1465 DestroyVideoRtpSender();
1466 }
1467
1468 // A video sender can have multiple simulcast layers, in which case it will
1469 // contain multiple RtpEncodingParameters. This tests that if this is the case
1470 // (simulcast), then we can't set the bitrate_priority, or max_bitrate_bps
1471 // for any encodings besides at index 0, because these are both implemented
1472 // "per-sender."
TEST_F(RtpSenderReceiverTest,VideoSenderCantSetPerSenderEncodingParameters)1473 TEST_F(RtpSenderReceiverTest, VideoSenderCantSetPerSenderEncodingParameters) {
1474 // Add a simulcast specific send stream that contains 2 encoding parameters.
1475 CreateVideoRtpSenderWithSimulcast();
1476 RtpParameters params = video_rtp_sender_->GetParameters();
1477 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
1478
1479 params.encodings[1].bitrate_priority = 2.0;
1480 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1481 video_rtp_sender_->SetParameters(params).type());
1482 params = video_rtp_sender_->GetParameters();
1483
1484 DestroyVideoRtpSender();
1485 }
1486
TEST_F(RtpSenderReceiverTest,VideoSenderCantSetReadOnlyEncodingParameters)1487 TEST_F(RtpSenderReceiverTest, VideoSenderCantSetReadOnlyEncodingParameters) {
1488 // Add a simulcast specific send stream that contains 2 encoding parameters.
1489 CreateVideoRtpSenderWithSimulcast();
1490 RtpParameters params = video_rtp_sender_->GetParameters();
1491 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
1492
1493 for (size_t i = 0; i < params.encodings.size(); i++) {
1494 params.encodings[i].ssrc = 1337;
1495 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION,
1496 video_rtp_sender_->SetParameters(params).type());
1497 params = video_rtp_sender_->GetParameters();
1498 }
1499
1500 DestroyVideoRtpSender();
1501 }
1502
TEST_F(RtpSenderReceiverTest,SetVideoMinMaxSendBitrate)1503 TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrate) {
1504 CreateVideoRtpSender();
1505
1506 EXPECT_EQ(-1, video_media_channel()->max_bps());
1507 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
1508 EXPECT_EQ(1U, params.encodings.size());
1509 EXPECT_FALSE(params.encodings[0].min_bitrate_bps);
1510 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
1511 params.encodings[0].min_bitrate_bps = 100;
1512 params.encodings[0].max_bitrate_bps = 1000;
1513 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1514
1515 // Read back the parameters and verify they have been changed.
1516 params = video_rtp_sender_->GetParameters();
1517 EXPECT_EQ(1U, params.encodings.size());
1518 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
1519 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
1520
1521 // Verify that the video channel received the new parameters.
1522 params = video_media_channel()->GetRtpSendParameters(kVideoSsrc);
1523 EXPECT_EQ(1U, params.encodings.size());
1524 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
1525 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
1526
1527 // Verify that the global bitrate limit has not been changed.
1528 EXPECT_EQ(-1, video_media_channel()->max_bps());
1529
1530 DestroyVideoRtpSender();
1531 }
1532
TEST_F(RtpSenderReceiverTest,SetVideoMinMaxSendBitrateSimulcast)1533 TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrateSimulcast) {
1534 // Add a simulcast specific send stream that contains 2 encoding parameters.
1535 CreateVideoRtpSenderWithSimulcast();
1536
1537 RtpParameters params = video_rtp_sender_->GetParameters();
1538 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
1539 params.encodings[0].min_bitrate_bps = 100;
1540 params.encodings[0].max_bitrate_bps = 1000;
1541 params.encodings[1].min_bitrate_bps = 200;
1542 params.encodings[1].max_bitrate_bps = 2000;
1543 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1544
1545 // Verify that the video channel received the new parameters.
1546 params = video_media_channel()->GetRtpSendParameters(kVideoSsrcSimulcast);
1547 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
1548 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
1549 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
1550 EXPECT_EQ(200, params.encodings[1].min_bitrate_bps);
1551 EXPECT_EQ(2000, params.encodings[1].max_bitrate_bps);
1552
1553 DestroyVideoRtpSender();
1554 }
1555
TEST_F(RtpSenderReceiverTest,SetVideoBitratePriority)1556 TEST_F(RtpSenderReceiverTest, SetVideoBitratePriority) {
1557 CreateVideoRtpSender();
1558
1559 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
1560 EXPECT_EQ(1U, params.encodings.size());
1561 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1562 params.encodings[0].bitrate_priority);
1563 double new_bitrate_priority = 2.0;
1564 params.encodings[0].bitrate_priority = new_bitrate_priority;
1565 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1566
1567 params = video_rtp_sender_->GetParameters();
1568 EXPECT_EQ(1U, params.encodings.size());
1569 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1570
1571 params = video_media_channel()->GetRtpSendParameters(kVideoSsrc);
1572 EXPECT_EQ(1U, params.encodings.size());
1573 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1574
1575 DestroyVideoRtpSender();
1576 }
1577
TEST_F(RtpSenderReceiverTest,VideoReceiverCanGetParametersWithSimulcast)1578 TEST_F(RtpSenderReceiverTest, VideoReceiverCanGetParametersWithSimulcast) {
1579 CreateVideoRtpReceiverWithSimulcast({}, 2);
1580
1581 RtpParameters params = video_rtp_receiver_->GetParameters();
1582 EXPECT_EQ(2u, params.encodings.size());
1583
1584 DestroyVideoRtpReceiver();
1585 }
1586
TEST_F(RtpSenderReceiverTest,GenerateKeyFrameWithAudio)1587 TEST_F(RtpSenderReceiverTest, GenerateKeyFrameWithAudio) {
1588 CreateAudioRtpSender();
1589
1590 auto error = audio_rtp_sender_->GenerateKeyFrame({});
1591 EXPECT_FALSE(error.ok());
1592 EXPECT_EQ(error.type(), RTCErrorType::UNSUPPORTED_OPERATION);
1593
1594 DestroyAudioRtpSender();
1595 }
1596
TEST_F(RtpSenderReceiverTest,GenerateKeyFrameWithVideo)1597 TEST_F(RtpSenderReceiverTest, GenerateKeyFrameWithVideo) {
1598 CreateVideoRtpSenderWithSimulcast({"1", "2", "3"});
1599
1600 auto error = video_rtp_sender_->GenerateKeyFrame({});
1601 EXPECT_TRUE(error.ok());
1602
1603 error = video_rtp_sender_->GenerateKeyFrame({"1"});
1604 EXPECT_TRUE(error.ok());
1605
1606 error = video_rtp_sender_->GenerateKeyFrame({""});
1607 EXPECT_FALSE(error.ok());
1608 EXPECT_EQ(error.type(), RTCErrorType::INVALID_PARAMETER);
1609
1610 error = video_rtp_sender_->GenerateKeyFrame({"no-such-rid"});
1611 EXPECT_FALSE(error.ok());
1612 EXPECT_EQ(error.type(), RTCErrorType::INVALID_PARAMETER);
1613
1614 DestroyVideoRtpSender();
1615 }
1616
1617 // Test that makes sure that a video track content hint translates to the proper
1618 // value for sources that are not screencast.
TEST_F(RtpSenderReceiverTest,PropagatesVideoTrackContentHint)1619 TEST_F(RtpSenderReceiverTest, PropagatesVideoTrackContentHint) {
1620 CreateVideoRtpSender();
1621
1622 video_track_->set_enabled(true);
1623
1624 // `video_track_` is not screencast by default.
1625 EXPECT_EQ(false, video_media_channel()->options().is_screencast);
1626 // No content hint should be set by default.
1627 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1628 video_track_->content_hint());
1629 // Setting detailed should turn a non-screencast source into screencast mode.
1630 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
1631 EXPECT_EQ(true, video_media_channel()->options().is_screencast);
1632 // Removing the content hint should turn the track back into non-screencast
1633 // mode.
1634 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
1635 EXPECT_EQ(false, video_media_channel()->options().is_screencast);
1636 // Setting fluid should remain in non-screencast mode (its default).
1637 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
1638 EXPECT_EQ(false, video_media_channel()->options().is_screencast);
1639 // Setting text should have the same effect as Detailed
1640 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
1641 EXPECT_EQ(true, video_media_channel()->options().is_screencast);
1642
1643 DestroyVideoRtpSender();
1644 }
1645
1646 // Test that makes sure that a video track content hint translates to the proper
1647 // value for screencast sources.
TEST_F(RtpSenderReceiverTest,PropagatesVideoTrackContentHintForScreencastSource)1648 TEST_F(RtpSenderReceiverTest,
1649 PropagatesVideoTrackContentHintForScreencastSource) {
1650 CreateVideoRtpSender(true);
1651
1652 video_track_->set_enabled(true);
1653
1654 // `video_track_` with a screencast source should be screencast by default.
1655 EXPECT_EQ(true, video_media_channel()->options().is_screencast);
1656 // No content hint should be set by default.
1657 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1658 video_track_->content_hint());
1659 // Setting fluid should turn a screencast source into non-screencast mode.
1660 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
1661 EXPECT_EQ(false, video_media_channel()->options().is_screencast);
1662 // Removing the content hint should turn the track back into screencast mode.
1663 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
1664 EXPECT_EQ(true, video_media_channel()->options().is_screencast);
1665 // Setting detailed should still remain in screencast mode (its default).
1666 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
1667 EXPECT_EQ(true, video_media_channel()->options().is_screencast);
1668 // Setting text should have the same effect as Detailed
1669 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
1670 EXPECT_EQ(true, video_media_channel()->options().is_screencast);
1671
1672 DestroyVideoRtpSender();
1673 }
1674
1675 // Test that makes sure any content hints that are set on a track before
1676 // VideoRtpSender is ready to send are still applied when it gets ready to send.
TEST_F(RtpSenderReceiverTest,PropagatesVideoTrackContentHintSetBeforeEnabling)1677 TEST_F(RtpSenderReceiverTest,
1678 PropagatesVideoTrackContentHintSetBeforeEnabling) {
1679 AddVideoTrack();
1680 std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
1681 std::make_unique<MockSetStreamsObserver>();
1682 // Setting detailed overrides the default non-screencast mode. This should be
1683 // applied even if the track is set on construction.
1684 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
1685 video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1686 set_streams_observer.get());
1687 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
1688 EXPECT_CALL(*set_streams_observer, OnSetStreams());
1689 video_rtp_sender_->SetStreams({local_stream_->id()});
1690 video_rtp_sender_->SetMediaChannel(video_media_channel());
1691 video_track_->set_enabled(true);
1692
1693 // Sender is not ready to send (no SSRC) so no option should have been set.
1694 EXPECT_EQ(absl::nullopt, video_media_channel()->options().is_screencast);
1695
1696 // Verify that the content hint is accounted for when video_rtp_sender_ does
1697 // get enabled.
1698 video_rtp_sender_->SetSsrc(kVideoSsrc);
1699 EXPECT_EQ(true, video_media_channel()->options().is_screencast);
1700
1701 // And removing the hint should go back to false (to verify that false was
1702 // default correctly).
1703 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
1704 EXPECT_EQ(false, video_media_channel()->options().is_screencast);
1705
1706 DestroyVideoRtpSender();
1707 }
1708
TEST_F(RtpSenderReceiverTest,AudioSenderHasDtmfSender)1709 TEST_F(RtpSenderReceiverTest, AudioSenderHasDtmfSender) {
1710 CreateAudioRtpSender();
1711 EXPECT_NE(nullptr, audio_rtp_sender_->GetDtmfSender());
1712 }
1713
TEST_F(RtpSenderReceiverTest,VideoSenderDoesNotHaveDtmfSender)1714 TEST_F(RtpSenderReceiverTest, VideoSenderDoesNotHaveDtmfSender) {
1715 CreateVideoRtpSender();
1716 EXPECT_EQ(nullptr, video_rtp_sender_->GetDtmfSender());
1717 }
1718
1719 // Test that the DTMF sender is really using `voice_channel_`, and thus returns
1720 // true/false from CanSendDtmf based on what `voice_channel_` returns.
TEST_F(RtpSenderReceiverTest,CanInsertDtmf)1721 TEST_F(RtpSenderReceiverTest, CanInsertDtmf) {
1722 AddDtmfCodec();
1723 CreateAudioRtpSender();
1724 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1725 ASSERT_NE(nullptr, dtmf_sender);
1726 EXPECT_TRUE(dtmf_sender->CanInsertDtmf());
1727 }
1728
TEST_F(RtpSenderReceiverTest,CanNotInsertDtmf)1729 TEST_F(RtpSenderReceiverTest, CanNotInsertDtmf) {
1730 CreateAudioRtpSender();
1731 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1732 ASSERT_NE(nullptr, dtmf_sender);
1733 // DTMF codec has not been added, as it was in the above test.
1734 EXPECT_FALSE(dtmf_sender->CanInsertDtmf());
1735 }
1736
TEST_F(RtpSenderReceiverTest,InsertDtmf)1737 TEST_F(RtpSenderReceiverTest, InsertDtmf) {
1738 AddDtmfCodec();
1739 CreateAudioRtpSender();
1740 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1741 ASSERT_NE(nullptr, dtmf_sender);
1742
1743 EXPECT_EQ(0U, voice_media_channel()->dtmf_info_queue().size());
1744
1745 // Insert DTMF
1746 const int expected_duration = 90;
1747 dtmf_sender->InsertDtmf("012", expected_duration, 100);
1748
1749 // Verify
1750 ASSERT_EQ_WAIT(3U, voice_media_channel()->dtmf_info_queue().size(),
1751 kDefaultTimeout);
1752 const uint32_t send_ssrc =
1753 voice_media_channel()->send_streams()[0].first_ssrc();
1754 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel()->dtmf_info_queue()[0],
1755 send_ssrc, 0, expected_duration));
1756 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel()->dtmf_info_queue()[1],
1757 send_ssrc, 1, expected_duration));
1758 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel()->dtmf_info_queue()[2],
1759 send_ssrc, 2, expected_duration));
1760 }
1761
1762 // Validate that the default FrameEncryptor setting is nullptr.
TEST_F(RtpSenderReceiverTest,AudioSenderCanSetFrameEncryptor)1763 TEST_F(RtpSenderReceiverTest, AudioSenderCanSetFrameEncryptor) {
1764 CreateAudioRtpSender();
1765 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1766 new FakeFrameEncryptor());
1767 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1768 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1769 EXPECT_EQ(fake_frame_encryptor.get(),
1770 audio_rtp_sender_->GetFrameEncryptor().get());
1771 }
1772
1773 // Validate that setting a FrameEncryptor after the send stream is stopped does
1774 // nothing.
TEST_F(RtpSenderReceiverTest,AudioSenderCannotSetFrameEncryptorAfterStop)1775 TEST_F(RtpSenderReceiverTest, AudioSenderCannotSetFrameEncryptorAfterStop) {
1776 CreateAudioRtpSender();
1777 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1778 new FakeFrameEncryptor());
1779 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1780 audio_rtp_sender_->Stop();
1781 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1782 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1783 }
1784
1785 // Validate that the default FrameEncryptor setting is nullptr.
TEST_F(RtpSenderReceiverTest,AudioReceiverCanSetFrameDecryptor)1786 TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetFrameDecryptor) {
1787 CreateAudioRtpReceiver();
1788 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1789 rtc::make_ref_counted<FakeFrameDecryptor>());
1790 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
1791 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1792 EXPECT_EQ(fake_frame_decryptor.get(),
1793 audio_rtp_receiver_->GetFrameDecryptor().get());
1794 DestroyAudioRtpReceiver();
1795 }
1796
1797 // Validate that the default FrameEncryptor setting is nullptr.
TEST_F(RtpSenderReceiverTest,AudioReceiverCannotSetFrameDecryptorAfterStop)1798 TEST_F(RtpSenderReceiverTest, AudioReceiverCannotSetFrameDecryptorAfterStop) {
1799 CreateAudioRtpReceiver();
1800 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1801 rtc::make_ref_counted<FakeFrameDecryptor>());
1802 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
1803 audio_rtp_receiver_->SetMediaChannel(nullptr);
1804 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1805 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1806 DestroyAudioRtpReceiver();
1807 }
1808
1809 // Validate that the default FrameEncryptor setting is nullptr.
TEST_F(RtpSenderReceiverTest,VideoSenderCanSetFrameEncryptor)1810 TEST_F(RtpSenderReceiverTest, VideoSenderCanSetFrameEncryptor) {
1811 CreateVideoRtpSender();
1812 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1813 new FakeFrameEncryptor());
1814 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1815 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1816 EXPECT_EQ(fake_frame_encryptor.get(),
1817 video_rtp_sender_->GetFrameEncryptor().get());
1818 }
1819
1820 // Validate that setting a FrameEncryptor after the send stream is stopped does
1821 // nothing.
TEST_F(RtpSenderReceiverTest,VideoSenderCannotSetFrameEncryptorAfterStop)1822 TEST_F(RtpSenderReceiverTest, VideoSenderCannotSetFrameEncryptorAfterStop) {
1823 CreateVideoRtpSender();
1824 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1825 new FakeFrameEncryptor());
1826 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1827 video_rtp_sender_->Stop();
1828 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1829 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1830 }
1831
1832 // Validate that the default FrameEncryptor setting is nullptr.
TEST_F(RtpSenderReceiverTest,VideoReceiverCanSetFrameDecryptor)1833 TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetFrameDecryptor) {
1834 CreateVideoRtpReceiver();
1835 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1836 rtc::make_ref_counted<FakeFrameDecryptor>());
1837 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
1838 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1839 EXPECT_EQ(fake_frame_decryptor.get(),
1840 video_rtp_receiver_->GetFrameDecryptor().get());
1841 DestroyVideoRtpReceiver();
1842 }
1843
1844 // Validate that the default FrameEncryptor setting is nullptr.
TEST_F(RtpSenderReceiverTest,VideoReceiverCannotSetFrameDecryptorAfterStop)1845 TEST_F(RtpSenderReceiverTest, VideoReceiverCannotSetFrameDecryptorAfterStop) {
1846 CreateVideoRtpReceiver();
1847 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1848 rtc::make_ref_counted<FakeFrameDecryptor>());
1849 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
1850 video_rtp_receiver_->SetMediaChannel(nullptr);
1851 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1852 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1853 DestroyVideoRtpReceiver();
1854 }
1855
1856 // Checks that calling the internal methods for get/set parameters do not
1857 // invalidate any parameters retreived by clients.
TEST_F(RtpSenderReceiverTest,InternalParameterMethodsDoNotInvalidateTransaction)1858 TEST_F(RtpSenderReceiverTest,
1859 InternalParameterMethodsDoNotInvalidateTransaction) {
1860 CreateVideoRtpSender();
1861 RtpParameters parameters = video_rtp_sender_->GetParameters();
1862 RtpParameters new_parameters = video_rtp_sender_->GetParametersInternal();
1863 new_parameters.encodings[0].active = false;
1864 video_rtp_sender_->SetParametersInternal(new_parameters, nullptr, true);
1865 new_parameters.encodings[0].active = true;
1866 video_rtp_sender_->SetParametersInternal(new_parameters, nullptr, true);
1867 parameters.encodings[0].active = false;
1868 EXPECT_TRUE(video_rtp_sender_->SetParameters(parameters).ok());
1869 }
1870
1871 // Helper method for syntactic sugar for accepting a vector with '{}' notation.
CreatePairOfRidVectors(const std::vector<std::string> & first,const std::vector<std::string> & second)1872 std::pair<RidList, RidList> CreatePairOfRidVectors(
1873 const std::vector<std::string>& first,
1874 const std::vector<std::string>& second) {
1875 return std::make_pair(first, second);
1876 }
1877
1878 // These parameters are used to test disabling simulcast layers.
1879 const std::pair<RidList, RidList> kDisableSimulcastLayersParameters[] = {
1880 // Tests removing the first layer. This is a special case because
1881 // the first layer's SSRC is also the 'primary' SSRC used to associate the
1882 // parameters to the media channel.
1883 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"1"}),
1884 // Tests removing some layers.
1885 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"2", "4"}),
1886 // Tests simulcast rejected scenario all layers except first are rejected.
1887 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"2", "3", "4"}),
1888 // Tests removing all layers.
1889 CreatePairOfRidVectors({"1", "2", "3", "4"}, {"1", "2", "3", "4"}),
1890 };
1891
1892 // Runs test for disabling layers on a sender without a media engine set.
TEST_P(RtpSenderReceiverTest,DisableSimulcastLayersWithoutMediaEngine)1893 TEST_P(RtpSenderReceiverTest, DisableSimulcastLayersWithoutMediaEngine) {
1894 auto parameter = GetParam();
1895 RunDisableSimulcastLayersWithoutMediaEngineTest(parameter.first,
1896 parameter.second);
1897 }
1898
1899 // Runs test for disabling layers on a sender with a media engine set.
TEST_P(RtpSenderReceiverTest,DisableSimulcastLayersWithMediaEngine)1900 TEST_P(RtpSenderReceiverTest, DisableSimulcastLayersWithMediaEngine) {
1901 auto parameter = GetParam();
1902 RunDisableSimulcastLayersWithMediaEngineTest(parameter.first,
1903 parameter.second);
1904 }
1905
1906 INSTANTIATE_TEST_SUITE_P(
1907 DisableSimulcastLayersInSender,
1908 RtpSenderReceiverTest,
1909 ::testing::ValuesIn(kDisableSimulcastLayersParameters));
1910
1911 } // namespace webrtc
1912