webrtc_video_engine_unittest.cc (436175B)
1 /* 2 * Copyright (c) 2004 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 "media/engine/webrtc_video_engine.h" 12 13 #include <algorithm> 14 #include <cstddef> 15 #include <cstdint> 16 #include <cstdlib> 17 #include <cstring> 18 #include <map> 19 #include <memory> 20 #include <optional> 21 #include <set> 22 #include <string> 23 #include <tuple> 24 #include <unordered_set> 25 #include <utility> 26 #include <vector> 27 28 #include "absl/algorithm/container.h" 29 #include "absl/container/inlined_vector.h" 30 #include "absl/strings/match.h" 31 #include "absl/strings/string_view.h" 32 #include "api/call/transport.h" 33 #include "api/crypto/crypto_options.h" 34 #include "api/environment/environment.h" 35 #include "api/environment/environment_factory.h" 36 #include "api/field_trials.h" 37 #include "api/make_ref_counted.h" 38 #include "api/media_types.h" 39 #include "api/priority.h" 40 #include "api/rtc_error.h" 41 #include "api/rtp_headers.h" 42 #include "api/rtp_parameters.h" 43 #include "api/scoped_refptr.h" 44 #include "api/test/mock_encoder_selector.h" 45 #include "api/test/mock_video_bitrate_allocator.h" 46 #include "api/test/mock_video_bitrate_allocator_factory.h" 47 #include "api/test/mock_video_decoder_factory.h" 48 #include "api/test/mock_video_encoder_factory.h" 49 #include "api/test/video/function_video_decoder_factory.h" 50 #include "api/transport/bitrate_settings.h" 51 #include "api/transport/rtp/rtp_source.h" 52 #include "api/units/time_delta.h" 53 #include "api/units/timestamp.h" 54 #include "api/video/builtin_video_bitrate_allocator_factory.h" 55 #include "api/video/i420_buffer.h" 56 #include "api/video/recordable_encoded_frame.h" 57 #include "api/video/resolution.h" 58 #include "api/video/video_bitrate_allocator_factory.h" 59 #include "api/video/video_codec_constants.h" 60 #include "api/video/video_codec_type.h" 61 #include "api/video/video_content_type.h" 62 #include "api/video/video_frame_buffer.h" 63 #include "api/video/video_rotation.h" 64 #include "api/video/video_sink_interface.h" 65 #include "api/video/video_source_interface.h" 66 #include "api/video_codecs/h264_profile_level_id.h" 67 #include "api/video_codecs/scalability_mode.h" 68 #include "api/video_codecs/sdp_video_format.h" 69 #include "api/video_codecs/video_codec.h" 70 #include "api/video_codecs/video_decoder_factory.h" 71 #include "api/video_codecs/video_decoder_factory_template.h" 72 #include "api/video_codecs/video_decoder_factory_template_dav1d_adapter.h" 73 #include "api/video_codecs/video_decoder_factory_template_libvpx_vp8_adapter.h" 74 #include "api/video_codecs/video_decoder_factory_template_libvpx_vp9_adapter.h" 75 #include "api/video_codecs/video_decoder_factory_template_open_h264_adapter.h" 76 #include "api/video_codecs/video_encoder.h" 77 #include "api/video_codecs/video_encoder_factory.h" 78 #include "api/video_codecs/video_encoder_factory_template.h" 79 #include "api/video_codecs/video_encoder_factory_template_libaom_av1_adapter.h" 80 #include "api/video_codecs/video_encoder_factory_template_libvpx_vp8_adapter.h" 81 #include "api/video_codecs/video_encoder_factory_template_libvpx_vp9_adapter.h" 82 #include "api/video_codecs/video_encoder_factory_template_open_h264_adapter.h" 83 #include "call/call.h" 84 #include "call/call_config.h" 85 #include "call/flexfec_receive_stream.h" 86 #include "call/video_receive_stream.h" 87 #include "call/video_send_stream.h" 88 #include "common_video/include/quality_limitation_reason.h" 89 #include "media/base/codec.h" 90 #include "media/base/fake_frame_source.h" 91 #include "media/base/fake_network_interface.h" 92 #include "media/base/fake_video_renderer.h" 93 #include "media/base/media_channel.h" 94 #include "media/base/media_config.h" 95 #include "media/base/media_constants.h" 96 #include "media/base/media_engine.h" 97 #include "media/base/rid_description.h" 98 #include "media/base/stream_params.h" 99 #include "media/base/test_utils.h" 100 #include "media/base/video_common.h" 101 #include "media/engine/fake_webrtc_call.h" 102 #include "media/engine/fake_webrtc_video_engine.h" 103 #include "modules/rtp_rtcp/include/report_block_data.h" 104 #include "modules/rtp_rtcp/include/rtp_header_extension_map.h" 105 #include "modules/rtp_rtcp/include/rtp_rtcp_defines.h" 106 #include "modules/rtp_rtcp/source/rtcp_packet/report_block.h" 107 #include "modules/rtp_rtcp/source/rtp_header_extensions.h" 108 #include "modules/rtp_rtcp/source/rtp_packet.h" 109 #include "modules/rtp_rtcp/source/rtp_packet_received.h" 110 #include "modules/video_coding/svc/scalability_mode_util.h" 111 #include "rtc_base/async_packet_socket.h" 112 #include "rtc_base/checks.h" 113 #include "rtc_base/copy_on_write_buffer.h" 114 #include "rtc_base/dscp.h" 115 #include "rtc_base/experiments/min_video_bitrate_experiment.h" 116 #include "rtc_base/numerics/safe_conversions.h" 117 #include "rtc_base/socket.h" 118 #include "rtc_base/time_utils.h" 119 #include "test/create_test_environment.h" 120 #include "test/create_test_field_trials.h" 121 #include "test/fake_decoder.h" 122 #include "test/frame_forwarder.h" 123 #include "test/gmock.h" 124 #include "test/gtest.h" 125 #include "test/rtcp_packet_parser.h" 126 #include "test/time_controller/simulated_time_controller.h" 127 #include "video/config/encoder_stream_factory.h" 128 #include "video/config/simulcast.h" 129 #include "video/config/video_encoder_config.h" 130 131 namespace webrtc { 132 namespace { 133 134 using ::testing::_; 135 using ::testing::Combine; 136 using ::testing::Contains; 137 using ::testing::Each; 138 using ::testing::ElementsAre; 139 using ::testing::ElementsAreArray; 140 using ::testing::Eq; 141 using ::testing::Field; 142 using ::testing::Gt; 143 using ::testing::IsEmpty; 144 using ::testing::Lt; 145 using ::testing::Pair; 146 using ::testing::Return; 147 using ::testing::SizeIs; 148 using ::testing::StrNe; 149 using ::testing::Values; 150 using ::testing::WithArg; 151 using ::webrtc::CreateTestFieldTrials; 152 using ::webrtc::FieldTrials; 153 using ::webrtc::test::FrameForwarder; 154 using ::webrtc::test::FunctionVideoDecoderFactory; 155 using ::webrtc::test::RtcpPacketParser; 156 157 constexpr uint8_t kRedRtxPayloadType = 125; 158 159 constexpr uint32_t kSsrc = 1234u; 160 constexpr uint32_t kSsrcs4[] = {1, 2, 3, 4}; 161 constexpr int kVideoWidth = 640; 162 constexpr int kVideoHeight = 360; 163 constexpr int kFramerate = 30; 164 constexpr TimeDelta kFrameDuration = TimeDelta::Millis(1000 / kFramerate); 165 166 constexpr uint32_t kSsrcs1[] = {1}; 167 constexpr uint32_t kSsrcs3[] = {1, 2, 3}; 168 constexpr uint32_t kRtxSsrcs1[] = {4}; 169 constexpr uint32_t kFlexfecSsrc = 5; 170 constexpr uint32_t kIncomingUnsignalledSsrc = 0xC0FFEE; 171 constexpr int64_t kUnsignalledReceiveStreamCooldownMs = 500; 172 173 constexpr uint32_t kRtpHeaderSize = 12; 174 constexpr size_t kNumSimulcastStreams = 3; 175 176 constexpr char kUnsupportedExtensionName[] = 177 "urn:ietf:params:rtp-hdrext:unsupported"; 178 179 Codec RemoveFeedbackParams(Codec&& codec) { 180 codec.feedback_params = FeedbackParams(); 181 return std::move(codec); 182 } 183 184 void VerifyCodecHasDefaultFeedbackParams(const Codec& codec, 185 bool lntf_expected) { 186 EXPECT_EQ(lntf_expected, codec.HasFeedbackParam(FeedbackParam( 187 kRtcpFbParamLntf, kParamValueEmpty))); 188 EXPECT_TRUE(codec.HasFeedbackParam( 189 FeedbackParam(kRtcpFbParamNack, kParamValueEmpty))); 190 EXPECT_TRUE(codec.HasFeedbackParam( 191 FeedbackParam(kRtcpFbParamNack, kRtcpFbNackParamPli))); 192 EXPECT_TRUE(codec.HasFeedbackParam( 193 FeedbackParam(kRtcpFbParamRemb, kParamValueEmpty))); 194 EXPECT_TRUE(codec.HasFeedbackParam( 195 FeedbackParam(kRtcpFbParamTransportCc, kParamValueEmpty))); 196 EXPECT_TRUE(codec.HasFeedbackParam( 197 FeedbackParam(kRtcpFbParamCcm, kRtcpFbCcmParamFir))); 198 } 199 200 // Return true if any codec in `codecs` is an RTX codec with associated 201 // payload type `payload_type`. 202 bool HasRtxCodec(const std::vector<Codec>& codecs, int payload_type) { 203 for (const Codec& codec : codecs) { 204 int associated_payload_type; 205 if (absl::EqualsIgnoreCase(codec.name.c_str(), "rtx") && 206 codec.GetParam(kCodecParamAssociatedPayloadType, 207 &associated_payload_type) && 208 associated_payload_type == payload_type) { 209 return true; 210 } 211 } 212 return false; 213 } 214 215 // Return true if any codec in `codecs` is an RTX codec, independent of 216 // payload type. 217 bool HasAnyRtxCodec(const std::vector<Codec>& codecs) { 218 for (const Codec& codec : codecs) { 219 if (absl::EqualsIgnoreCase(codec.name.c_str(), "rtx")) { 220 return true; 221 } 222 } 223 return false; 224 } 225 226 const int* FindKeyByValue(const std::map<int, int>& m, int v) { 227 for (const auto& kv : m) { 228 if (kv.second == v) 229 return &kv.first; 230 } 231 return nullptr; 232 } 233 234 bool HasRtxReceiveAssociation(const VideoReceiveStreamInterface::Config& config, 235 int payload_type) { 236 return FindKeyByValue(config.rtp.rtx_associated_payload_types, 237 payload_type) != nullptr; 238 } 239 240 // Check that there's an Rtx payload type for each decoder. 241 bool VerifyRtxReceiveAssociations( 242 const VideoReceiveStreamInterface::Config& config) { 243 for (const auto& decoder : config.decoders) { 244 if (!HasRtxReceiveAssociation(config, decoder.payload_type)) 245 return false; 246 } 247 return true; 248 } 249 250 scoped_refptr<VideoFrameBuffer> CreateBlackFrameBuffer(int width, int height) { 251 scoped_refptr<I420Buffer> buffer = I420Buffer::Create(width, height); 252 I420Buffer::SetBlack(buffer.get()); 253 return buffer; 254 } 255 256 void VerifySendStreamHasRtxTypes(const VideoSendStream::Config& config, 257 const std::map<int, int>& rtx_types) { 258 std::map<int, int>::const_iterator it; 259 it = rtx_types.find(config.rtp.payload_type); 260 EXPECT_TRUE(it != rtx_types.end() && 261 it->second == config.rtp.rtx.payload_type); 262 263 if (config.rtp.ulpfec.red_rtx_payload_type != -1) { 264 it = rtx_types.find(config.rtp.ulpfec.red_payload_type); 265 EXPECT_TRUE(it != rtx_types.end() && 266 it->second == config.rtp.ulpfec.red_rtx_payload_type); 267 } 268 } 269 270 MediaConfig GetMediaConfig() { 271 MediaConfig media_config; 272 media_config.video.enable_cpu_adaptation = false; 273 return media_config; 274 } 275 276 // Values from GetMaxDefaultVideoBitrateKbps in webrtcvideoengine.cc. 277 int GetMaxDefaultBitrateBps(size_t width, size_t height) { 278 if (width * height <= 320 * 240) { 279 return 600000; 280 } else if (width * height <= 640 * 480) { 281 return 1700000; 282 } else if (width * height <= 960 * 540) { 283 return 2000000; 284 } else { 285 return 2500000; 286 } 287 } 288 289 class MockVideoSource : public VideoSourceInterface<VideoFrame> { 290 public: 291 MOCK_METHOD(void, 292 AddOrUpdateSink, 293 (VideoSinkInterface<VideoFrame> * sink, 294 const VideoSinkWants& wants), 295 (override)); 296 MOCK_METHOD(void, 297 RemoveSink, 298 (VideoSinkInterface<VideoFrame> * sink), 299 (override)); 300 }; 301 302 class MockNetworkInterface : public MediaChannelNetworkInterface { 303 public: 304 MOCK_METHOD(bool, 305 SendPacket, 306 (CopyOnWriteBuffer * packet, 307 const AsyncSocketPacketOptions& options), 308 (override)); 309 MOCK_METHOD(bool, 310 SendRtcp, 311 (CopyOnWriteBuffer * packet, 312 const AsyncSocketPacketOptions& options), 313 (override)); 314 MOCK_METHOD(int, 315 SetOption, 316 (SocketType type, Socket::Option opt, int option), 317 (override)); 318 }; 319 320 std::vector<Resolution> GetStreamResolutions( 321 const std::vector<VideoStream>& streams) { 322 std::vector<Resolution> res; 323 for (const auto& s : streams) { 324 if (s.active) { 325 res.push_back({checked_cast<int>(s.width), checked_cast<int>(s.height)}); 326 } 327 } 328 return res; 329 } 330 331 RtpPacketReceived BuildVp8KeyFrame(uint32_t ssrc, uint8_t payload_type) { 332 RtpPacketReceived packet; 333 packet.SetMarker(true); 334 packet.SetPayloadType(payload_type); 335 packet.SetSsrc(ssrc); 336 337 // VP8 Keyframe + 1 byte payload 338 uint8_t* buf_ptr = packet.AllocatePayload(11); 339 memset(buf_ptr, 0, 11); // Pass MSAN (don't care about bytes 1-9) 340 buf_ptr[0] = 0x10; // Partition ID 0 + beginning of partition. 341 constexpr unsigned width = 1080; 342 constexpr unsigned height = 720; 343 buf_ptr[6] = width & 255; 344 buf_ptr[7] = width >> 8; 345 buf_ptr[8] = height & 255; 346 buf_ptr[9] = height >> 8; 347 return packet; 348 } 349 350 RtpPacketReceived BuildRtxPacket(uint32_t rtx_ssrc, 351 uint8_t rtx_payload_type, 352 const RtpPacketReceived& original_packet) { 353 constexpr size_t kRtxHeaderSize = 2; 354 RtpPacketReceived packet(original_packet); 355 packet.SetPayloadType(rtx_payload_type); 356 packet.SetSsrc(rtx_ssrc); 357 358 uint8_t* rtx_payload = 359 packet.AllocatePayload(original_packet.payload_size() + kRtxHeaderSize); 360 // Add OSN (original sequence number). 361 rtx_payload[0] = packet.SequenceNumber() >> 8; 362 rtx_payload[1] = packet.SequenceNumber(); 363 364 // Add original payload data. 365 if (!original_packet.payload().empty()) { 366 memcpy(rtx_payload + kRtxHeaderSize, original_packet.payload().data(), 367 original_packet.payload().size()); 368 } 369 return packet; 370 } 371 372 // TODO(tommi): Consider replacing these macros with custom matchers. 373 #define EXPECT_FRAME(c, w, h) \ 374 EXPECT_EQ((c), renderer_.num_rendered_frames()); \ 375 EXPECT_EQ((w), renderer_.width()); \ 376 EXPECT_EQ((h), renderer_.height()); 377 378 #define EXPECT_FRAME_ON_RENDERER(r, c, w, h) \ 379 EXPECT_EQ((c), (r).num_rendered_frames()); \ 380 EXPECT_EQ((w), (r).width()); \ 381 EXPECT_EQ((h), (r).height()); 382 383 class WebRtcVideoEngineTest : public ::testing::Test { 384 public: 385 WebRtcVideoEngineTest() : WebRtcVideoEngineTest("") {} 386 explicit WebRtcVideoEngineTest(const std::string& field_trials) 387 : field_trials_(CreateTestFieldTrials(field_trials)), 388 time_controller_(Timestamp::Millis(4711)), 389 env_(CreateEnvironment(field_trials_.CreateCopy(), 390 time_controller_.CreateTaskQueueFactory(), 391 time_controller_.GetClock())), 392 call_(Call::Create(CallConfig(env_))), 393 encoder_factory_(new FakeWebRtcVideoEncoderFactory), 394 decoder_factory_(new FakeWebRtcVideoDecoderFactory), 395 video_bitrate_allocator_factory_( 396 CreateBuiltinVideoBitrateAllocatorFactory()), 397 engine_(std::make_unique<WebRtcVideoEngine>( 398 std::unique_ptr<FakeWebRtcVideoEncoderFactory>(encoder_factory_), 399 std::unique_ptr<FakeWebRtcVideoDecoderFactory>(decoder_factory_), 400 env_.field_trials())) {} 401 402 protected: 403 void ChangeFieldTrials(absl::string_view key, absl::string_view value) { 404 if (!key.empty()) { 405 field_trials_.Set(key, value); 406 } 407 env_ = CreateEnvironment(field_trials_.CreateCopy(), 408 time_controller_.CreateTaskQueueFactory(), 409 time_controller_.GetClock()); 410 encoder_factory_ = new FakeWebRtcVideoEncoderFactory(); 411 decoder_factory_ = new FakeWebRtcVideoDecoderFactory(); 412 engine_ = std::make_unique<WebRtcVideoEngine>( 413 std::unique_ptr<FakeWebRtcVideoEncoderFactory>(encoder_factory_), 414 std::unique_ptr<FakeWebRtcVideoDecoderFactory>(decoder_factory_), 415 env_.field_trials()); 416 } 417 void AssignDefaultAptRtxTypes(); 418 void AssignDefaultCodec(); 419 420 // Find the index of the codec in the engine with the given name. The codec 421 // must be present. 422 size_t GetEngineCodecIndex(const std::string& name) const; 423 424 // Find the codec in the engine with the given name. The codec must be 425 // present. 426 Codec GetEngineCodec(const std::string& name) const; 427 void AddSupportedVideoCodecType( 428 const std::string& name, 429 const std::vector<ScalabilityMode>& scalability_modes = {}); 430 void AddSupportedVideoCodec(SdpVideoFormat format); 431 432 std::unique_ptr<VideoMediaSendChannelInterface> 433 SetSendParamsWithAllSupportedCodecs(); 434 435 std::unique_ptr<VideoMediaReceiveChannelInterface> 436 SetRecvParamsWithAllSupportedCodecs(); 437 std::unique_ptr<VideoMediaReceiveChannelInterface> 438 SetRecvParamsWithSupportedCodecs(const std::vector<Codec>& codecs); 439 440 void ExpectRtpCapabilitySupport(const char* uri, bool supported) const; 441 442 FieldTrials field_trials_; 443 GlobalSimulatedTimeController time_controller_; 444 Environment env_; 445 // Used in WebRtcVideoEngineVoiceTest, but defined here so it's properly 446 // initialized when the constructor is called. 447 std::unique_ptr<Call> call_; 448 FakeWebRtcVideoEncoderFactory* encoder_factory_; 449 FakeWebRtcVideoDecoderFactory* decoder_factory_; 450 std::unique_ptr<VideoBitrateAllocatorFactory> 451 video_bitrate_allocator_factory_; 452 std::unique_ptr<WebRtcVideoEngine> engine_; 453 std::optional<Codec> default_codec_; 454 std::map<int, int> default_apt_rtx_types_; 455 }; 456 457 TEST_F(WebRtcVideoEngineTest, DefaultRtxCodecHasAssociatedPayloadTypeSet) { 458 encoder_factory_->AddSupportedVideoCodecType("VP8"); 459 AssignDefaultCodec(); 460 461 std::vector<Codec> engine_codecs = engine_->LegacySendCodecs(); 462 for (size_t i = 0; i < engine_codecs.size(); ++i) { 463 if (engine_codecs[i].name != kRtxCodecName) 464 continue; 465 int associated_payload_type; 466 EXPECT_TRUE(engine_codecs[i].GetParam(kCodecParamAssociatedPayloadType, 467 &associated_payload_type)); 468 EXPECT_EQ(default_codec_->id, associated_payload_type); 469 return; 470 } 471 FAIL() << "No RTX codec found among default codecs."; 472 } 473 474 // Test that we prefer to assign RTX payload types as "primary codec PT + 1". 475 // This is purely for backwards compatibility (see https://crbug.com/391132280). 476 // The spec does NOT mandate we do this and note that this is best-effort, if 477 // "PT + 1" is already in-use the PT suggester would pick a different PT. 478 TEST_F(WebRtcVideoEngineTest, 479 DefaultRtxCodecIsAssignedAssociatedPayloadTypePlusOne) { 480 AddSupportedVideoCodecType("VP8"); 481 AddSupportedVideoCodecType("VP9"); 482 AddSupportedVideoCodecType("AV1"); 483 AddSupportedVideoCodecType("H264"); 484 for (const Codec& codec : engine_->LegacySendCodecs()) { 485 if (codec.name != kRtxCodecName) 486 continue; 487 int associated_payload_type; 488 ASSERT_TRUE(codec.GetParam(kCodecParamAssociatedPayloadType, 489 &associated_payload_type)); 490 EXPECT_EQ(codec.id, associated_payload_type + 1); 491 } 492 for (const Codec& codec : engine_->LegacyRecvCodecs()) { 493 if (codec.name != kRtxCodecName) 494 continue; 495 int associated_payload_type; 496 ASSERT_TRUE(codec.GetParam(kCodecParamAssociatedPayloadType, 497 &associated_payload_type)); 498 EXPECT_EQ(codec.id, associated_payload_type + 1); 499 } 500 } 501 502 MATCHER(HasUniquePtValues, "") { 503 std::unordered_set<int> seen_ids; 504 for (const auto& codec : arg) { 505 if (seen_ids.count(codec.id) > 0) { 506 *result_listener << "Duplicate id for " << absl::StrCat(codec); 507 return false; 508 } 509 seen_ids.insert(codec.id); 510 } 511 return true; 512 } 513 514 TEST_F(WebRtcVideoEngineTest, SupportingTwoKindsOfVp9IsOk) { 515 AddSupportedVideoCodecType("VP8"); 516 AddSupportedVideoCodec(SdpVideoFormat("VP9", {{"profile-id", "0"}})); 517 AddSupportedVideoCodec(SdpVideoFormat("VP9", {{"profile-id", "1"}})); 518 AddSupportedVideoCodec(SdpVideoFormat("VP9", {{"profile-id", "3"}})); 519 AddSupportedVideoCodec(SdpVideoFormat( 520 "AV1", {{"level-idx", "5"}, {"profile", "1"}, {"tier", "0"}})); 521 AddSupportedVideoCodec(SdpVideoFormat( 522 "AV1", {{"level-idx", "5"}, {"profile", "0"}, {"tier", "0"}})); 523 AddSupportedVideoCodec(SdpVideoFormat("VP9")); // No parameters 524 ASSERT_THAT(engine_->LegacySendCodecs(), HasUniquePtValues()); 525 ASSERT_THAT(engine_->LegacyRecvCodecs(), HasUniquePtValues()); 526 } 527 528 TEST_F(WebRtcVideoEngineTest, SupportsTimestampOffsetHeaderExtension) { 529 ExpectRtpCapabilitySupport(RtpExtension::kTimestampOffsetUri, true); 530 } 531 532 TEST_F(WebRtcVideoEngineTest, SupportsAbsoluteSenderTimeHeaderExtension) { 533 ExpectRtpCapabilitySupport(RtpExtension::kAbsSendTimeUri, true); 534 } 535 536 TEST_F(WebRtcVideoEngineTest, SupportsTransportSequenceNumberHeaderExtension) { 537 ExpectRtpCapabilitySupport(RtpExtension::kTransportSequenceNumberUri, true); 538 } 539 540 TEST_F(WebRtcVideoEngineTest, SupportsVideoRotationHeaderExtension) { 541 ExpectRtpCapabilitySupport(RtpExtension::kVideoRotationUri, true); 542 } 543 544 TEST_F(WebRtcVideoEngineTest, SupportsPlayoutDelayHeaderExtension) { 545 ExpectRtpCapabilitySupport(RtpExtension::kPlayoutDelayUri, true); 546 } 547 548 TEST_F(WebRtcVideoEngineTest, SupportsVideoContentTypeHeaderExtension) { 549 ExpectRtpCapabilitySupport(RtpExtension::kVideoContentTypeUri, true); 550 } 551 552 TEST_F(WebRtcVideoEngineTest, SupportsVideoTimingHeaderExtension) { 553 ExpectRtpCapabilitySupport(RtpExtension::kVideoTimingUri, true); 554 } 555 556 TEST_F(WebRtcVideoEngineTest, SupportsColorSpaceHeaderExtension) { 557 ExpectRtpCapabilitySupport(RtpExtension::kColorSpaceUri, true); 558 } 559 560 TEST_F(WebRtcVideoEngineTest, AdvertiseGenericDescriptor00) { 561 ExpectRtpCapabilitySupport(RtpExtension::kGenericFrameDescriptorUri00, false); 562 } 563 564 TEST_F(WebRtcVideoEngineTest, SupportCorruptionDetectionHeaderExtension) { 565 ExpectRtpCapabilitySupport(RtpExtension::kCorruptionDetectionUri, false); 566 } 567 568 class WebRtcVideoEngineTestWithGenericDescriptor 569 : public WebRtcVideoEngineTest { 570 public: 571 WebRtcVideoEngineTestWithGenericDescriptor() 572 : WebRtcVideoEngineTest("WebRTC-GenericDescriptorAdvertised/Enabled/") {} 573 }; 574 575 TEST_F(WebRtcVideoEngineTestWithGenericDescriptor, 576 AdvertiseGenericDescriptor00) { 577 ExpectRtpCapabilitySupport(RtpExtension::kGenericFrameDescriptorUri00, true); 578 } 579 580 class WebRtcVideoEngineTestWithDependencyDescriptor 581 : public WebRtcVideoEngineTest { 582 public: 583 WebRtcVideoEngineTestWithDependencyDescriptor() 584 : WebRtcVideoEngineTest( 585 "WebRTC-DependencyDescriptorAdvertised/Enabled/") {} 586 }; 587 588 TEST_F(WebRtcVideoEngineTestWithDependencyDescriptor, 589 AdvertiseDependencyDescriptor) { 590 ExpectRtpCapabilitySupport(RtpExtension::kDependencyDescriptorUri, true); 591 } 592 593 TEST_F(WebRtcVideoEngineTest, AdvertiseVideoLayersAllocation) { 594 ExpectRtpCapabilitySupport(RtpExtension::kVideoLayersAllocationUri, false); 595 } 596 597 class WebRtcVideoEngineTestWithVideoLayersAllocation 598 : public WebRtcVideoEngineTest { 599 public: 600 WebRtcVideoEngineTestWithVideoLayersAllocation() 601 : WebRtcVideoEngineTest( 602 "WebRTC-VideoLayersAllocationAdvertised/Enabled/") {} 603 }; 604 605 TEST_F(WebRtcVideoEngineTestWithVideoLayersAllocation, 606 AdvertiseVideoLayersAllocation) { 607 ExpectRtpCapabilitySupport(RtpExtension::kVideoLayersAllocationUri, true); 608 } 609 610 class WebRtcVideoFrameTrackingId : public WebRtcVideoEngineTest { 611 public: 612 WebRtcVideoFrameTrackingId() 613 : WebRtcVideoEngineTest( 614 "WebRTC-VideoFrameTrackingIdAdvertised/Enabled/") {} 615 }; 616 617 TEST_F(WebRtcVideoFrameTrackingId, AdvertiseVideoFrameTrackingId) { 618 ExpectRtpCapabilitySupport(RtpExtension::kVideoFrameTrackingIdUri, true); 619 } 620 621 TEST_F(WebRtcVideoEngineTest, CVOSetHeaderExtensionBeforeCapturer) { 622 // Allocate the source first to prevent early destruction before channel's 623 // dtor is called. 624 ::testing::NiceMock<MockVideoSource> video_source; 625 626 AddSupportedVideoCodecType("VP8"); 627 628 auto send_channel = SetSendParamsWithAllSupportedCodecs(); 629 EXPECT_TRUE(send_channel->AddSendStream(StreamParams::CreateLegacy(kSsrc))); 630 631 // Add CVO extension. 632 const int id = 1; 633 VideoSenderParameters parameters; 634 parameters.codecs.push_back(GetEngineCodec("VP8")); 635 parameters.extensions.push_back( 636 RtpExtension(RtpExtension::kVideoRotationUri, id)); 637 EXPECT_TRUE(send_channel->SetSenderParameters(parameters)); 638 639 EXPECT_CALL( 640 video_source, 641 AddOrUpdateSink(_, Field(&VideoSinkWants::rotation_applied, false))); 642 // Set capturer. 643 EXPECT_TRUE(send_channel->SetVideoSend(kSsrc, nullptr, &video_source)); 644 645 // Verify capturer has turned off applying rotation. 646 ::testing::Mock::VerifyAndClear(&video_source); 647 648 // Verify removing header extension turns on applying rotation. 649 parameters.extensions.clear(); 650 EXPECT_CALL( 651 video_source, 652 AddOrUpdateSink(_, Field(&VideoSinkWants::rotation_applied, true))); 653 654 EXPECT_TRUE(send_channel->SetSenderParameters(parameters)); 655 } 656 657 TEST_F(WebRtcVideoEngineTest, CVOSetHeaderExtensionBeforeAddSendStream) { 658 // Allocate the source first to prevent early destruction before channel's 659 // dtor is called. 660 ::testing::NiceMock<MockVideoSource> video_source; 661 662 AddSupportedVideoCodecType("VP8"); 663 664 auto send_channel = SetSendParamsWithAllSupportedCodecs(); 665 // Add CVO extension. 666 const int id = 1; 667 VideoSenderParameters parameters; 668 parameters.codecs.push_back(GetEngineCodec("VP8")); 669 parameters.extensions.push_back( 670 RtpExtension(RtpExtension::kVideoRotationUri, id)); 671 EXPECT_TRUE(send_channel->SetSenderParameters(parameters)); 672 EXPECT_TRUE(send_channel->AddSendStream(StreamParams::CreateLegacy(kSsrc))); 673 674 // Set source. 675 EXPECT_CALL( 676 video_source, 677 AddOrUpdateSink(_, Field(&VideoSinkWants::rotation_applied, false))); 678 EXPECT_TRUE(send_channel->SetVideoSend(kSsrc, nullptr, &video_source)); 679 } 680 681 TEST_F(WebRtcVideoEngineTest, CVOSetHeaderExtensionAfterCapturer) { 682 ::testing::NiceMock<MockVideoSource> video_source; 683 684 AddSupportedVideoCodecType("VP8"); 685 AddSupportedVideoCodecType("VP9"); 686 687 auto send_channel = SetSendParamsWithAllSupportedCodecs(); 688 689 EXPECT_TRUE(send_channel->AddSendStream(StreamParams::CreateLegacy(kSsrc))); 690 691 // Set capturer. 692 EXPECT_CALL( 693 video_source, 694 AddOrUpdateSink(_, Field(&VideoSinkWants::rotation_applied, true))); 695 EXPECT_TRUE(send_channel->SetVideoSend(kSsrc, nullptr, &video_source)); 696 697 // Verify capturer has turned on applying rotation. 698 ::testing::Mock::VerifyAndClear(&video_source); 699 700 // Add CVO extension. 701 const int id = 1; 702 VideoSenderParameters parameters; 703 parameters.codecs.push_back(GetEngineCodec("VP8")); 704 parameters.codecs.push_back(GetEngineCodec("VP9")); 705 parameters.extensions.push_back( 706 RtpExtension(RtpExtension::kVideoRotationUri, id)); 707 // Also remove the first codec to trigger a codec change as well. 708 parameters.codecs.erase(parameters.codecs.begin()); 709 EXPECT_CALL( 710 video_source, 711 AddOrUpdateSink(_, Field(&VideoSinkWants::rotation_applied, false))); 712 EXPECT_TRUE(send_channel->SetSenderParameters(parameters)); 713 714 // Verify capturer has turned off applying rotation. 715 ::testing::Mock::VerifyAndClear(&video_source); 716 717 // Verify removing header extension turns on applying rotation. 718 parameters.extensions.clear(); 719 EXPECT_CALL( 720 video_source, 721 AddOrUpdateSink(_, Field(&VideoSinkWants::rotation_applied, true))); 722 EXPECT_TRUE(send_channel->SetSenderParameters(parameters)); 723 } 724 725 TEST_F(WebRtcVideoEngineTest, SetSendFailsBeforeSettingCodecs) { 726 AddSupportedVideoCodecType("VP8"); 727 728 std::unique_ptr<VideoMediaSendChannelInterface> send_channel = 729 engine_->CreateSendChannel(env_, call_.get(), GetMediaConfig(), 730 VideoOptions(), CryptoOptions(), 731 video_bitrate_allocator_factory_.get()); 732 733 EXPECT_TRUE(send_channel->AddSendStream(StreamParams::CreateLegacy(123))); 734 735 EXPECT_FALSE(send_channel->SetSend(true)) 736 << "Channel should not start without codecs."; 737 EXPECT_TRUE(send_channel->SetSend(false)) 738 << "Channel should be stoppable even without set codecs."; 739 } 740 741 TEST_F(WebRtcVideoEngineTest, GetStatsWithoutCodecsSetDoesNotCrash) { 742 AddSupportedVideoCodecType("VP8"); 743 744 std::unique_ptr<VideoMediaSendChannelInterface> send_channel = 745 engine_->CreateSendChannel(env_, call_.get(), GetMediaConfig(), 746 VideoOptions(), CryptoOptions(), 747 video_bitrate_allocator_factory_.get()); 748 EXPECT_TRUE(send_channel->AddSendStream(StreamParams::CreateLegacy(123))); 749 VideoMediaSendInfo send_info; 750 send_channel->GetStats(&send_info); 751 752 std::unique_ptr<VideoMediaReceiveChannelInterface> receive_channel = 753 engine_->CreateReceiveChannel(env_, call_.get(), GetMediaConfig(), 754 VideoOptions(), CryptoOptions()); 755 EXPECT_TRUE(receive_channel->AddRecvStream(StreamParams::CreateLegacy(123))); 756 VideoMediaReceiveInfo receive_info; 757 receive_channel->GetStats(&receive_info); 758 } 759 760 TEST_F(WebRtcVideoEngineTest, UseFactoryForVp8WhenSupported) { 761 AddSupportedVideoCodecType("VP8"); 762 763 auto send_channel = SetSendParamsWithAllSupportedCodecs(); 764 765 send_channel->OnReadyToSend(true); 766 767 EXPECT_TRUE(send_channel->AddSendStream(StreamParams::CreateLegacy(kSsrc))); 768 EXPECT_EQ(0, encoder_factory_->GetNumCreatedEncoders()); 769 EXPECT_TRUE(send_channel->SetSend(true)); 770 FrameForwarder frame_forwarder; 771 FakeFrameSource frame_source(1280, 720, kNumMicrosecsPerSec / 30); 772 EXPECT_TRUE(send_channel->SetVideoSend(kSsrc, nullptr, &frame_forwarder)); 773 frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame()); 774 time_controller_.AdvanceTime(TimeDelta::Zero()); 775 // Sending one frame will have allocate the encoder. 776 ASSERT_TRUE(encoder_factory_->WaitForCreatedVideoEncoders(1)); 777 EXPECT_GT(encoder_factory_->encoders()[0]->GetNumEncodedFrames(), 0); 778 779 int num_created_encoders = encoder_factory_->GetNumCreatedEncoders(); 780 EXPECT_EQ(num_created_encoders, 1); 781 782 // Setting codecs of the same type should not reallocate any encoders 783 // (expecting a no-op). 784 VideoSenderParameters parameters; 785 parameters.codecs.push_back(GetEngineCodec("VP8")); 786 EXPECT_TRUE(send_channel->SetSenderParameters(parameters)); 787 EXPECT_EQ(num_created_encoders, encoder_factory_->GetNumCreatedEncoders()); 788 789 // Remove stream previously added to free the external encoder instance. 790 EXPECT_TRUE(send_channel->RemoveSendStream(kSsrc)); 791 EXPECT_EQ(0u, encoder_factory_->encoders().size()); 792 } 793 794 // Test that when an encoder factory supports H264, we add an RTX 795 // codec for it. 796 // TODO(deadbeef): This test should be updated if/when we start 797 // adding RTX codecs for unrecognized codec names. 798 TEST_F(WebRtcVideoEngineTest, RtxCodecAddedForH264Codec) { 799 SdpVideoFormat h264_constrained_baseline("H264"); 800 h264_constrained_baseline.parameters[kH264FmtpProfileLevelId] = 801 *H264ProfileLevelIdToString(H264ProfileLevelId( 802 H264Profile::kProfileConstrainedBaseline, H264Level::kLevel1)); 803 SdpVideoFormat h264_constrained_high("H264"); 804 h264_constrained_high.parameters[kH264FmtpProfileLevelId] = 805 *H264ProfileLevelIdToString(H264ProfileLevelId( 806 H264Profile::kProfileConstrainedHigh, H264Level::kLevel1)); 807 SdpVideoFormat h264_high("H264"); 808 h264_high.parameters[kH264FmtpProfileLevelId] = *H264ProfileLevelIdToString( 809 H264ProfileLevelId(H264Profile::kProfileHigh, H264Level::kLevel1)); 810 811 encoder_factory_->AddSupportedVideoCodec(h264_constrained_baseline); 812 encoder_factory_->AddSupportedVideoCodec(h264_constrained_high); 813 encoder_factory_->AddSupportedVideoCodec(h264_high); 814 815 // First figure out what payload types the test codecs got assigned. 816 const std::vector<Codec> codecs = engine_->LegacySendCodecs(); 817 // Now search for RTX codecs for them. Expect that they all have associated 818 // RTX codecs. 819 EXPECT_TRUE(HasRtxCodec( 820 codecs, FindMatchingVideoCodec( 821 codecs, CreateVideoCodec(h264_constrained_baseline)) 822 ->id)); 823 EXPECT_TRUE(HasRtxCodec( 824 codecs, 825 FindMatchingVideoCodec(codecs, CreateVideoCodec(h264_constrained_high)) 826 ->id)); 827 EXPECT_TRUE(HasRtxCodec( 828 codecs, FindMatchingVideoCodec(codecs, CreateVideoCodec(h264_high))->id)); 829 } 830 831 #if defined(RTC_ENABLE_VP9) 832 TEST_F(WebRtcVideoEngineTest, CanConstructDecoderForVp9EncoderFactory) { 833 AddSupportedVideoCodecType("VP9"); 834 835 auto receive_channel = SetRecvParamsWithAllSupportedCodecs(); 836 837 EXPECT_TRUE( 838 receive_channel->AddRecvStream(StreamParams::CreateLegacy(kSsrc))); 839 } 840 #endif // defined(RTC_ENABLE_VP9) 841 842 TEST_F(WebRtcVideoEngineTest, PropagatesInputFrameTimestamp) { 843 AddSupportedVideoCodecType("VP8"); 844 FakeCall* fake_call = new FakeCall(env_); 845 call_.reset(fake_call); 846 auto send_channel = SetSendParamsWithAllSupportedCodecs(); 847 848 EXPECT_TRUE(send_channel->AddSendStream(StreamParams::CreateLegacy(kSsrc))); 849 850 FrameForwarder frame_forwarder; 851 FakeFrameSource frame_source(1280, 720, kNumMicrosecsPerSec / 60); 852 EXPECT_TRUE(send_channel->SetVideoSend(kSsrc, nullptr, &frame_forwarder)); 853 send_channel->SetSend(true); 854 855 FakeVideoSendStream* stream = fake_call->GetVideoSendStreams()[0]; 856 857 frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame()); 858 int64_t last_timestamp = stream->GetLastTimestamp(); 859 for (int i = 0; i < 10; i++) { 860 frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame()); 861 int64_t timestamp = stream->GetLastTimestamp(); 862 int64_t interval = timestamp - last_timestamp; 863 864 // Precision changes from nanosecond to millisecond. 865 // Allow error to be no more than 1. 866 EXPECT_NEAR(VideoFormat::FpsToInterval(60) / 1E6, interval, 1); 867 868 last_timestamp = timestamp; 869 } 870 871 frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame( 872 1280, 720, VideoRotation::kVideoRotation_0, kNumMicrosecsPerSec / 30)); 873 last_timestamp = stream->GetLastTimestamp(); 874 for (int i = 0; i < 10; i++) { 875 frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame( 876 1280, 720, VideoRotation::kVideoRotation_0, kNumMicrosecsPerSec / 30)); 877 int64_t timestamp = stream->GetLastTimestamp(); 878 int64_t interval = timestamp - last_timestamp; 879 880 // Precision changes from nanosecond to millisecond. 881 // Allow error to be no more than 1. 882 EXPECT_NEAR(VideoFormat::FpsToInterval(30) / 1E6, interval, 1); 883 884 last_timestamp = timestamp; 885 } 886 887 // Remove stream previously added to free the external encoder instance. 888 EXPECT_TRUE(send_channel->RemoveSendStream(kSsrc)); 889 } 890 891 void WebRtcVideoEngineTest::AssignDefaultAptRtxTypes() { 892 std::vector<Codec> engine_codecs = engine_->LegacySendCodecs(); 893 RTC_DCHECK(!engine_codecs.empty()); 894 for (const Codec& codec : engine_codecs) { 895 if (codec.name == "rtx") { 896 int associated_payload_type; 897 if (codec.GetParam(kCodecParamAssociatedPayloadType, 898 &associated_payload_type)) { 899 default_apt_rtx_types_[associated_payload_type] = codec.id; 900 } 901 } 902 } 903 } 904 905 void WebRtcVideoEngineTest::AssignDefaultCodec() { 906 std::vector<Codec> engine_codecs = engine_->LegacySendCodecs(); 907 RTC_DCHECK(!engine_codecs.empty()); 908 bool codec_set = false; 909 for (const Codec& codec : engine_codecs) { 910 if (!codec_set && codec.name != "rtx" && codec.name != "red" && 911 codec.name != "ulpfec" && codec.name != "flexfec-03") { 912 default_codec_ = codec; 913 codec_set = true; 914 } 915 } 916 917 RTC_DCHECK(codec_set); 918 } 919 920 size_t WebRtcVideoEngineTest::GetEngineCodecIndex( 921 const std::string& name) const { 922 const std::vector<Codec> codecs = engine_->LegacySendCodecs(); 923 for (size_t i = 0; i < codecs.size(); ++i) { 924 const Codec engine_codec = codecs[i]; 925 if (!absl::EqualsIgnoreCase(name, engine_codec.name)) 926 continue; 927 // The tests only use H264 Constrained Baseline. Make sure we don't return 928 // an internal H264 codec from the engine with a different H264 profile. 929 if (absl::EqualsIgnoreCase(name.c_str(), kH264CodecName)) { 930 const std::optional<H264ProfileLevelId> profile_level_id = 931 ParseSdpForH264ProfileLevelId(engine_codec.params); 932 if (profile_level_id->profile != 933 H264Profile::kProfileConstrainedBaseline) { 934 continue; 935 } 936 } 937 return i; 938 } 939 // This point should never be reached. 940 ADD_FAILURE() << "Unrecognized codec name: " << name; 941 return -1; 942 } 943 944 Codec WebRtcVideoEngineTest::GetEngineCodec(const std::string& name) const { 945 return engine_->LegacySendCodecs()[GetEngineCodecIndex(name)]; 946 } 947 948 void WebRtcVideoEngineTest::AddSupportedVideoCodecType( 949 const std::string& name, 950 const std::vector<ScalabilityMode>& scalability_modes) { 951 encoder_factory_->AddSupportedVideoCodecType(name, scalability_modes); 952 decoder_factory_->AddSupportedVideoCodecType(name); 953 } 954 955 void WebRtcVideoEngineTest::AddSupportedVideoCodec(SdpVideoFormat format) { 956 encoder_factory_->AddSupportedVideoCodec(format); 957 decoder_factory_->AddSupportedVideoCodec(format); 958 } 959 960 std::unique_ptr<VideoMediaSendChannelInterface> 961 WebRtcVideoEngineTest::SetSendParamsWithAllSupportedCodecs() { 962 std::unique_ptr<VideoMediaSendChannelInterface> channel = 963 engine_->CreateSendChannel(env_, call_.get(), GetMediaConfig(), 964 VideoOptions(), CryptoOptions(), 965 video_bitrate_allocator_factory_.get()); 966 VideoSenderParameters parameters; 967 // We need to look up the codec in the engine to get the correct payload type. 968 for (const SdpVideoFormat& format : encoder_factory_->GetSupportedFormats()) { 969 Codec engine_codec = GetEngineCodec(format.name); 970 if (!absl::c_linear_search(parameters.codecs, engine_codec)) { 971 parameters.codecs.push_back(engine_codec); 972 } 973 } 974 975 EXPECT_TRUE(channel->SetSenderParameters(parameters)); 976 977 return channel; 978 } 979 980 std::unique_ptr<VideoMediaReceiveChannelInterface> 981 WebRtcVideoEngineTest::SetRecvParamsWithSupportedCodecs( 982 const std::vector<Codec>& codecs) { 983 std::unique_ptr<VideoMediaReceiveChannelInterface> channel = 984 engine_->CreateReceiveChannel(env_, call_.get(), GetMediaConfig(), 985 VideoOptions(), CryptoOptions()); 986 VideoReceiverParameters parameters; 987 parameters.codecs = codecs; 988 EXPECT_TRUE(channel->SetReceiverParameters(parameters)); 989 990 return channel; 991 } 992 993 std::unique_ptr<VideoMediaReceiveChannelInterface> 994 WebRtcVideoEngineTest::SetRecvParamsWithAllSupportedCodecs() { 995 std::vector<Codec> codecs; 996 for (const SdpVideoFormat& format : decoder_factory_->GetSupportedFormats()) { 997 Codec engine_codec = GetEngineCodec(format.name); 998 if (!absl::c_linear_search(codecs, engine_codec)) { 999 codecs.push_back(engine_codec); 1000 } 1001 } 1002 1003 return SetRecvParamsWithSupportedCodecs(codecs); 1004 } 1005 1006 void WebRtcVideoEngineTest::ExpectRtpCapabilitySupport(const char* uri, 1007 bool supported) const { 1008 const std::vector<RtpExtension> header_extensions = 1009 GetDefaultEnabledRtpHeaderExtensions(*engine_.get(), 1010 /* field_trials= */ nullptr); 1011 if (supported) { 1012 EXPECT_THAT(header_extensions, Contains(Field(&RtpExtension::uri, uri))); 1013 } else { 1014 EXPECT_THAT(header_extensions, Each(Field(&RtpExtension::uri, StrNe(uri)))); 1015 } 1016 } 1017 1018 TEST_F(WebRtcVideoEngineTest, ReceiveBufferSizeViaFieldTrial) { 1019 ChangeFieldTrials("WebRTC-ReceiveBufferSize", "size_bytes:10000"); 1020 std::unique_ptr<VideoMediaReceiveChannelInterface> receive_channel = 1021 engine_->CreateReceiveChannel(env_, call_.get(), GetMediaConfig(), 1022 VideoOptions(), CryptoOptions()); 1023 FakeNetworkInterface network; 1024 receive_channel->SetInterface(&network); 1025 EXPECT_EQ(10000, network.recvbuf_size()); 1026 receive_channel->SetInterface(nullptr); 1027 } 1028 1029 TEST_F(WebRtcVideoEngineTest, TooHighReceiveBufferSizeViaFieldTrial) { 1030 // 10000001 is too high, it will revert to the default 1031 // kVideoRtpRecvBufferSize. 1032 ChangeFieldTrials("WebRTC-ReceiveBufferSize", "size_bytes:10000001"); 1033 std::unique_ptr<VideoMediaReceiveChannelInterface> receive_channel = 1034 engine_->CreateReceiveChannel(env_, call_.get(), GetMediaConfig(), 1035 VideoOptions(), CryptoOptions()); 1036 FakeNetworkInterface network; 1037 receive_channel->SetInterface(&network); 1038 EXPECT_EQ(kVideoRtpRecvBufferSize, network.recvbuf_size()); 1039 receive_channel->SetInterface(nullptr); 1040 } 1041 1042 TEST_F(WebRtcVideoEngineTest, TooLowReceiveBufferSizeViaFieldTrial) { 1043 // 9999 is too low, it will revert to the default kVideoRtpRecvBufferSize. 1044 ChangeFieldTrials("WebRTC-ReceiveBufferSize", "size_bytes:9999"); 1045 std::unique_ptr<VideoMediaReceiveChannelInterface> receive_channel = 1046 engine_->CreateReceiveChannel(env_, call_.get(), GetMediaConfig(), 1047 VideoOptions(), CryptoOptions()); 1048 FakeNetworkInterface network; 1049 receive_channel->SetInterface(&network); 1050 EXPECT_EQ(kVideoRtpRecvBufferSize, network.recvbuf_size()); 1051 receive_channel->SetInterface(nullptr); 1052 } 1053 1054 TEST_F(WebRtcVideoEngineTest, UpdatesUnsignaledRtxSsrcAndRecoversPayload) { 1055 // Setup a channel with VP8, RTX and transport sequence number header 1056 // extension. Receive stream is not explicitly configured. 1057 AddSupportedVideoCodecType("VP8"); 1058 std::vector<Codec> supported_codecs = 1059 engine_->LegacyRecvCodecs(/*include_rtx=*/true); 1060 ASSERT_EQ(supported_codecs[1].name, "rtx"); 1061 int rtx_payload_type = supported_codecs[1].id; 1062 1063 std::unique_ptr<VideoMediaReceiveChannelInterface> receive_channel = 1064 engine_->CreateReceiveChannel(env_, call_.get(), GetMediaConfig(), 1065 VideoOptions(), CryptoOptions()); 1066 VideoReceiverParameters parameters; 1067 parameters.codecs = supported_codecs; 1068 ASSERT_TRUE(receive_channel->SetReceiverParameters(parameters)); 1069 receive_channel->SetReceive(true); 1070 1071 // Receive a normal payload packet. It is not a complete frame since the 1072 // marker bit is not set. 1073 RtpPacketReceived packet_1 = 1074 BuildVp8KeyFrame(/*ssrc*/ 123, supported_codecs[0].id); 1075 packet_1.SetMarker(false); 1076 receive_channel->OnPacketReceived(packet_1); 1077 1078 time_controller_.AdvanceTime(TimeDelta::Millis(100)); 1079 // No complete frame received. No decoder created yet. 1080 EXPECT_THAT(decoder_factory_->decoders(), IsEmpty()); 1081 1082 RtpPacketReceived packet_2; 1083 packet_2.SetSsrc(123); 1084 packet_2.SetPayloadType(supported_codecs[0].id); 1085 packet_2.SetSequenceNumber(packet_1.SequenceNumber() + 1); 1086 memset(packet_2.AllocatePayload(500), 0, 1); 1087 packet_2.SetMarker(true); // Frame is complete. 1088 RtpPacketReceived rtx_packet = 1089 BuildRtxPacket(345, rtx_payload_type, packet_2); 1090 1091 receive_channel->OnPacketReceived(rtx_packet); 1092 1093 time_controller_.AdvanceTime(TimeDelta::Millis(0)); 1094 ASSERT_THAT(decoder_factory_->decoders(), Not(IsEmpty())); 1095 EXPECT_EQ(decoder_factory_->decoders()[0]->GetNumFramesReceived(), 1); 1096 } 1097 1098 TEST_F(WebRtcVideoEngineTest, UsesSimulcastAdapterForVp8Factories) { 1099 AddSupportedVideoCodecType("VP8"); 1100 1101 auto send_channel = SetSendParamsWithAllSupportedCodecs(); 1102 1103 std::vector<uint32_t> ssrcs = MAKE_VECTOR(kSsrcs3); 1104 1105 EXPECT_TRUE( 1106 send_channel->AddSendStream(CreateSimStreamParams("cname", ssrcs))); 1107 EXPECT_TRUE(send_channel->SetSend(true)); 1108 1109 FrameForwarder frame_forwarder; 1110 FakeFrameSource frame_source(1280, 720, kNumMicrosecsPerSec / 60); 1111 EXPECT_TRUE( 1112 send_channel->SetVideoSend(ssrcs.front(), nullptr, &frame_forwarder)); 1113 frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame()); 1114 time_controller_.AdvanceTime(TimeDelta::Zero()); 1115 ASSERT_TRUE(encoder_factory_->WaitForCreatedVideoEncoders(2)); 1116 1117 // Verify that encoders are configured for simulcast through adapter 1118 // (increasing resolution and only configured to send one stream each). 1119 int prev_width = -1; 1120 for (size_t i = 0; i < encoder_factory_->encoders().size(); ++i) { 1121 ASSERT_TRUE(encoder_factory_->encoders()[i]->WaitForInitEncode()); 1122 VideoCodec codec_settings = 1123 encoder_factory_->encoders()[i]->GetCodecSettings(); 1124 EXPECT_EQ(0, codec_settings.numberOfSimulcastStreams); 1125 EXPECT_GT(codec_settings.width, prev_width); 1126 prev_width = codec_settings.width; 1127 } 1128 1129 EXPECT_TRUE(send_channel->SetVideoSend(ssrcs.front(), nullptr, nullptr)); 1130 1131 send_channel.reset(); 1132 ASSERT_EQ(0u, encoder_factory_->encoders().size()); 1133 } 1134 1135 TEST_F(WebRtcVideoEngineTest, ChannelWithH264CanChangeToVp8) { 1136 AddSupportedVideoCodecType("VP8"); 1137 AddSupportedVideoCodecType("H264"); 1138 1139 // Frame source. 1140 FrameForwarder frame_forwarder; 1141 FakeFrameSource frame_source(1280, 720, kNumMicrosecsPerSec / 30); 1142 1143 std::unique_ptr<VideoMediaSendChannelInterface> send_channel = 1144 engine_->CreateSendChannel(env_, call_.get(), GetMediaConfig(), 1145 VideoOptions(), CryptoOptions(), 1146 video_bitrate_allocator_factory_.get()); 1147 VideoSenderParameters parameters; 1148 parameters.codecs.push_back(GetEngineCodec("H264")); 1149 EXPECT_TRUE(send_channel->SetSenderParameters(parameters)); 1150 1151 EXPECT_TRUE(send_channel->AddSendStream(StreamParams::CreateLegacy(kSsrc))); 1152 EXPECT_TRUE(send_channel->SetVideoSend(kSsrc, nullptr, &frame_forwarder)); 1153 // Sending one frame will have allocate the encoder. 1154 frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame()); 1155 time_controller_.AdvanceTime(TimeDelta::Zero()); 1156 1157 ASSERT_EQ(1u, encoder_factory_->encoders().size()); 1158 1159 VideoSenderParameters new_parameters; 1160 new_parameters.codecs.push_back(GetEngineCodec("VP8")); 1161 EXPECT_TRUE(send_channel->SetSenderParameters(new_parameters)); 1162 1163 // Sending one frame will switch encoder. 1164 frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame()); 1165 time_controller_.AdvanceTime(TimeDelta::Zero()); 1166 1167 EXPECT_EQ(1u, encoder_factory_->encoders().size()); 1168 } 1169 1170 TEST_F(WebRtcVideoEngineTest, 1171 UsesSimulcastAdapterForVp8WithCombinedVP8AndH264Factory) { 1172 AddSupportedVideoCodecType("VP8"); 1173 AddSupportedVideoCodecType("H264"); 1174 1175 std::unique_ptr<VideoMediaSendChannelInterface> send_channel = 1176 engine_->CreateSendChannel(env_, call_.get(), GetMediaConfig(), 1177 VideoOptions(), CryptoOptions(), 1178 video_bitrate_allocator_factory_.get()); 1179 VideoSenderParameters parameters; 1180 parameters.codecs.push_back(GetEngineCodec("VP8")); 1181 EXPECT_TRUE(send_channel->SetSenderParameters(parameters)); 1182 1183 std::vector<uint32_t> ssrcs = MAKE_VECTOR(kSsrcs3); 1184 1185 EXPECT_TRUE( 1186 send_channel->AddSendStream(CreateSimStreamParams("cname", ssrcs))); 1187 EXPECT_TRUE(send_channel->SetSend(true)); 1188 1189 // Send a fake frame, or else the media engine will configure the simulcast 1190 // encoder adapter at a low-enough size that it'll only create a single 1191 // encoder layer. 1192 FrameForwarder frame_forwarder; 1193 FakeFrameSource frame_source(1280, 720, kNumMicrosecsPerSec / 30); 1194 EXPECT_TRUE( 1195 send_channel->SetVideoSend(ssrcs.front(), nullptr, &frame_forwarder)); 1196 frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame()); 1197 time_controller_.AdvanceTime(TimeDelta::Zero()); 1198 1199 ASSERT_TRUE(encoder_factory_->WaitForCreatedVideoEncoders(2)); 1200 ASSERT_TRUE(encoder_factory_->encoders()[0]->WaitForInitEncode()); 1201 EXPECT_EQ(kVideoCodecVP8, 1202 encoder_factory_->encoders()[0]->GetCodecSettings().codecType); 1203 1204 send_channel.reset(); 1205 // Make sure DestroyVideoEncoder was called on the factory. 1206 EXPECT_EQ(0u, encoder_factory_->encoders().size()); 1207 } 1208 1209 TEST_F(WebRtcVideoEngineTest, 1210 DestroysNonSimulcastEncoderFromCombinedVP8AndH264Factory) { 1211 AddSupportedVideoCodecType("VP8"); 1212 AddSupportedVideoCodecType("H264"); 1213 1214 std::unique_ptr<VideoMediaSendChannelInterface> send_channel = 1215 engine_->CreateSendChannel(env_, call_.get(), GetMediaConfig(), 1216 VideoOptions(), CryptoOptions(), 1217 video_bitrate_allocator_factory_.get()); 1218 VideoSenderParameters parameters; 1219 parameters.codecs.push_back(GetEngineCodec("H264")); 1220 EXPECT_TRUE(send_channel->SetSenderParameters(parameters)); 1221 1222 EXPECT_TRUE(send_channel->AddSendStream(StreamParams::CreateLegacy(kSsrc))); 1223 1224 // Send a frame of 720p. This should trigger a "real" encoder initialization. 1225 FrameForwarder frame_forwarder; 1226 FakeFrameSource frame_source(1280, 720, kNumMicrosecsPerSec / 30); 1227 EXPECT_TRUE(send_channel->SetVideoSend(kSsrc, nullptr, &frame_forwarder)); 1228 frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame()); 1229 time_controller_.AdvanceTime(TimeDelta::Zero()); 1230 ASSERT_TRUE(encoder_factory_->WaitForCreatedVideoEncoders(1)); 1231 ASSERT_EQ(1u, encoder_factory_->encoders().size()); 1232 ASSERT_TRUE(encoder_factory_->encoders()[0]->WaitForInitEncode()); 1233 EXPECT_EQ(kVideoCodecH264, 1234 encoder_factory_->encoders()[0]->GetCodecSettings().codecType); 1235 1236 send_channel.reset(); 1237 // Make sure DestroyVideoEncoder was called on the factory. 1238 ASSERT_EQ(0u, encoder_factory_->encoders().size()); 1239 } 1240 1241 TEST_F(WebRtcVideoEngineTest, SimulcastEnabledForH264) { 1242 AddSupportedVideoCodecType("H264"); 1243 1244 std::unique_ptr<VideoMediaSendChannelInterface> send_channel = 1245 engine_->CreateSendChannel(env_, call_.get(), GetMediaConfig(), 1246 VideoOptions(), CryptoOptions(), 1247 video_bitrate_allocator_factory_.get()); 1248 1249 VideoSenderParameters parameters; 1250 parameters.codecs.push_back(GetEngineCodec("H264")); 1251 EXPECT_TRUE(send_channel->SetSenderParameters(parameters)); 1252 1253 const std::vector<uint32_t> ssrcs = MAKE_VECTOR(kSsrcs3); 1254 EXPECT_TRUE( 1255 send_channel->AddSendStream(CreateSimStreamParams("cname", ssrcs))); 1256 1257 // Send a frame of 720p. This should trigger a "real" encoder initialization. 1258 FrameForwarder frame_forwarder; 1259 FakeFrameSource frame_source(1280, 720, kNumMicrosecsPerSec / 30); 1260 EXPECT_TRUE(send_channel->SetVideoSend(ssrcs[0], nullptr, &frame_forwarder)); 1261 frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame()); 1262 time_controller_.AdvanceTime(TimeDelta::Zero()); 1263 1264 ASSERT_TRUE(encoder_factory_->WaitForCreatedVideoEncoders(1)); 1265 ASSERT_EQ(1u, encoder_factory_->encoders().size()); 1266 FakeWebRtcVideoEncoder* encoder = encoder_factory_->encoders()[0]; 1267 ASSERT_TRUE(encoder_factory_->encoders()[0]->WaitForInitEncode()); 1268 EXPECT_EQ(kVideoCodecH264, encoder->GetCodecSettings().codecType); 1269 EXPECT_LT(1u, encoder->GetCodecSettings().numberOfSimulcastStreams); 1270 EXPECT_TRUE(send_channel->SetVideoSend(ssrcs[0], nullptr, nullptr)); 1271 } 1272 1273 // Test that FlexFEC is not supported as a send video codec by default. 1274 // Only enabling field trial should allow advertising FlexFEC send codec. 1275 class WebRtcVideoEngineTestWithFlexfec : public WebRtcVideoEngineTest { 1276 public: 1277 WebRtcVideoEngineTestWithFlexfec() 1278 : WebRtcVideoEngineTest("WebRTC-FlexFEC-03-Advertised/Enabled/") {} 1279 }; 1280 1281 TEST_F(WebRtcVideoEngineTest, Flexfec03SendCodecEnablesWithoutFieldTrial) { 1282 encoder_factory_->AddSupportedVideoCodecType("VP8"); 1283 auto flexfec = Field("name", &Codec::name, "flexfec-03"); 1284 EXPECT_THAT(engine_->LegacySendCodecs(), Not(Contains(flexfec))); 1285 } 1286 1287 TEST_F(WebRtcVideoEngineTestWithFlexfec, 1288 Flexfec03SendCodecEnablesWithFieldTrial) { 1289 encoder_factory_->AddSupportedVideoCodecType("VP8"); 1290 auto flexfec = Field("name", &Codec::name, "flexfec-03"); 1291 EXPECT_THAT(engine_->LegacySendCodecs(), Contains(flexfec)); 1292 } 1293 1294 // Test that the FlexFEC "codec" gets assigned to the lower payload type range 1295 TEST_F(WebRtcVideoEngineTestWithFlexfec, Flexfec03LowerPayloadTypeRange) { 1296 encoder_factory_->AddSupportedVideoCodecType("VP8"); 1297 1298 auto flexfec = Field("name", &Codec::name, "flexfec-03"); 1299 1300 auto send_codecs = engine_->LegacySendCodecs(); 1301 auto it = std::find_if( 1302 send_codecs.begin(), send_codecs.end(), 1303 [](const Codec& codec) { return codec.name == "flexfec-03"; }); 1304 ASSERT_NE(it, send_codecs.end()); 1305 EXPECT_LE(35, it->id); 1306 EXPECT_GE(65, it->id); 1307 } 1308 1309 // Test that codecs are added in the order they are reported from the factory. 1310 TEST_F(WebRtcVideoEngineTest, ReportSupportedCodecs) { 1311 encoder_factory_->AddSupportedVideoCodecType("VP8"); 1312 const char* kFakeCodecName = "FakeCodec"; 1313 encoder_factory_->AddSupportedVideoCodecType(kFakeCodecName); 1314 1315 // The last reported codec should appear after the first codec in the vector. 1316 const size_t vp8_index = GetEngineCodecIndex("VP8"); 1317 const size_t fake_codec_index = GetEngineCodecIndex(kFakeCodecName); 1318 EXPECT_LT(vp8_index, fake_codec_index); 1319 } 1320 1321 // Test that a codec that was added after the engine was initialized 1322 // does show up in the codec list after it was added. 1323 TEST_F(WebRtcVideoEngineTest, ReportSupportedAddedCodec) { 1324 const char* kFakeExternalCodecName1 = "FakeExternalCodec1"; 1325 const char* kFakeExternalCodecName2 = "FakeExternalCodec2"; 1326 1327 // Set up external encoder factory with first codec, and initialize engine. 1328 encoder_factory_->AddSupportedVideoCodecType(kFakeExternalCodecName1); 1329 1330 std::vector<Codec> codecs_before(engine_->LegacySendCodecs()); 1331 1332 // Add second codec. 1333 encoder_factory_->AddSupportedVideoCodecType(kFakeExternalCodecName2); 1334 std::vector<Codec> codecs_after(engine_->LegacySendCodecs()); 1335 // The codec itself and RTX should have been added. 1336 EXPECT_EQ(codecs_before.size() + 2, codecs_after.size()); 1337 1338 // Check that both fake codecs are present and that the second fake codec 1339 // appears after the first fake codec. 1340 const size_t fake_codec_index1 = GetEngineCodecIndex(kFakeExternalCodecName1); 1341 const size_t fake_codec_index2 = GetEngineCodecIndex(kFakeExternalCodecName2); 1342 EXPECT_LT(fake_codec_index1, fake_codec_index2); 1343 } 1344 1345 TEST_F(WebRtcVideoEngineTest, ReportRtxForExternalCodec) { 1346 const char* kFakeCodecName = "FakeCodec"; 1347 encoder_factory_->AddSupportedVideoCodecType(kFakeCodecName); 1348 1349 const size_t fake_codec_index = GetEngineCodecIndex(kFakeCodecName); 1350 EXPECT_EQ("rtx", engine_->LegacySendCodecs().at(fake_codec_index + 1).name); 1351 } 1352 1353 TEST_F(WebRtcVideoEngineTest, RegisterDecodersIfSupported) { 1354 AddSupportedVideoCodecType("VP8"); 1355 VideoReceiverParameters parameters; 1356 parameters.codecs.push_back(GetEngineCodec("VP8")); 1357 1358 auto receive_channel = SetRecvParamsWithSupportedCodecs(parameters.codecs); 1359 1360 EXPECT_TRUE( 1361 receive_channel->AddRecvStream(StreamParams::CreateLegacy(kSsrc))); 1362 // Decoders are not created until they are used. 1363 time_controller_.AdvanceTime(TimeDelta::Zero()); 1364 EXPECT_EQ(0u, decoder_factory_->decoders().size()); 1365 1366 // Setting codecs of the same type should not reallocate the decoder. 1367 EXPECT_TRUE(receive_channel->SetReceiverParameters(parameters)); 1368 EXPECT_EQ(0, decoder_factory_->GetNumCreatedDecoders()); 1369 1370 // Remove stream previously added to free the external decoder instance. 1371 EXPECT_TRUE(receive_channel->RemoveRecvStream(kSsrc)); 1372 EXPECT_EQ(0u, decoder_factory_->decoders().size()); 1373 } 1374 1375 // Verifies that we can set up decoders. 1376 TEST_F(WebRtcVideoEngineTest, RegisterH264DecoderIfSupported) { 1377 // TODO(pbos): Do not assume that encoder/decoder support is symmetric. We 1378 // can't even query the WebRtcVideoDecoderFactory for supported codecs. 1379 // For now we add a FakeWebRtcVideoEncoderFactory to add H264 to supported 1380 // codecs. 1381 AddSupportedVideoCodecType("H264"); 1382 std::vector<Codec> codecs; 1383 codecs.push_back(GetEngineCodec("H264")); 1384 1385 auto receive_channel = SetRecvParamsWithSupportedCodecs(codecs); 1386 1387 EXPECT_TRUE( 1388 receive_channel->AddRecvStream(StreamParams::CreateLegacy(kSsrc))); 1389 // Decoders are not created until they are used. 1390 time_controller_.AdvanceTime(TimeDelta::Zero()); 1391 ASSERT_EQ(0u, decoder_factory_->decoders().size()); 1392 } 1393 1394 // Tests when GetSources is called with non-existing ssrc, it will return an 1395 // empty list of RtpSource without crashing. 1396 TEST_F(WebRtcVideoEngineTest, GetSourcesWithNonExistingSsrc) { 1397 // Setup an recv stream with `kSsrc`. 1398 AddSupportedVideoCodecType("VP8"); 1399 VideoReceiverParameters parameters; 1400 parameters.codecs.push_back(GetEngineCodec("VP8")); 1401 auto receive_channel = SetRecvParamsWithSupportedCodecs(parameters.codecs); 1402 1403 EXPECT_TRUE( 1404 receive_channel->AddRecvStream(StreamParams::CreateLegacy(kSsrc))); 1405 1406 // Call GetSources with |kSsrc + 1| which doesn't exist. 1407 std::vector<RtpSource> sources = receive_channel->GetSources(kSsrc + 1); 1408 EXPECT_EQ(0u, sources.size()); 1409 } 1410 1411 TEST(WebRtcVideoEngineNewVideoCodecFactoryTest, NullFactories) { 1412 std::unique_ptr<VideoEncoderFactory> encoder_factory; 1413 std::unique_ptr<VideoDecoderFactory> decoder_factory; 1414 FieldTrials trials = CreateTestFieldTrials(); 1415 WebRtcVideoEngine engine(std::move(encoder_factory), 1416 std::move(decoder_factory), trials); 1417 EXPECT_EQ(0u, engine.LegacySendCodecs().size()); 1418 EXPECT_EQ(0u, engine.LegacyRecvCodecs().size()); 1419 } 1420 1421 TEST(WebRtcVideoEngineNewVideoCodecFactoryTest, EmptyFactories) { 1422 // `engine` take ownership of the factories. 1423 MockVideoEncoderFactory* encoder_factory = new MockVideoEncoderFactory(); 1424 MockVideoDecoderFactory* decoder_factory = new MockVideoDecoderFactory(); 1425 FieldTrials trials = CreateTestFieldTrials(); 1426 WebRtcVideoEngine engine( 1427 (std::unique_ptr<VideoEncoderFactory>(encoder_factory)), 1428 (std::unique_ptr<VideoDecoderFactory>(decoder_factory)), trials); 1429 // TODO(kron): Change to Times(1) once send and receive codecs are changed 1430 // to be treated independently. 1431 EXPECT_CALL(*encoder_factory, GetSupportedFormats()).Times(1); 1432 EXPECT_EQ(0u, engine.LegacySendCodecs().size()); 1433 EXPECT_EQ(0u, engine.LegacyRecvCodecs().size()); 1434 EXPECT_CALL(*encoder_factory, Die()); 1435 EXPECT_CALL(*decoder_factory, Die()); 1436 } 1437 1438 // Test full behavior in the video engine when video codec factories of the new 1439 // type are injected supporting the single codec Vp8. Check the returned codecs 1440 // from the engine and that we will create a Vp8 encoder and decoder using the 1441 // new factories. 1442 TEST(WebRtcVideoEngineNewVideoCodecFactoryTest, Vp8) { 1443 // `engine` take ownership of the factories. 1444 MockVideoEncoderFactory* encoder_factory = new MockVideoEncoderFactory(); 1445 MockVideoDecoderFactory* decoder_factory = new MockVideoDecoderFactory(); 1446 std::unique_ptr<MockVideoBitrateAllocatorFactory> rate_allocator_factory = 1447 std::make_unique<MockVideoBitrateAllocatorFactory>(); 1448 EXPECT_CALL(*rate_allocator_factory, 1449 Create(_, Field(&VideoCodec::codecType, kVideoCodecVP8))) 1450 .WillOnce([] { return std::make_unique<MockVideoBitrateAllocator>(); }); 1451 FieldTrials trials = CreateTestFieldTrials(); 1452 WebRtcVideoEngine engine( 1453 (std::unique_ptr<VideoEncoderFactory>(encoder_factory)), 1454 (std::unique_ptr<VideoDecoderFactory>(decoder_factory)), trials); 1455 const SdpVideoFormat vp8_format("VP8"); 1456 const std::vector<SdpVideoFormat> supported_formats = {vp8_format}; 1457 EXPECT_CALL(*encoder_factory, GetSupportedFormats()) 1458 .WillRepeatedly(Return(supported_formats)); 1459 EXPECT_CALL(*decoder_factory, GetSupportedFormats()) 1460 .WillRepeatedly(Return(supported_formats)); 1461 1462 // Verify the codecs from the engine. 1463 const std::vector<Codec> engine_codecs = engine.LegacySendCodecs(); 1464 // Verify default codecs has been added correctly. 1465 EXPECT_EQ(5u, engine_codecs.size()); 1466 EXPECT_EQ("VP8", engine_codecs.at(0).name); 1467 1468 // RTX codec for VP8. 1469 EXPECT_EQ("rtx", engine_codecs.at(1).name); 1470 int vp8_associated_payload; 1471 EXPECT_TRUE(engine_codecs.at(1).GetParam(kCodecParamAssociatedPayloadType, 1472 &vp8_associated_payload)); 1473 EXPECT_EQ(vp8_associated_payload, engine_codecs.at(0).id); 1474 1475 EXPECT_EQ(kRedCodecName, engine_codecs.at(2).name); 1476 1477 // RTX codec for RED. 1478 EXPECT_EQ("rtx", engine_codecs.at(3).name); 1479 int red_associated_payload; 1480 EXPECT_TRUE(engine_codecs.at(3).GetParam(kCodecParamAssociatedPayloadType, 1481 &red_associated_payload)); 1482 EXPECT_EQ(red_associated_payload, engine_codecs.at(2).id); 1483 1484 EXPECT_EQ(kUlpfecCodecName, engine_codecs.at(4).name); 1485 1486 int associated_payload_type; 1487 EXPECT_TRUE(engine_codecs.at(1).GetParam(kCodecParamAssociatedPayloadType, 1488 &associated_payload_type)); 1489 EXPECT_EQ(engine_codecs.at(0).id, associated_payload_type); 1490 // Verify default parameters has been added to the VP8 codec. 1491 VerifyCodecHasDefaultFeedbackParams(engine_codecs.at(0), 1492 /*lntf_expected=*/false); 1493 1494 // Mock encoder creation. `engine` take ownership of the encoder. 1495 const SdpVideoFormat format("VP8"); 1496 EXPECT_CALL(*encoder_factory, Create(_, format)).WillOnce([&] { 1497 return std::make_unique<FakeWebRtcVideoEncoder>(nullptr); 1498 }); 1499 1500 // Expect no decoder to be created at this point. The decoder will only be 1501 // created if we receive payload data. 1502 EXPECT_CALL(*decoder_factory, Create).Times(0); 1503 1504 // Create a call. 1505 GlobalSimulatedTimeController time_controller(Timestamp::Millis(4711)); 1506 const Environment env = CreateTestEnvironment({.time = &time_controller}); 1507 CallConfig call_config(env); 1508 const std::unique_ptr<Call> call = Call::Create(std::move(call_config)); 1509 1510 // Create send channel. 1511 const int send_ssrc = 123; 1512 std::unique_ptr<VideoMediaSendChannelInterface> send_channel = 1513 engine.CreateSendChannel(env, call.get(), GetMediaConfig(), 1514 VideoOptions(), CryptoOptions(), 1515 rate_allocator_factory.get()); 1516 1517 VideoSenderParameters send_parameters; 1518 send_parameters.codecs.push_back(engine_codecs.at(0)); 1519 EXPECT_TRUE(send_channel->SetSenderParameters(send_parameters)); 1520 send_channel->OnReadyToSend(true); 1521 EXPECT_TRUE( 1522 send_channel->AddSendStream(StreamParams::CreateLegacy(send_ssrc))); 1523 EXPECT_TRUE(send_channel->SetSend(true)); 1524 1525 // Set capturer. 1526 FrameForwarder frame_forwarder; 1527 FakeFrameSource frame_source(1280, 720, kNumMicrosecsPerSec / 30); 1528 EXPECT_TRUE(send_channel->SetVideoSend(send_ssrc, nullptr, &frame_forwarder)); 1529 // Sending one frame will allocate the encoder. 1530 frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame()); 1531 time_controller.AdvanceTime(TimeDelta::Zero()); 1532 1533 // Create recv channel. 1534 const int recv_ssrc = 321; 1535 std::unique_ptr<VideoMediaReceiveChannelInterface> receive_channel = 1536 engine.CreateReceiveChannel(env, call.get(), GetMediaConfig(), 1537 VideoOptions(), CryptoOptions()); 1538 1539 VideoReceiverParameters recv_parameters; 1540 recv_parameters.codecs.push_back(engine_codecs.at(0)); 1541 EXPECT_TRUE(receive_channel->SetReceiverParameters(recv_parameters)); 1542 EXPECT_TRUE( 1543 receive_channel->AddRecvStream(StreamParams::CreateLegacy(recv_ssrc))); 1544 1545 // Remove streams previously added to free the encoder and decoder instance. 1546 EXPECT_CALL(*encoder_factory, Die()); 1547 EXPECT_CALL(*decoder_factory, Die()); 1548 EXPECT_CALL(*rate_allocator_factory, Die()); 1549 EXPECT_TRUE(send_channel->RemoveSendStream(send_ssrc)); 1550 EXPECT_TRUE(receive_channel->RemoveRecvStream(recv_ssrc)); 1551 } 1552 1553 TEST_F(WebRtcVideoEngineTest, DISABLED_RecreatesEncoderOnContentTypeChange) { 1554 encoder_factory_->AddSupportedVideoCodecType("VP8"); 1555 auto fake_call = std::make_unique<FakeCall>(env_); 1556 auto send_channel = SetSendParamsWithAllSupportedCodecs(); 1557 1558 ASSERT_TRUE(send_channel->AddSendStream(StreamParams::CreateLegacy(kSsrc))); 1559 Codec codec = GetEngineCodec("VP8"); 1560 VideoSenderParameters parameters; 1561 parameters.codecs.push_back(codec); 1562 send_channel->OnReadyToSend(true); 1563 send_channel->SetSend(true); 1564 ASSERT_TRUE(send_channel->SetSenderParameters(parameters)); 1565 1566 FrameForwarder frame_forwarder; 1567 FakeFrameSource frame_source(1280, 720, kNumMicrosecsPerSec / 30); 1568 VideoOptions options; 1569 EXPECT_TRUE(send_channel->SetVideoSend(kSsrc, &options, &frame_forwarder)); 1570 1571 frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame()); 1572 ASSERT_TRUE(encoder_factory_->WaitForCreatedVideoEncoders(1)); 1573 EXPECT_EQ(VideoCodecMode::kRealtimeVideo, 1574 encoder_factory_->encoders().back()->GetCodecSettings().mode); 1575 1576 EXPECT_TRUE(send_channel->SetVideoSend(kSsrc, &options, &frame_forwarder)); 1577 frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame()); 1578 // No change in content type, keep current encoder. 1579 EXPECT_EQ(1, encoder_factory_->GetNumCreatedEncoders()); 1580 1581 options.is_screencast.emplace(true); 1582 EXPECT_TRUE(send_channel->SetVideoSend(kSsrc, &options, &frame_forwarder)); 1583 frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame()); 1584 // Change to screen content, recreate encoder. For the simulcast encoder 1585 // adapter case, this will result in two calls since InitEncode triggers a 1586 // a new instance. 1587 ASSERT_TRUE(encoder_factory_->WaitForCreatedVideoEncoders(2)); 1588 EXPECT_EQ(VideoCodecMode::kScreensharing, 1589 encoder_factory_->encoders().back()->GetCodecSettings().mode); 1590 1591 EXPECT_TRUE(send_channel->SetVideoSend(kSsrc, &options, &frame_forwarder)); 1592 frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame()); 1593 // Still screen content, no need to update encoder. 1594 EXPECT_EQ(2, encoder_factory_->GetNumCreatedEncoders()); 1595 1596 options.is_screencast.emplace(false); 1597 options.video_noise_reduction.emplace(false); 1598 EXPECT_TRUE(send_channel->SetVideoSend(kSsrc, &options, &frame_forwarder)); 1599 // Change back to regular video content, update encoder. Also change 1600 // a non `is_screencast` option just to verify it doesn't affect recreation. 1601 frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame()); 1602 ASSERT_TRUE(encoder_factory_->WaitForCreatedVideoEncoders(3)); 1603 EXPECT_EQ(VideoCodecMode::kRealtimeVideo, 1604 encoder_factory_->encoders().back()->GetCodecSettings().mode); 1605 1606 // Remove stream previously added to free the external encoder instance. 1607 EXPECT_TRUE(send_channel->RemoveSendStream(kSsrc)); 1608 EXPECT_EQ(0u, encoder_factory_->encoders().size()); 1609 } 1610 1611 TEST_F(WebRtcVideoEngineTest, SetVideoRtxEnabled) { 1612 AddSupportedVideoCodecType("VP8"); 1613 std::vector<Codec> send_codecs; 1614 std::vector<Codec> recv_codecs; 1615 1616 // Don't want RTX 1617 send_codecs = engine_->LegacySendCodecs(false); 1618 EXPECT_FALSE(HasAnyRtxCodec(send_codecs)); 1619 recv_codecs = engine_->LegacyRecvCodecs(false); 1620 EXPECT_FALSE(HasAnyRtxCodec(recv_codecs)); 1621 1622 // Want RTX 1623 send_codecs = engine_->LegacySendCodecs(true); 1624 EXPECT_TRUE(HasAnyRtxCodec(send_codecs)); 1625 recv_codecs = engine_->LegacyRecvCodecs(true); 1626 EXPECT_TRUE(HasAnyRtxCodec(recv_codecs)); 1627 } 1628 1629 class WebRtcVideoChannelEncodedFrameCallbackTest : public ::testing::Test { 1630 protected: 1631 WebRtcVideoChannelEncodedFrameCallbackTest() 1632 : field_trials_(CreateTestFieldTrials()), 1633 env_(CreateTestEnvironment( 1634 {.field_trials = &field_trials_, .time = &time_controller_})), 1635 call_(Call::Create(CallConfig(env_))), 1636 video_bitrate_allocator_factory_( 1637 CreateBuiltinVideoBitrateAllocatorFactory()), 1638 engine_( 1639 std::make_unique< 1640 VideoEncoderFactoryTemplate<LibvpxVp8EncoderTemplateAdapter, 1641 LibvpxVp9EncoderTemplateAdapter, 1642 OpenH264EncoderTemplateAdapter, 1643 LibaomAv1EncoderTemplateAdapter>>(), 1644 std::make_unique<FunctionVideoDecoderFactory>( 1645 []() { return std::make_unique<test::FakeDecoder>(); }, 1646 kSdpVideoFormats), 1647 field_trials_) { 1648 send_channel_ = engine_.CreateSendChannel( 1649 env_, call_.get(), MediaConfig(), VideoOptions(), CryptoOptions(), 1650 video_bitrate_allocator_factory_.get()); 1651 receive_channel_ = engine_.CreateReceiveChannel( 1652 env_, call_.get(), MediaConfig(), VideoOptions(), CryptoOptions()); 1653 1654 network_interface_.SetDestination(receive_channel_.get()); 1655 send_channel_->SetInterface(&network_interface_); 1656 receive_channel_->SetInterface(&network_interface_); 1657 VideoReceiverParameters parameters; 1658 parameters.codecs = engine_.LegacyRecvCodecs(); 1659 receive_channel_->SetReceiverParameters(parameters); 1660 receive_channel_->SetReceive(true); 1661 } 1662 1663 ~WebRtcVideoChannelEncodedFrameCallbackTest() override { 1664 send_channel_->SetInterface(nullptr); 1665 receive_channel_->SetInterface(nullptr); 1666 send_channel_.reset(); 1667 receive_channel_.reset(); 1668 } 1669 1670 void DeliverKeyFrame(uint32_t ssrc) { 1671 receive_channel_->OnPacketReceived(BuildVp8KeyFrame(ssrc, 96)); 1672 } 1673 1674 void DeliverKeyFrameAndWait(uint32_t ssrc) { 1675 DeliverKeyFrame(ssrc); 1676 time_controller_.AdvanceTime(kFrameDuration); 1677 EXPECT_EQ(renderer_.num_rendered_frames(), 1); 1678 } 1679 1680 static const std::vector<SdpVideoFormat> kSdpVideoFormats; 1681 GlobalSimulatedTimeController time_controller_{Timestamp::Seconds(1000)}; 1682 FieldTrials field_trials_; 1683 Environment env_; 1684 std::unique_ptr<Call> call_; 1685 std::unique_ptr<VideoBitrateAllocatorFactory> 1686 video_bitrate_allocator_factory_; 1687 WebRtcVideoEngine engine_; 1688 std::unique_ptr<VideoMediaSendChannelInterface> send_channel_; 1689 std::unique_ptr<VideoMediaReceiveChannelInterface> receive_channel_; 1690 FakeNetworkInterface network_interface_; 1691 FakeVideoRenderer renderer_; 1692 }; 1693 1694 const std::vector<SdpVideoFormat> 1695 WebRtcVideoChannelEncodedFrameCallbackTest::kSdpVideoFormats = { 1696 SdpVideoFormat::VP8()}; 1697 1698 TEST_F(WebRtcVideoChannelEncodedFrameCallbackTest, 1699 SetEncodedFrameBufferFunction_DefaultStream) { 1700 testing::MockFunction<void(const RecordableEncodedFrame&)> callback; 1701 EXPECT_CALL(callback, Call); 1702 EXPECT_TRUE(receive_channel_->AddDefaultRecvStreamForTesting( 1703 StreamParams::CreateLegacy(kSsrc))); 1704 receive_channel_->SetRecordableEncodedFrameCallback(/*ssrc=*/0, 1705 callback.AsStdFunction()); 1706 EXPECT_TRUE(receive_channel_->SetSink(kSsrc, &renderer_)); 1707 DeliverKeyFrame(kSsrc); 1708 time_controller_.AdvanceTime(kFrameDuration); 1709 EXPECT_EQ(renderer_.num_rendered_frames(), 1); 1710 receive_channel_->RemoveRecvStream(kSsrc); 1711 } 1712 1713 TEST_F(WebRtcVideoChannelEncodedFrameCallbackTest, 1714 SetEncodedFrameBufferFunction_MatchSsrcWithDefaultStream) { 1715 testing::MockFunction<void(const RecordableEncodedFrame&)> callback; 1716 EXPECT_CALL(callback, Call); 1717 EXPECT_TRUE(receive_channel_->AddDefaultRecvStreamForTesting( 1718 StreamParams::CreateLegacy(kSsrc))); 1719 EXPECT_TRUE(receive_channel_->SetSink(kSsrc, &renderer_)); 1720 receive_channel_->SetRecordableEncodedFrameCallback(kSsrc, 1721 callback.AsStdFunction()); 1722 DeliverKeyFrame(kSsrc); 1723 time_controller_.AdvanceTime(kFrameDuration); 1724 EXPECT_EQ(renderer_.num_rendered_frames(), 1); 1725 receive_channel_->RemoveRecvStream(kSsrc); 1726 } 1727 1728 TEST_F(WebRtcVideoChannelEncodedFrameCallbackTest, 1729 SetEncodedFrameBufferFunction_MatchSsrc) { 1730 testing::MockFunction<void(const RecordableEncodedFrame&)> callback; 1731 EXPECT_CALL(callback, Call); 1732 EXPECT_TRUE( 1733 receive_channel_->AddRecvStream(StreamParams::CreateLegacy(kSsrc))); 1734 EXPECT_TRUE(receive_channel_->SetSink(kSsrc, &renderer_)); 1735 receive_channel_->SetRecordableEncodedFrameCallback(kSsrc, 1736 callback.AsStdFunction()); 1737 DeliverKeyFrame(kSsrc); 1738 time_controller_.AdvanceTime(kFrameDuration); 1739 EXPECT_EQ(renderer_.num_rendered_frames(), 1); 1740 receive_channel_->RemoveRecvStream(kSsrc); 1741 } 1742 1743 TEST_F(WebRtcVideoChannelEncodedFrameCallbackTest, 1744 SetEncodedFrameBufferFunction_MismatchSsrc) { 1745 testing::StrictMock< 1746 testing::MockFunction<void(const RecordableEncodedFrame&)>> 1747 callback; 1748 EXPECT_TRUE( 1749 receive_channel_->AddRecvStream(StreamParams::CreateLegacy(kSsrc + 1))); 1750 EXPECT_TRUE(receive_channel_->SetSink(kSsrc + 1, &renderer_)); 1751 receive_channel_->SetRecordableEncodedFrameCallback(kSsrc, 1752 callback.AsStdFunction()); 1753 DeliverKeyFrame(kSsrc); // Expected to not cause function to fire. 1754 DeliverKeyFrameAndWait(kSsrc + 1); 1755 receive_channel_->RemoveRecvStream(kSsrc + 1); 1756 } 1757 1758 TEST_F(WebRtcVideoChannelEncodedFrameCallbackTest, 1759 SetEncodedFrameBufferFunction_MismatchSsrcWithDefaultStream) { 1760 testing::StrictMock< 1761 testing::MockFunction<void(const RecordableEncodedFrame&)>> 1762 callback; 1763 EXPECT_TRUE(receive_channel_->AddDefaultRecvStreamForTesting( 1764 StreamParams::CreateLegacy(kSsrc + 1))); 1765 EXPECT_TRUE(receive_channel_->SetSink(kSsrc + 1, &renderer_)); 1766 receive_channel_->SetRecordableEncodedFrameCallback(kSsrc, 1767 callback.AsStdFunction()); 1768 receive_channel_->SetDefaultSink(&renderer_); 1769 DeliverKeyFrame(kSsrc); // Expected to not cause function to fire. 1770 DeliverKeyFrameAndWait(kSsrc + 1); 1771 receive_channel_->RemoveRecvStream(kSsrc + 1); 1772 } 1773 1774 TEST_F(WebRtcVideoChannelEncodedFrameCallbackTest, DoesNotDecodeWhenDisabled) { 1775 testing::MockFunction<void(const RecordableEncodedFrame&)> callback; 1776 EXPECT_CALL(callback, Call); 1777 EXPECT_TRUE(receive_channel_->AddDefaultRecvStreamForTesting( 1778 StreamParams::CreateLegacy(kSsrc))); 1779 receive_channel_->SetRecordableEncodedFrameCallback(/*ssrc=*/0, 1780 callback.AsStdFunction()); 1781 EXPECT_TRUE(receive_channel_->SetSink(kSsrc, &renderer_)); 1782 receive_channel_->SetReceive(false); 1783 DeliverKeyFrame(kSsrc); 1784 time_controller_.AdvanceTime(kFrameDuration); 1785 EXPECT_EQ(renderer_.num_rendered_frames(), 0); 1786 1787 receive_channel_->SetReceive(true); 1788 DeliverKeyFrame(kSsrc); 1789 time_controller_.AdvanceTime(kFrameDuration); 1790 EXPECT_EQ(renderer_.num_rendered_frames(), 1); 1791 1792 receive_channel_->SetReceive(false); 1793 DeliverKeyFrame(kSsrc); 1794 time_controller_.AdvanceTime(kFrameDuration); 1795 EXPECT_EQ(renderer_.num_rendered_frames(), 1); 1796 receive_channel_->RemoveRecvStream(kSsrc); 1797 } 1798 1799 class WebRtcVideoChannelBaseTest : public ::testing::Test { 1800 protected: 1801 WebRtcVideoChannelBaseTest() 1802 : field_trials_(CreateTestFieldTrials()), 1803 env_(CreateTestEnvironment({.field_trials = field_trials_.CreateCopy(), 1804 .time = &time_controller_})), 1805 video_bitrate_allocator_factory_( 1806 CreateBuiltinVideoBitrateAllocatorFactory()), 1807 engine_(std::make_unique<WebRtcVideoEngine>( 1808 std::make_unique< 1809 VideoEncoderFactoryTemplate<LibvpxVp8EncoderTemplateAdapter, 1810 LibvpxVp9EncoderTemplateAdapter, 1811 OpenH264EncoderTemplateAdapter, 1812 LibaomAv1EncoderTemplateAdapter>>(), 1813 std::make_unique< 1814 VideoDecoderFactoryTemplate<LibvpxVp8DecoderTemplateAdapter, 1815 LibvpxVp9DecoderTemplateAdapter, 1816 OpenH264DecoderTemplateAdapter, 1817 Dav1dDecoderTemplateAdapter>>(), 1818 env_.field_trials())) {} 1819 1820 void SetUp() override { 1821 // One testcase calls SetUp in a loop, only create call_ once. 1822 if (!call_) { 1823 call_ = Call::Create(CallConfig(env_)); 1824 } 1825 1826 MediaConfig media_config; 1827 // Disabling cpu overuse detection actually disables quality scaling too; it 1828 // implies DegradationPreference kMaintainResolution. Automatic scaling 1829 // needs to be disabled, otherwise, tests which check the size of received 1830 // frames become flaky. 1831 media_config.video.enable_cpu_adaptation = false; 1832 send_channel_ = engine_->CreateSendChannel( 1833 env_, call_.get(), media_config, VideoOptions(), CryptoOptions(), 1834 video_bitrate_allocator_factory_.get()); 1835 receive_channel_ = engine_->CreateReceiveChannel( 1836 env_, call_.get(), media_config, VideoOptions(), CryptoOptions()); 1837 send_channel_->OnReadyToSend(true); 1838 receive_channel_->SetReceive(true); 1839 network_interface_.SetDestination(receive_channel_.get()); 1840 send_channel_->SetInterface(&network_interface_); 1841 receive_channel_->SetInterface(&network_interface_); 1842 VideoReceiverParameters parameters; 1843 parameters.codecs = engine_->LegacySendCodecs(); 1844 receive_channel_->SetReceiverParameters(parameters); 1845 EXPECT_TRUE(send_channel_->AddSendStream(DefaultSendStreamParams())); 1846 frame_forwarder_ = std::make_unique<FrameForwarder>(); 1847 frame_source_ = std::make_unique<FakeFrameSource>( 1848 640, 480, kNumMicrosecsPerSec / kFramerate); 1849 EXPECT_TRUE( 1850 send_channel_->SetVideoSend(kSsrc, nullptr, frame_forwarder_.get())); 1851 } 1852 1853 // Returns pointer to implementation of the send channel. 1854 WebRtcVideoSendChannel* SendImpl() { 1855 // Note that this function requires intimate knowledge of how the channel 1856 // was created. 1857 return static_cast<WebRtcVideoSendChannel*>(send_channel_.get()); 1858 } 1859 1860 // Utility method to setup an additional stream to send and receive video. 1861 // Used to test send and recv between two streams. 1862 void SetUpSecondStream() { 1863 SetUpSecondStreamWithNoRecv(); 1864 // Setup recv for second stream. 1865 EXPECT_TRUE( 1866 receive_channel_->AddRecvStream(StreamParams::CreateLegacy(kSsrc + 2))); 1867 // Make the second renderer available for use by a new stream. 1868 EXPECT_TRUE(receive_channel_->SetSink(kSsrc + 2, &renderer2_)); 1869 } 1870 1871 // Setup an additional stream just to send video. Defer add recv stream. 1872 // This is required if you want to test unsignalled recv of video rtp packets. 1873 void SetUpSecondStreamWithNoRecv() { 1874 // SetUp() already added kSsrc make sure duplicate SSRCs cant be added. 1875 EXPECT_TRUE( 1876 receive_channel_->AddRecvStream(StreamParams::CreateLegacy(kSsrc))); 1877 EXPECT_TRUE(receive_channel_->SetSink(kSsrc, &renderer_)); 1878 EXPECT_FALSE( 1879 send_channel_->AddSendStream(StreamParams::CreateLegacy(kSsrc))); 1880 EXPECT_TRUE( 1881 send_channel_->AddSendStream(StreamParams::CreateLegacy(kSsrc + 2))); 1882 // We dont add recv for the second stream. 1883 1884 // Setup the receive and renderer for second stream after send. 1885 frame_forwarder_2_ = std::make_unique<FrameForwarder>(); 1886 EXPECT_TRUE(send_channel_->SetVideoSend(kSsrc + 2, nullptr, 1887 frame_forwarder_2_.get())); 1888 } 1889 1890 void TearDown() override { 1891 send_channel_->SetInterface(nullptr); 1892 receive_channel_->SetInterface(nullptr); 1893 send_channel_.reset(); 1894 receive_channel_.reset(); 1895 } 1896 1897 void ResetTest() { 1898 env_ = CreateTestEnvironment({.field_trials = field_trials_.CreateCopy(), 1899 .time = &time_controller_}); 1900 TearDown(); 1901 SetUp(); 1902 } 1903 1904 bool SetDefaultCodec() { return SetOneCodec(DefaultCodec()); } 1905 1906 bool SetOneCodec(const Codec& codec) { 1907 frame_source_ = std::make_unique<FakeFrameSource>( 1908 kVideoWidth, kVideoHeight, kNumMicrosecsPerSec / kFramerate); 1909 1910 bool sending = SendImpl()->sending(); 1911 bool success = SetSend(false); 1912 if (success) { 1913 VideoSenderParameters parameters; 1914 parameters.codecs.push_back(codec); 1915 success = send_channel_->SetSenderParameters(parameters); 1916 } 1917 if (success) { 1918 success = SetSend(sending); 1919 } 1920 return success; 1921 } 1922 bool SetSend(bool send) { return send_channel_->SetSend(send); } 1923 void SendFrame() { 1924 if (frame_forwarder_2_) { 1925 frame_forwarder_2_->IncomingCapturedFrame(frame_source_->GetFrame()); 1926 } 1927 frame_forwarder_->IncomingCapturedFrame(frame_source_->GetFrame()); 1928 time_controller_.AdvanceTime(kFrameDuration); 1929 } 1930 bool WaitAndSendFrame(int wait_ms) { 1931 time_controller_.AdvanceTime(TimeDelta::Millis(wait_ms)); 1932 SendFrame(); 1933 return true; 1934 } 1935 int NumRtpBytes() { return network_interface_.NumRtpBytes(); } 1936 int NumRtpBytes(uint32_t ssrc) { 1937 return network_interface_.NumRtpBytes(ssrc); 1938 } 1939 int NumRtpPackets() { return network_interface_.NumRtpPackets(); } 1940 int NumRtpPackets(uint32_t ssrc) { 1941 return network_interface_.NumRtpPackets(ssrc); 1942 } 1943 int NumSentSsrcs() { return network_interface_.NumSentSsrcs(); } 1944 CopyOnWriteBuffer GetRtpPacket(int index) { 1945 return network_interface_.GetRtpPacket(index); 1946 } 1947 static int GetPayloadType(CopyOnWriteBuffer p) { 1948 RtpPacket header; 1949 EXPECT_TRUE(header.Parse(std::move(p))); 1950 return header.PayloadType(); 1951 } 1952 1953 // Tests that we can send and receive frames. 1954 void SendAndReceive(const Codec& codec) { 1955 EXPECT_TRUE(SetOneCodec(codec)); 1956 EXPECT_TRUE(SetSend(true)); 1957 receive_channel_->SetDefaultSink(&renderer_); 1958 EXPECT_EQ(0, renderer_.num_rendered_frames()); 1959 SendFrame(); 1960 EXPECT_FRAME(1, kVideoWidth, kVideoHeight); 1961 EXPECT_EQ(codec.id, GetPayloadType(GetRtpPacket(0))); 1962 } 1963 1964 void SendReceiveManyAndGetStats(const Codec& codec, 1965 int duration_sec, 1966 int fps) { 1967 EXPECT_TRUE(SetOneCodec(codec)); 1968 EXPECT_TRUE(SetSend(true)); 1969 receive_channel_->SetDefaultSink(&renderer_); 1970 EXPECT_EQ(0, renderer_.num_rendered_frames()); 1971 for (int i = 0; i < duration_sec; ++i) { 1972 for (int frame = 1; frame <= fps; ++frame) { 1973 EXPECT_TRUE(WaitAndSendFrame(1000 / fps)); 1974 EXPECT_FRAME(frame + i * fps, kVideoWidth, kVideoHeight); 1975 } 1976 } 1977 EXPECT_EQ(codec.id, GetPayloadType(GetRtpPacket(0))); 1978 } 1979 1980 VideoSenderInfo GetSenderStats(size_t i) { 1981 VideoMediaSendInfo send_info; 1982 EXPECT_TRUE(send_channel_->GetStats(&send_info)); 1983 return send_info.senders[i]; 1984 } 1985 1986 VideoReceiverInfo GetReceiverStats(size_t i) { 1987 VideoMediaReceiveInfo info; 1988 EXPECT_TRUE(receive_channel_->GetStats(&info)); 1989 return info.receivers[i]; 1990 } 1991 1992 // Two streams one channel tests. 1993 1994 // Tests that we can send and receive frames. 1995 void TwoStreamsSendAndReceive(const Codec& codec) { 1996 SetUpSecondStream(); 1997 // Test sending and receiving on first stream. 1998 SendAndReceive(codec); 1999 // Test sending and receiving on second stream. 2000 EXPECT_EQ(renderer2_.num_rendered_frames(), 1); 2001 EXPECT_GT(NumRtpPackets(), 0); 2002 } 2003 2004 Codec GetEngineCodec(const std::string& name) { 2005 for (const Codec& engine_codec : engine_->LegacySendCodecs()) { 2006 if (absl::EqualsIgnoreCase(name, engine_codec.name)) 2007 return engine_codec; 2008 } 2009 // This point should never be reached. 2010 ADD_FAILURE() << "Unrecognized codec name: " << name; 2011 return CreateVideoCodec(0, ""); 2012 } 2013 2014 Codec DefaultCodec() { return GetEngineCodec("VP8"); } 2015 2016 StreamParams DefaultSendStreamParams() { 2017 return StreamParams::CreateLegacy(kSsrc); 2018 } 2019 2020 GlobalSimulatedTimeController time_controller_{Timestamp::Seconds(1000)}; 2021 2022 FieldTrials field_trials_; 2023 Environment env_; 2024 std::unique_ptr<Call> call_; 2025 std::unique_ptr<VideoBitrateAllocatorFactory> 2026 video_bitrate_allocator_factory_; 2027 std::unique_ptr<WebRtcVideoEngine> engine_; 2028 2029 std::unique_ptr<FakeFrameSource> frame_source_; 2030 std::unique_ptr<FrameForwarder> frame_forwarder_; 2031 std::unique_ptr<FrameForwarder> frame_forwarder_2_; 2032 2033 std::unique_ptr<VideoMediaSendChannelInterface> send_channel_; 2034 std::unique_ptr<VideoMediaReceiveChannelInterface> receive_channel_; 2035 FakeNetworkInterface network_interface_; 2036 FakeVideoRenderer renderer_; 2037 2038 // Used by test cases where 2 streams are run on the same channel. 2039 FakeVideoRenderer renderer2_; 2040 }; 2041 2042 // Test that SetSend works. 2043 TEST_F(WebRtcVideoChannelBaseTest, SetSend) { 2044 EXPECT_FALSE(SendImpl()->sending()); 2045 EXPECT_TRUE( 2046 send_channel_->SetVideoSend(kSsrc, nullptr, frame_forwarder_.get())); 2047 EXPECT_TRUE(SetOneCodec(DefaultCodec())); 2048 EXPECT_FALSE(SendImpl()->sending()); 2049 EXPECT_TRUE(SetSend(true)); 2050 EXPECT_TRUE(SendImpl()->sending()); 2051 SendFrame(); 2052 EXPECT_GT(NumRtpPackets(), 0); 2053 EXPECT_TRUE(SetSend(false)); 2054 EXPECT_FALSE(SendImpl()->sending()); 2055 } 2056 2057 // Test that SetSend fails without codecs being set. 2058 TEST_F(WebRtcVideoChannelBaseTest, SetSendWithoutCodecs) { 2059 EXPECT_FALSE(SendImpl()->sending()); 2060 EXPECT_FALSE(SetSend(true)); 2061 EXPECT_FALSE(SendImpl()->sending()); 2062 } 2063 2064 // Test that we properly set the send and recv buffer sizes by the time 2065 // SetSend is called. 2066 TEST_F(WebRtcVideoChannelBaseTest, SetSendSetsTransportBufferSizes) { 2067 EXPECT_TRUE(SetOneCodec(DefaultCodec())); 2068 EXPECT_TRUE(SetSend(true)); 2069 EXPECT_EQ(kVideoRtpSendBufferSize, network_interface_.sendbuf_size()); 2070 EXPECT_EQ(kVideoRtpRecvBufferSize, network_interface_.recvbuf_size()); 2071 } 2072 2073 // Test that stats work properly for a 1-1 call. 2074 TEST_F(WebRtcVideoChannelBaseTest, GetStats) { 2075 const int kDurationSec = 3; 2076 const int kFps = 10; 2077 SendReceiveManyAndGetStats(DefaultCodec(), kDurationSec, kFps); 2078 2079 VideoMediaSendInfo send_info; 2080 VideoMediaReceiveInfo receive_info; 2081 EXPECT_TRUE(send_channel_->GetStats(&send_info)); 2082 EXPECT_TRUE(receive_channel_->GetStats(&receive_info)); 2083 2084 ASSERT_EQ(1U, send_info.senders.size()); 2085 // TODO(whyuan): bytes_sent and bytes_received are different. Are both 2086 // payload? For webrtc, bytes_sent does not include the RTP header length. 2087 EXPECT_EQ(send_info.senders[0].payload_bytes_sent, 2088 NumRtpBytes() - kRtpHeaderSize * NumRtpPackets()); 2089 EXPECT_EQ(NumRtpPackets(), send_info.senders[0].packets_sent); 2090 EXPECT_EQ(0.0, send_info.senders[0].fraction_lost); 2091 ASSERT_TRUE(send_info.senders[0].codec_payload_type); 2092 EXPECT_EQ(DefaultCodec().id, *send_info.senders[0].codec_payload_type); 2093 EXPECT_EQ(0, send_info.senders[0].firs_received); 2094 EXPECT_EQ(0, send_info.senders[0].plis_received); 2095 EXPECT_EQ(0u, send_info.senders[0].nacks_received); 2096 EXPECT_EQ(kVideoWidth, send_info.senders[0].send_frame_width); 2097 EXPECT_EQ(kVideoHeight, send_info.senders[0].send_frame_height); 2098 EXPECT_GT(send_info.senders[0].framerate_input, 0); 2099 EXPECT_GT(send_info.senders[0].framerate_sent, 0); 2100 2101 EXPECT_EQ(1U, send_info.send_codecs.count(DefaultCodec().id)); 2102 EXPECT_EQ(DefaultCodec().ToCodecParameters(), 2103 send_info.send_codecs[DefaultCodec().id]); 2104 2105 ASSERT_EQ(1U, receive_info.receivers.size()); 2106 EXPECT_EQ(1U, send_info.senders[0].ssrcs().size()); 2107 EXPECT_EQ(1U, receive_info.receivers[0].ssrcs().size()); 2108 EXPECT_EQ(send_info.senders[0].ssrcs()[0], 2109 receive_info.receivers[0].ssrcs()[0]); 2110 ASSERT_TRUE(receive_info.receivers[0].codec_payload_type); 2111 EXPECT_EQ(DefaultCodec().id, *receive_info.receivers[0].codec_payload_type); 2112 EXPECT_EQ(NumRtpBytes() - kRtpHeaderSize * NumRtpPackets(), 2113 receive_info.receivers[0].payload_bytes_received); 2114 EXPECT_EQ(NumRtpPackets(), receive_info.receivers[0].packets_received); 2115 EXPECT_EQ(0, receive_info.receivers[0].packets_lost); 2116 // TODO(asapersson): Not set for webrtc. Handle missing stats. 2117 // EXPECT_EQ(0, receive_info.receivers[0].packets_concealed); 2118 EXPECT_EQ(0, receive_info.receivers[0].firs_sent); 2119 EXPECT_EQ(0, receive_info.receivers[0].plis_sent); 2120 EXPECT_EQ(0U, receive_info.receivers[0].nacks_sent); 2121 EXPECT_EQ(kVideoWidth, receive_info.receivers[0].frame_width); 2122 EXPECT_EQ(kVideoHeight, receive_info.receivers[0].frame_height); 2123 EXPECT_GT(receive_info.receivers[0].framerate_received, 0); 2124 EXPECT_GT(receive_info.receivers[0].framerate_decoded, 0); 2125 EXPECT_GT(receive_info.receivers[0].framerate_output, 0); 2126 EXPECT_GT(receive_info.receivers[0].jitter_buffer_delay_seconds, 0.0); 2127 EXPECT_GT(receive_info.receivers[0].jitter_buffer_emitted_count, 0u); 2128 2129 EXPECT_EQ(1U, receive_info.receive_codecs.count(DefaultCodec().id)); 2130 EXPECT_EQ(DefaultCodec().ToCodecParameters(), 2131 receive_info.receive_codecs[DefaultCodec().id]); 2132 } 2133 2134 // Test that stats work properly for a conf call with multiple recv streams. 2135 TEST_F(WebRtcVideoChannelBaseTest, GetStatsMultipleRecvStreams) { 2136 FakeVideoRenderer renderer1, renderer2; 2137 EXPECT_TRUE(SetOneCodec(DefaultCodec())); 2138 VideoSenderParameters parameters; 2139 parameters.codecs.push_back(DefaultCodec()); 2140 parameters.conference_mode = true; 2141 EXPECT_TRUE(send_channel_->SetSenderParameters(parameters)); 2142 EXPECT_TRUE(SetSend(true)); 2143 EXPECT_TRUE(receive_channel_->AddRecvStream(StreamParams::CreateLegacy(1))); 2144 EXPECT_TRUE(receive_channel_->AddRecvStream(StreamParams::CreateLegacy(2))); 2145 EXPECT_TRUE(receive_channel_->SetSink(1, &renderer1)); 2146 EXPECT_TRUE(receive_channel_->SetSink(2, &renderer2)); 2147 EXPECT_EQ(0, renderer1.num_rendered_frames()); 2148 EXPECT_EQ(0, renderer2.num_rendered_frames()); 2149 std::vector<uint32_t> ssrcs; 2150 ssrcs.push_back(1); 2151 ssrcs.push_back(2); 2152 network_interface_.SetConferenceMode(true, ssrcs); 2153 SendFrame(); 2154 EXPECT_FRAME_ON_RENDERER(renderer1, 1, kVideoWidth, kVideoHeight); 2155 EXPECT_FRAME_ON_RENDERER(renderer2, 1, kVideoWidth, kVideoHeight); 2156 2157 EXPECT_TRUE(send_channel_->SetSend(false)); 2158 2159 VideoMediaSendInfo send_info; 2160 VideoMediaReceiveInfo receive_info; 2161 EXPECT_TRUE(send_channel_->GetStats(&send_info)); 2162 EXPECT_TRUE(receive_channel_->GetStats(&receive_info)); 2163 2164 ASSERT_EQ(1U, send_info.senders.size()); 2165 // TODO(whyuan): bytes_sent and bytes_received are different. Are both 2166 // payload? For webrtc, bytes_sent does not include the RTP header length. 2167 EXPECT_EQ(NumRtpBytes() - kRtpHeaderSize * NumRtpPackets(), 2168 GetSenderStats(0).payload_bytes_sent); 2169 EXPECT_EQ(NumRtpPackets(), GetSenderStats(0).packets_sent); 2170 EXPECT_EQ(kVideoWidth, GetSenderStats(0).send_frame_width); 2171 EXPECT_EQ(kVideoHeight, GetSenderStats(0).send_frame_height); 2172 2173 ASSERT_EQ(2U, receive_info.receivers.size()); 2174 for (size_t i = 0; i < receive_info.receivers.size(); ++i) { 2175 EXPECT_EQ(1U, GetReceiverStats(i).ssrcs().size()); 2176 EXPECT_EQ(i + 1, GetReceiverStats(i).ssrcs()[0]); 2177 EXPECT_EQ(NumRtpBytes() - kRtpHeaderSize * NumRtpPackets(), 2178 GetReceiverStats(i).payload_bytes_received); 2179 EXPECT_EQ(NumRtpPackets(), GetReceiverStats(i).packets_received); 2180 EXPECT_EQ(kVideoWidth, GetReceiverStats(i).frame_width); 2181 EXPECT_EQ(kVideoHeight, GetReceiverStats(i).frame_height); 2182 } 2183 } 2184 2185 // Test that stats work properly for a conf call with multiple send streams. 2186 TEST_F(WebRtcVideoChannelBaseTest, GetStatsMultipleSendStreams) { 2187 // Normal setup; note that we set the SSRC explicitly to ensure that 2188 // it will come first in the senders map. 2189 EXPECT_TRUE(SetOneCodec(DefaultCodec())); 2190 VideoSenderParameters parameters; 2191 parameters.codecs.push_back(DefaultCodec()); 2192 parameters.conference_mode = true; 2193 EXPECT_TRUE(send_channel_->SetSenderParameters(parameters)); 2194 EXPECT_TRUE( 2195 receive_channel_->AddRecvStream(StreamParams::CreateLegacy(kSsrc))); 2196 EXPECT_TRUE(receive_channel_->SetSink(kSsrc, &renderer_)); 2197 EXPECT_TRUE(SetSend(true)); 2198 SendFrame(); 2199 EXPECT_GT(NumRtpPackets(), 0); 2200 EXPECT_FRAME(1, kVideoWidth, kVideoHeight); 2201 2202 // Add an additional capturer, and hook up a renderer to receive it. 2203 FakeVideoRenderer renderer2; 2204 FrameForwarder frame_forwarder; 2205 const int kTestWidth = 160; 2206 const int kTestHeight = 120; 2207 FakeFrameSource frame_source(kTestWidth, kTestHeight, 2208 kNumMicrosecsPerSec / 5); 2209 EXPECT_TRUE(send_channel_->AddSendStream(StreamParams::CreateLegacy(5678))); 2210 EXPECT_TRUE(send_channel_->SetVideoSend(5678, nullptr, &frame_forwarder)); 2211 EXPECT_TRUE( 2212 receive_channel_->AddRecvStream(StreamParams::CreateLegacy(5678))); 2213 EXPECT_TRUE(receive_channel_->SetSink(5678, &renderer2)); 2214 frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame()); 2215 time_controller_.AdvanceTime(kFrameDuration); 2216 EXPECT_FRAME_ON_RENDERER(renderer2, 1, kTestWidth, kTestHeight); 2217 2218 // Get stats, and make sure they are correct for two senders 2219 VideoMediaSendInfo send_info; 2220 EXPECT_TRUE(send_channel_->GetStats(&send_info)); 2221 2222 ASSERT_EQ(2U, send_info.senders.size()); 2223 2224 EXPECT_EQ(NumRtpPackets(), send_info.senders[0].packets_sent + 2225 send_info.senders[1].packets_sent); 2226 EXPECT_EQ(1U, send_info.senders[0].ssrcs().size()); 2227 EXPECT_EQ(1234U, send_info.senders[0].ssrcs()[0]); 2228 EXPECT_EQ(kVideoWidth, send_info.senders[0].send_frame_width); 2229 EXPECT_EQ(kVideoHeight, send_info.senders[0].send_frame_height); 2230 EXPECT_EQ(1U, send_info.senders[1].ssrcs().size()); 2231 EXPECT_EQ(5678U, send_info.senders[1].ssrcs()[0]); 2232 EXPECT_EQ(kTestWidth, send_info.senders[1].send_frame_width); 2233 EXPECT_EQ(kTestHeight, send_info.senders[1].send_frame_height); 2234 // The capturer must be unregistered here as it runs out of it's scope next. 2235 send_channel_->SetVideoSend(5678, nullptr, nullptr); 2236 } 2237 2238 TEST_F(WebRtcVideoChannelBaseTest, GetStatsDoesNotResetAfterCodecChange) { 2239 const int kDurationSec = 3; 2240 const int kFps = 10; 2241 SendReceiveManyAndGetStats(GetEngineCodec("VP9"), kDurationSec, kFps); 2242 2243 const Codec& new_codec = GetEngineCodec("VP8"); 2244 EXPECT_TRUE(SetOneCodec(new_codec)); 2245 EXPECT_TRUE(SetSend(true)); 2246 VideoMediaSendInfo send_info; 2247 EXPECT_TRUE(send_channel_->GetStats(&send_info)); 2248 ASSERT_EQ(1U, send_info.senders.size()); 2249 EXPECT_EQ(send_info.senders[0].payload_bytes_sent, 2250 NumRtpBytes() - kRtpHeaderSize * NumRtpPackets()); 2251 EXPECT_EQ(NumRtpPackets(), send_info.senders[0].packets_sent); 2252 ASSERT_TRUE(send_info.senders[0].codec_payload_type); 2253 EXPECT_EQ(new_codec.id, *send_info.senders[0].codec_payload_type); 2254 } 2255 2256 // Test that we can set the bandwidth. 2257 TEST_F(WebRtcVideoChannelBaseTest, SetSendBandwidth) { 2258 VideoSenderParameters parameters; 2259 parameters.codecs.push_back(DefaultCodec()); 2260 parameters.max_bandwidth_bps = -1; // <= 0 means unlimited. 2261 EXPECT_TRUE(send_channel_->SetSenderParameters(parameters)); 2262 parameters.max_bandwidth_bps = 128 * 1024; 2263 EXPECT_TRUE(send_channel_->SetSenderParameters(parameters)); 2264 } 2265 2266 // Test that we can set the SSRC for the default send source. 2267 TEST_F(WebRtcVideoChannelBaseTest, SetSendSsrc) { 2268 EXPECT_TRUE(SetDefaultCodec()); 2269 EXPECT_TRUE(SetSend(true)); 2270 SendFrame(); 2271 EXPECT_GT(NumRtpPackets(), 0); 2272 RtpPacket header; 2273 EXPECT_TRUE(header.Parse(GetRtpPacket(0))); 2274 EXPECT_EQ(kSsrc, header.Ssrc()); 2275 2276 // Packets are being paced out, so these can mismatch between the first and 2277 // second call to NumRtpPackets until pending packets are paced out. 2278 EXPECT_EQ(NumRtpPackets(), NumRtpPackets(header.Ssrc())); 2279 EXPECT_EQ(NumRtpBytes(), NumRtpBytes(header.Ssrc())); 2280 EXPECT_EQ(1, NumSentSsrcs()); 2281 EXPECT_EQ(0, NumRtpPackets(kSsrc - 1)); 2282 EXPECT_EQ(0, NumRtpBytes(kSsrc - 1)); 2283 } 2284 2285 // Test that we can set the SSRC even after codecs are set. 2286 TEST_F(WebRtcVideoChannelBaseTest, SetSendSsrcAfterSetCodecs) { 2287 // Remove stream added in Setup. 2288 EXPECT_TRUE(send_channel_->RemoveSendStream(kSsrc)); 2289 EXPECT_TRUE(SetDefaultCodec()); 2290 EXPECT_TRUE(send_channel_->AddSendStream(StreamParams::CreateLegacy(999))); 2291 EXPECT_TRUE( 2292 send_channel_->SetVideoSend(999u, nullptr, frame_forwarder_.get())); 2293 EXPECT_TRUE(SetSend(true)); 2294 EXPECT_TRUE(WaitAndSendFrame(0)); 2295 EXPECT_GT(NumRtpPackets(), 0); 2296 RtpPacket header; 2297 EXPECT_TRUE(header.Parse(GetRtpPacket(0))); 2298 EXPECT_EQ(999u, header.Ssrc()); 2299 // Packets are being paced out, so these can mismatch between the first and 2300 // second call to NumRtpPackets until pending packets are paced out. 2301 EXPECT_EQ(NumRtpPackets(), NumRtpPackets(header.Ssrc())); 2302 EXPECT_EQ(NumRtpBytes(), NumRtpBytes(header.Ssrc())); 2303 EXPECT_EQ(1, NumSentSsrcs()); 2304 EXPECT_EQ(0, NumRtpPackets(kSsrc)); 2305 EXPECT_EQ(0, NumRtpBytes(kSsrc)); 2306 } 2307 2308 // Test that we can set the default video renderer before and after 2309 // media is received. 2310 TEST_F(WebRtcVideoChannelBaseTest, SetSink) { 2311 RtpPacketReceived packet; 2312 packet.SetSsrc(kSsrc); 2313 receive_channel_->SetDefaultSink(nullptr); 2314 EXPECT_TRUE(SetDefaultCodec()); 2315 EXPECT_TRUE(SetSend(true)); 2316 EXPECT_EQ(0, renderer_.num_rendered_frames()); 2317 receive_channel_->SetDefaultSink(&renderer_); 2318 receive_channel_->OnPacketReceived(packet); 2319 SendFrame(); 2320 EXPECT_FRAME(1, kVideoWidth, kVideoHeight); 2321 } 2322 2323 // Tests setting up and configuring a send stream. 2324 TEST_F(WebRtcVideoChannelBaseTest, AddRemoveSendStreams) { 2325 EXPECT_TRUE(SetOneCodec(DefaultCodec())); 2326 EXPECT_TRUE(SetSend(true)); 2327 receive_channel_->SetDefaultSink(&renderer_); 2328 SendFrame(); 2329 EXPECT_FRAME(1, kVideoWidth, kVideoHeight); 2330 EXPECT_GT(NumRtpPackets(), 0); 2331 RtpPacket header; 2332 size_t last_packet = NumRtpPackets() - 1; 2333 EXPECT_TRUE(header.Parse(GetRtpPacket(static_cast<int>(last_packet)))); 2334 EXPECT_EQ(kSsrc, header.Ssrc()); 2335 2336 // Remove the send stream that was added during Setup. 2337 EXPECT_TRUE(send_channel_->RemoveSendStream(kSsrc)); 2338 int rtp_packets = NumRtpPackets(); 2339 2340 EXPECT_TRUE(send_channel_->AddSendStream(StreamParams::CreateLegacy(789u))); 2341 EXPECT_TRUE( 2342 send_channel_->SetVideoSend(789u, nullptr, frame_forwarder_.get())); 2343 EXPECT_EQ(rtp_packets, NumRtpPackets()); 2344 // Wait 30ms to guarantee the engine does not drop the frame. 2345 EXPECT_TRUE(WaitAndSendFrame(30)); 2346 EXPECT_GT(NumRtpPackets(), rtp_packets); 2347 2348 last_packet = NumRtpPackets() - 1; 2349 EXPECT_TRUE(header.Parse(GetRtpPacket(static_cast<int>(last_packet)))); 2350 EXPECT_EQ(789u, header.Ssrc()); 2351 } 2352 2353 // Tests the behavior of incoming streams in a conference scenario. 2354 TEST_F(WebRtcVideoChannelBaseTest, SimulateConference) { 2355 FakeVideoRenderer renderer1, renderer2; 2356 EXPECT_TRUE(SetDefaultCodec()); 2357 VideoSenderParameters parameters; 2358 parameters.codecs.push_back(DefaultCodec()); 2359 parameters.conference_mode = true; 2360 EXPECT_TRUE(send_channel_->SetSenderParameters(parameters)); 2361 EXPECT_TRUE(SetSend(true)); 2362 EXPECT_TRUE(receive_channel_->AddRecvStream(StreamParams::CreateLegacy(1))); 2363 EXPECT_TRUE(receive_channel_->AddRecvStream(StreamParams::CreateLegacy(2))); 2364 EXPECT_TRUE(receive_channel_->SetSink(1, &renderer1)); 2365 EXPECT_TRUE(receive_channel_->SetSink(2, &renderer2)); 2366 EXPECT_EQ(0, renderer1.num_rendered_frames()); 2367 EXPECT_EQ(0, renderer2.num_rendered_frames()); 2368 std::vector<uint32_t> ssrcs; 2369 ssrcs.push_back(1); 2370 ssrcs.push_back(2); 2371 network_interface_.SetConferenceMode(true, ssrcs); 2372 SendFrame(); 2373 EXPECT_FRAME_ON_RENDERER(renderer1, 1, kVideoWidth, kVideoHeight); 2374 EXPECT_FRAME_ON_RENDERER(renderer2, 1, kVideoWidth, kVideoHeight); 2375 2376 EXPECT_EQ(DefaultCodec().id, GetPayloadType(GetRtpPacket(0))); 2377 EXPECT_EQ(kVideoWidth, renderer1.width()); 2378 EXPECT_EQ(kVideoHeight, renderer1.height()); 2379 EXPECT_EQ(kVideoWidth, renderer2.width()); 2380 EXPECT_EQ(kVideoHeight, renderer2.height()); 2381 EXPECT_TRUE(receive_channel_->RemoveRecvStream(2)); 2382 EXPECT_TRUE(receive_channel_->RemoveRecvStream(1)); 2383 } 2384 2385 // Tests that we can add and remove capturers and frames are sent out properly 2386 TEST_F(WebRtcVideoChannelBaseTest, DISABLED_AddRemoveCapturer) { 2387 Codec codec = DefaultCodec(); 2388 const int time_between_send_ms = VideoFormat::FpsToInterval(kFramerate); 2389 EXPECT_TRUE(SetOneCodec(codec)); 2390 EXPECT_TRUE(SetSend(true)); 2391 receive_channel_->SetDefaultSink(&renderer_); 2392 EXPECT_EQ(0, renderer_.num_rendered_frames()); 2393 SendFrame(); 2394 EXPECT_FRAME(1, kVideoWidth, kVideoHeight); 2395 2396 FrameForwarder frame_forwarder; 2397 FakeFrameSource frame_source(480, 360, kNumMicrosecsPerSec / 30, 2398 kNumMicrosecsPerSec / 30); 2399 2400 // TODO(nisse): This testcase fails if we don't configure 2401 // screencast. It's unclear why, I see nothing obvious in this 2402 // test which is related to screencast logic. 2403 VideoOptions video_options; 2404 video_options.is_screencast = true; 2405 send_channel_->SetVideoSend(kSsrc, &video_options, nullptr); 2406 2407 int captured_frames = 1; 2408 for (int iterations = 0; iterations < 2; ++iterations) { 2409 EXPECT_TRUE(send_channel_->SetVideoSend(kSsrc, nullptr, &frame_forwarder)); 2410 time_controller_.AdvanceTime(TimeDelta::Millis(time_between_send_ms)); 2411 frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame()); 2412 2413 ++captured_frames; 2414 // Check if the right size was captured. 2415 EXPECT_TRUE(renderer_.num_rendered_frames() >= captured_frames && 2416 480 == renderer_.width() && 360 == renderer_.height() && 2417 !renderer_.black_frame()); 2418 EXPECT_GE(renderer_.num_rendered_frames(), captured_frames); 2419 EXPECT_EQ(480, renderer_.width()); 2420 EXPECT_EQ(360, renderer_.height()); 2421 captured_frames = renderer_.num_rendered_frames() + 1; 2422 EXPECT_FALSE(renderer_.black_frame()); 2423 EXPECT_TRUE(send_channel_->SetVideoSend(kSsrc, nullptr, nullptr)); 2424 // Make sure a black frame was generated. 2425 // The black frame should have the resolution of the previous frame to 2426 // prevent expensive encoder reconfigurations. 2427 EXPECT_TRUE(renderer_.num_rendered_frames() >= captured_frames && 2428 480 == renderer_.width() && 360 == renderer_.height() && 2429 renderer_.black_frame()); 2430 EXPECT_GE(renderer_.num_rendered_frames(), captured_frames); 2431 EXPECT_EQ(480, renderer_.width()); 2432 EXPECT_EQ(360, renderer_.height()); 2433 EXPECT_TRUE(renderer_.black_frame()); 2434 2435 // The black frame has the same timestamp as the next frame since it's 2436 // timestamp is set to the last frame's timestamp + interval. WebRTC will 2437 // not render a frame with the same timestamp so capture another frame 2438 // with the frame capturer to increment the next frame's timestamp. 2439 frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame()); 2440 } 2441 } 2442 2443 // Tests that if SetVideoSend is called with a NULL capturer after the 2444 // capturer was already removed, the application doesn't crash (and no black 2445 // frame is sent). 2446 TEST_F(WebRtcVideoChannelBaseTest, RemoveCapturerWithoutAdd) { 2447 EXPECT_TRUE(SetOneCodec(DefaultCodec())); 2448 EXPECT_TRUE(SetSend(true)); 2449 receive_channel_->SetDefaultSink(&renderer_); 2450 EXPECT_EQ(0, renderer_.num_rendered_frames()); 2451 SendFrame(); 2452 EXPECT_FRAME(1, kVideoWidth, kVideoHeight); 2453 // Allow one frame so they don't get dropped because we send frames too 2454 // tightly. 2455 time_controller_.AdvanceTime(kFrameDuration); 2456 // Remove the capturer. 2457 EXPECT_TRUE(send_channel_->SetVideoSend(kSsrc, nullptr, nullptr)); 2458 2459 // No capturer was added, so this SetVideoSend shouldn't do anything. 2460 EXPECT_TRUE(send_channel_->SetVideoSend(kSsrc, nullptr, nullptr)); 2461 time_controller_.AdvanceTime(TimeDelta::Millis(300)); 2462 // Verify no more frames were sent. 2463 EXPECT_EQ(1, renderer_.num_rendered_frames()); 2464 } 2465 2466 // Tests that we can add and remove capturer as unique sources. 2467 TEST_F(WebRtcVideoChannelBaseTest, AddRemoveCapturerMultipleSources) { 2468 // Set up the stream associated with the engine. 2469 EXPECT_TRUE( 2470 receive_channel_->AddRecvStream(StreamParams::CreateLegacy(kSsrc))); 2471 EXPECT_TRUE(receive_channel_->SetSink(kSsrc, &renderer_)); 2472 VideoFormat capture_format(kVideoWidth, kVideoHeight, 2473 VideoFormat::FpsToInterval(kFramerate), 2474 FOURCC_I420); 2475 // Set up additional stream 1. 2476 FakeVideoRenderer renderer1; 2477 EXPECT_FALSE(receive_channel_->SetSink(1, &renderer1)); 2478 EXPECT_TRUE(receive_channel_->AddRecvStream(StreamParams::CreateLegacy(1))); 2479 EXPECT_TRUE(receive_channel_->SetSink(1, &renderer1)); 2480 EXPECT_TRUE(send_channel_->AddSendStream(StreamParams::CreateLegacy(1))); 2481 2482 FrameForwarder frame_forwarder1; 2483 FakeFrameSource frame_source(kVideoWidth, kVideoHeight, 2484 kNumMicrosecsPerSec / kFramerate); 2485 2486 // Set up additional stream 2. 2487 FakeVideoRenderer renderer2; 2488 EXPECT_FALSE(receive_channel_->SetSink(2, &renderer2)); 2489 EXPECT_TRUE(receive_channel_->AddRecvStream(StreamParams::CreateLegacy(2))); 2490 EXPECT_TRUE(receive_channel_->SetSink(2, &renderer2)); 2491 EXPECT_TRUE(send_channel_->AddSendStream(StreamParams::CreateLegacy(2))); 2492 FrameForwarder frame_forwarder2; 2493 2494 // State for all the streams. 2495 EXPECT_TRUE(SetOneCodec(DefaultCodec())); 2496 // A limitation in the lmi implementation requires that SetVideoSend() is 2497 // called after SetOneCodec(). 2498 // TODO(hellner): this seems like an unnecessary constraint, fix it. 2499 EXPECT_TRUE(send_channel_->SetVideoSend(1, nullptr, &frame_forwarder1)); 2500 EXPECT_TRUE(send_channel_->SetVideoSend(2, nullptr, &frame_forwarder2)); 2501 EXPECT_TRUE(SetSend(true)); 2502 // Test capturer associated with engine. 2503 const int kTestWidth = 160; 2504 const int kTestHeight = 120; 2505 frame_forwarder1.IncomingCapturedFrame(frame_source.GetFrame( 2506 kTestWidth, kTestHeight, VideoRotation::kVideoRotation_0, 2507 kNumMicrosecsPerSec / kFramerate)); 2508 time_controller_.AdvanceTime(kFrameDuration); 2509 EXPECT_FRAME_ON_RENDERER(renderer1, 1, kTestWidth, kTestHeight); 2510 // Capture a frame with additional capturer2, frames should be received 2511 frame_forwarder2.IncomingCapturedFrame(frame_source.GetFrame( 2512 kTestWidth, kTestHeight, VideoRotation::kVideoRotation_0, 2513 kNumMicrosecsPerSec / kFramerate)); 2514 time_controller_.AdvanceTime(kFrameDuration); 2515 EXPECT_FRAME_ON_RENDERER(renderer2, 1, kTestWidth, kTestHeight); 2516 // Successfully remove the capturer. 2517 EXPECT_TRUE(send_channel_->SetVideoSend(kSsrc, nullptr, nullptr)); 2518 // The capturers must be unregistered here as it runs out of it's scope 2519 // next. 2520 EXPECT_TRUE(send_channel_->SetVideoSend(1, nullptr, nullptr)); 2521 EXPECT_TRUE(send_channel_->SetVideoSend(2, nullptr, nullptr)); 2522 } 2523 2524 // Tests empty StreamParams is rejected. 2525 TEST_F(WebRtcVideoChannelBaseTest, RejectEmptyStreamParams) { 2526 // Remove the send stream that was added during Setup. 2527 EXPECT_TRUE(send_channel_->RemoveSendStream(kSsrc)); 2528 2529 StreamParams empty; 2530 EXPECT_FALSE(send_channel_->AddSendStream(empty)); 2531 EXPECT_TRUE(send_channel_->AddSendStream(StreamParams::CreateLegacy(789u))); 2532 } 2533 2534 // Test that multiple send streams can be created and deleted properly. 2535 TEST_F(WebRtcVideoChannelBaseTest, MultipleSendStreams) { 2536 // Remove stream added in Setup. I.e. remove stream corresponding to default 2537 // channel. 2538 EXPECT_TRUE(send_channel_->RemoveSendStream(kSsrc)); 2539 const unsigned int kSsrcsSize = sizeof(kSsrcs4) / sizeof(kSsrcs4[0]); 2540 for (unsigned int i = 0; i < kSsrcsSize; ++i) { 2541 EXPECT_TRUE( 2542 send_channel_->AddSendStream(StreamParams::CreateLegacy(kSsrcs4[i]))); 2543 } 2544 // Delete one of the non default channel streams, let the destructor delete 2545 // the remaining ones. 2546 EXPECT_TRUE(send_channel_->RemoveSendStream(kSsrcs4[kSsrcsSize - 1])); 2547 // Stream should already be deleted. 2548 EXPECT_FALSE(send_channel_->RemoveSendStream(kSsrcs4[kSsrcsSize - 1])); 2549 } 2550 2551 TEST_F(WebRtcVideoChannelBaseTest, SendAndReceiveVp8Vga) { 2552 SendAndReceive(GetEngineCodec("VP8")); 2553 } 2554 2555 TEST_F(WebRtcVideoChannelBaseTest, SendAndReceiveVp8Qvga) { 2556 SendAndReceive(GetEngineCodec("VP8")); 2557 } 2558 2559 TEST_F(WebRtcVideoChannelBaseTest, SendAndReceiveVp8SvcQqvga) { 2560 SendAndReceive(GetEngineCodec("VP8")); 2561 } 2562 2563 TEST_F(WebRtcVideoChannelBaseTest, TwoStreamsSendAndReceive) { 2564 // Set a high bitrate to not be downscaled by VP8 due to low initial start 2565 // bitrates. This currently happens at <250k, and two streams sharing 300k 2566 // initially will use QVGA instead of VGA. 2567 // TODO(pbos): Set up the quality scaler so that both senders reliably start 2568 // at QVGA, then verify that instead. 2569 Codec codec = GetEngineCodec("VP8"); 2570 codec.params[kCodecParamStartBitrate] = "1000000"; 2571 TwoStreamsSendAndReceive(codec); 2572 } 2573 2574 TEST_F(WebRtcVideoChannelBaseTest, 2575 RequestEncoderFallbackNextCodecFollowNegotiatedOrder) { 2576 field_trials_.Set("WebRTC-SwitchEncoderFollowCodecPreferenceOrder", 2577 "Enabled"); 2578 VideoSenderParameters parameters; 2579 parameters.codecs.push_back(GetEngineCodec("VP9")); 2580 parameters.codecs.push_back(GetEngineCodec("AV1")); 2581 parameters.codecs.push_back(GetEngineCodec("VP8")); 2582 EXPECT_TRUE(send_channel_->SetSenderParameters(parameters)); 2583 2584 std::optional<Codec> codec = send_channel_->GetSendCodec(); 2585 ASSERT_TRUE(codec); 2586 EXPECT_EQ("VP9", codec->name); 2587 2588 SendImpl()->RequestEncoderFallback(); 2589 time_controller_.AdvanceTime(kFrameDuration); 2590 codec = send_channel_->GetSendCodec(); 2591 ASSERT_TRUE(codec); 2592 EXPECT_EQ("AV1", codec->name); 2593 2594 SendImpl()->RequestEncoderFallback(); 2595 time_controller_.AdvanceTime(kFrameDuration); 2596 codec = send_channel_->GetSendCodec(); 2597 ASSERT_TRUE(codec); 2598 EXPECT_EQ("VP8", codec->name); 2599 2600 SendImpl()->RequestEncoderFallback(); 2601 time_controller_.AdvanceTime(kFrameDuration); 2602 2603 FrameForwarder frame_forwarder; 2604 EXPECT_TRUE(send_channel_->SetVideoSend(kSsrc, nullptr, &frame_forwarder)); 2605 EXPECT_TRUE(send_channel_->RemoveSendStream(kSsrc)); 2606 } 2607 2608 #if defined(RTC_ENABLE_VP9) 2609 2610 TEST_F(WebRtcVideoChannelBaseTest, RequestEncoderFallback) { 2611 VideoSenderParameters parameters; 2612 parameters.codecs.push_back(GetEngineCodec("VP9")); 2613 parameters.codecs.push_back(GetEngineCodec("VP8")); 2614 EXPECT_TRUE(send_channel_->SetSenderParameters(parameters)); 2615 2616 std::optional<Codec> codec = send_channel_->GetSendCodec(); 2617 ASSERT_TRUE(codec); 2618 EXPECT_EQ("VP9", codec->name); 2619 2620 // RequestEncoderFallback will post a task to the worker thread (which is also 2621 // the current thread), hence the ProcessMessages call. 2622 SendImpl()->RequestEncoderFallback(); 2623 time_controller_.AdvanceTime(kFrameDuration); 2624 codec = send_channel_->GetSendCodec(); 2625 ASSERT_TRUE(codec); 2626 EXPECT_EQ("VP8", codec->name); 2627 2628 // No other codec to fall back to, keep using VP8. 2629 SendImpl()->RequestEncoderFallback(); 2630 time_controller_.AdvanceTime(kFrameDuration); 2631 codec = send_channel_->GetSendCodec(); 2632 ASSERT_TRUE(codec); 2633 EXPECT_EQ("VP8", codec->name); 2634 } 2635 2636 TEST_F(WebRtcVideoChannelBaseTest, RequestEncoderSwitchDefaultFallback) { 2637 VideoSenderParameters parameters; 2638 parameters.codecs.push_back(GetEngineCodec("VP9")); 2639 parameters.codecs.push_back(GetEngineCodec("VP8")); 2640 EXPECT_TRUE(send_channel_->SetSenderParameters(parameters)); 2641 2642 std::optional<Codec> codec = send_channel_->GetSendCodec(); 2643 ASSERT_TRUE(codec); 2644 EXPECT_EQ("VP9", codec->name); 2645 2646 // RequestEncoderSwitch will post a task to the worker thread (which is also 2647 // the current thread), hence the ProcessMessages call. 2648 SendImpl()->RequestEncoderSwitch(SdpVideoFormat("UnavailableCodec"), 2649 /*allow_default_fallback=*/true); 2650 time_controller_.AdvanceTime(kFrameDuration); 2651 2652 // Requested encoder is not available. Default fallback is allowed. Switch to 2653 // the next negotiated codec, VP8. 2654 codec = send_channel_->GetSendCodec(); 2655 ASSERT_TRUE(codec); 2656 EXPECT_EQ("VP8", codec->name); 2657 } 2658 2659 TEST_F(WebRtcVideoChannelBaseTest, RequestEncoderSwitchStrictPreference) { 2660 Codec vp9 = GetEngineCodec("VP9"); 2661 vp9.params["profile-id"] = "0"; 2662 2663 VideoSenderParameters parameters; 2664 parameters.codecs.push_back(GetEngineCodec("VP8")); 2665 parameters.codecs.push_back(vp9); 2666 EXPECT_TRUE(send_channel_->SetSenderParameters(parameters)); 2667 2668 std::optional<Codec> codec = send_channel_->GetSendCodec(); 2669 ASSERT_TRUE(codec); 2670 EXPECT_EQ("VP8", codec->name); 2671 2672 SendImpl()->RequestEncoderSwitch(SdpVideoFormat::VP9Profile1(), 2673 /*allow_default_fallback=*/false); 2674 time_controller_.AdvanceTime(kFrameDuration); 2675 2676 // VP9 profile_id=1 is not available. Default fallback is not allowed. Switch 2677 // is not performed. 2678 codec = send_channel_->GetSendCodec(); 2679 ASSERT_TRUE(codec); 2680 EXPECT_EQ("VP8", codec->name); 2681 2682 SendImpl()->RequestEncoderSwitch(SdpVideoFormat::VP9Profile0(), 2683 /*allow_default_fallback=*/false); 2684 time_controller_.AdvanceTime(kFrameDuration); 2685 2686 // VP9 profile_id=0 is available. Switch encoder. 2687 codec = send_channel_->GetSendCodec(); 2688 ASSERT_TRUE(codec); 2689 EXPECT_EQ("VP9", codec->name); 2690 } 2691 2692 TEST_F(WebRtcVideoChannelBaseTest, SendCodecIsMovedToFrontInRtpParameters) { 2693 VideoSenderParameters parameters; 2694 parameters.codecs.push_back(GetEngineCodec("VP9")); 2695 parameters.codecs.push_back(GetEngineCodec("VP8")); 2696 EXPECT_TRUE(send_channel_->SetSenderParameters(parameters)); 2697 2698 auto send_codecs = send_channel_->GetRtpSendParameters(kSsrc).codecs; 2699 ASSERT_EQ(send_codecs.size(), 2u); 2700 EXPECT_THAT("VP9", send_codecs[0].name); 2701 2702 // RequestEncoderFallback will post a task to the worker thread (which is also 2703 // the current thread), hence the ProcessMessages call. 2704 SendImpl()->RequestEncoderFallback(); 2705 time_controller_.AdvanceTime(kFrameDuration); 2706 2707 send_codecs = send_channel_->GetRtpSendParameters(kSsrc).codecs; 2708 ASSERT_EQ(send_codecs.size(), 2u); 2709 EXPECT_THAT("VP8", send_codecs[0].name); 2710 } 2711 2712 #endif // defined(RTC_ENABLE_VP9) 2713 2714 class WebRtcVideoChannelTest : public WebRtcVideoEngineTest { 2715 public: 2716 WebRtcVideoChannelTest() : WebRtcVideoChannelTest("") {} 2717 explicit WebRtcVideoChannelTest(const char* field_trials) 2718 : WebRtcVideoEngineTest(field_trials), 2719 frame_source_(1280, 720, kNumMicrosecsPerSec / 30), 2720 last_ssrc_(0) {} 2721 void SetUp() override { 2722 AddSupportedVideoCodecType("VP8"); 2723 AddSupportedVideoCodecType("VP9"); 2724 AddSupportedVideoCodecType( 2725 "AV1", {ScalabilityMode::kL1T3, ScalabilityMode::kL2T3}); 2726 #if defined(WEBRTC_USE_H264) 2727 AddSupportedVideoCodecType("H264"); 2728 #endif 2729 2730 fake_call_ = std::make_unique<FakeCall>(env_); 2731 send_channel_ = engine_->CreateSendChannel( 2732 env_, fake_call_.get(), GetMediaConfig(), VideoOptions(), 2733 CryptoOptions(), video_bitrate_allocator_factory_.get()); 2734 receive_channel_ = 2735 engine_->CreateReceiveChannel(env_, fake_call_.get(), GetMediaConfig(), 2736 VideoOptions(), CryptoOptions()); 2737 send_channel_->SetSsrcListChangedCallback( 2738 [receive_channel = 2739 receive_channel_.get()](const std::set<uint32_t>& choices) { 2740 receive_channel->ChooseReceiverReportSsrc(choices); 2741 }); 2742 send_channel_->SetSendCodecChangedCallback([this]() { 2743 receive_channel_->SetReceiverFeedbackParameters( 2744 send_channel_->SendCodecHasLntf(), send_channel_->SendCodecHasNack(), 2745 send_channel_->SendCodecRtcpMode(), 2746 send_channel_->SendCodecRtxTime()); 2747 }); 2748 send_channel_->OnReadyToSend(true); 2749 receive_channel_->SetReceive(true); 2750 last_ssrc_ = 123; 2751 send_parameters_.codecs = engine_->LegacySendCodecs(); 2752 recv_parameters_.codecs = engine_->LegacyRecvCodecs(); 2753 ASSERT_TRUE(send_channel_->SetSenderParameters(send_parameters_)); 2754 } 2755 2756 void TearDown() override { 2757 send_channel_->SetInterface(nullptr); 2758 receive_channel_->SetInterface(nullptr); 2759 send_channel_.reset(); 2760 receive_channel_.reset(); 2761 fake_call_ = nullptr; 2762 } 2763 2764 void ResetTest() { 2765 TearDown(); 2766 WebRtcVideoEngineTest::ChangeFieldTrials("", ""); 2767 SetUp(); 2768 } 2769 2770 // Returns pointer to implementation of the send channel. 2771 WebRtcVideoSendChannel* SendImpl() { 2772 // Note that this function requires intimate knowledge of how the channel 2773 // was created. 2774 return static_cast<WebRtcVideoSendChannel*>(send_channel_.get()); 2775 } 2776 2777 // Casts a shim channel to a Transport. Used once. 2778 Transport* ChannelImplAsTransport(VideoMediaSendChannelInterface* channel) { 2779 return static_cast<WebRtcVideoSendChannel*>(channel)->transport(); 2780 } 2781 2782 Codec GetEngineCodec(const std::string& name) { 2783 for (const Codec& engine_codec : engine_->LegacySendCodecs()) { 2784 if (absl::EqualsIgnoreCase(name, engine_codec.name)) 2785 return engine_codec; 2786 } 2787 // This point should never be reached. 2788 ADD_FAILURE() << "Unrecognized codec name: " << name; 2789 return CreateVideoCodec(0, ""); 2790 } 2791 2792 Codec DefaultCodec() { return GetEngineCodec("VP8"); } 2793 2794 // After receciving and processing the packet, enough time is advanced that 2795 // the unsignalled receive stream cooldown is no longer in effect. 2796 void ReceivePacketAndAdvanceTime(const RtpPacketReceived& packet) { 2797 receive_channel_->OnPacketReceived(packet); 2798 time_controller_.AdvanceTime( 2799 TimeDelta::Millis(kUnsignalledReceiveStreamCooldownMs)); 2800 } 2801 2802 protected: 2803 FakeVideoSendStream* AddSendStream() { 2804 return AddSendStream(StreamParams::CreateLegacy(++last_ssrc_)); 2805 } 2806 2807 FakeVideoSendStream* AddSendStream(const StreamParams& sp) { 2808 size_t num_streams = fake_call_->GetVideoSendStreams().size(); 2809 EXPECT_TRUE(send_channel_->AddSendStream(sp)); 2810 std::vector<FakeVideoSendStream*> streams = 2811 fake_call_->GetVideoSendStreams(); 2812 EXPECT_EQ(num_streams + 1, streams.size()); 2813 return streams[streams.size() - 1]; 2814 } 2815 2816 std::vector<FakeVideoSendStream*> GetFakeSendStreams() { 2817 return fake_call_->GetVideoSendStreams(); 2818 } 2819 2820 FakeVideoReceiveStream* AddRecvStream() { 2821 return AddRecvStream(StreamParams::CreateLegacy(++last_ssrc_)); 2822 } 2823 2824 FakeVideoReceiveStream* AddRecvStream(const StreamParams& sp) { 2825 size_t num_streams = fake_call_->GetVideoReceiveStreams().size(); 2826 EXPECT_TRUE(receive_channel_->AddRecvStream(sp)); 2827 std::vector<FakeVideoReceiveStream*> streams = 2828 fake_call_->GetVideoReceiveStreams(); 2829 EXPECT_EQ(num_streams + 1, streams.size()); 2830 return streams[streams.size() - 1]; 2831 } 2832 2833 void SetSendCodecsShouldWorkForBitrates(const char* min_bitrate_kbps, 2834 int expected_min_bitrate_bps, 2835 const char* start_bitrate_kbps, 2836 int expected_start_bitrate_bps, 2837 const char* max_bitrate_kbps, 2838 int expected_max_bitrate_bps) { 2839 ExpectSetBitrateParameters(expected_min_bitrate_bps, 2840 expected_start_bitrate_bps, 2841 expected_max_bitrate_bps); 2842 auto& codecs = send_parameters_.codecs; 2843 codecs.clear(); 2844 codecs.push_back(GetEngineCodec("VP8")); 2845 codecs[0].params[kCodecParamMinBitrate] = min_bitrate_kbps; 2846 codecs[0].params[kCodecParamStartBitrate] = start_bitrate_kbps; 2847 codecs[0].params[kCodecParamMaxBitrate] = max_bitrate_kbps; 2848 EXPECT_TRUE(send_channel_->SetSenderParameters(send_parameters_)); 2849 } 2850 2851 void ExpectSetBitrateParameters(int min_bitrate_bps, 2852 int start_bitrate_bps, 2853 int max_bitrate_bps) { 2854 EXPECT_CALL( 2855 *fake_call_->GetMockTransportControllerSend(), 2856 SetSdpBitrateParameters(AllOf( 2857 Field(&BitrateConstraints::min_bitrate_bps, min_bitrate_bps), 2858 Field(&BitrateConstraints::start_bitrate_bps, start_bitrate_bps), 2859 Field(&BitrateConstraints::max_bitrate_bps, max_bitrate_bps)))); 2860 } 2861 2862 void ExpectSetMaxBitrate(int max_bitrate_bps) { 2863 EXPECT_CALL(*fake_call_->GetMockTransportControllerSend(), 2864 SetSdpBitrateParameters(Field( 2865 &BitrateConstraints::max_bitrate_bps, max_bitrate_bps))); 2866 } 2867 2868 void TestExtmapAllowMixedCaller(bool extmap_allow_mixed) { 2869 // For a caller, the answer will be applied in set remote description 2870 // where SetSenderParameters() is called. 2871 EXPECT_TRUE( 2872 send_channel_->AddSendStream(StreamParams::CreateLegacy(kSsrc))); 2873 send_parameters_.extmap_allow_mixed = extmap_allow_mixed; 2874 EXPECT_TRUE(send_channel_->SetSenderParameters(send_parameters_)); 2875 const VideoSendStream::Config& config = 2876 fake_call_->GetVideoSendStreams()[0]->GetConfig(); 2877 EXPECT_EQ(extmap_allow_mixed, config.rtp.extmap_allow_mixed); 2878 } 2879 2880 void TestExtmapAllowMixedCallee(bool extmap_allow_mixed) { 2881 // For a callee, the answer will be applied in set local description 2882 // where SetExtmapAllowMixed() and AddSendStream() are called. 2883 send_channel_->SetExtmapAllowMixed(extmap_allow_mixed); 2884 EXPECT_TRUE( 2885 send_channel_->AddSendStream(StreamParams::CreateLegacy(kSsrc))); 2886 const VideoSendStream::Config& config = 2887 fake_call_->GetVideoSendStreams()[0]->GetConfig(); 2888 EXPECT_EQ(extmap_allow_mixed, config.rtp.extmap_allow_mixed); 2889 } 2890 2891 void TestSetSendRtpHeaderExtensions(const std::string& ext_uri) { 2892 // Enable extension. 2893 const int id = 1; 2894 VideoSenderParameters parameters = send_parameters_; 2895 parameters.extensions.push_back(RtpExtension(ext_uri, id)); 2896 EXPECT_TRUE(send_channel_->SetSenderParameters(parameters)); 2897 FakeVideoSendStream* send_stream = 2898 AddSendStream(StreamParams::CreateLegacy(123)); 2899 2900 // Verify the send extension id. 2901 ASSERT_EQ(1u, send_stream->GetConfig().rtp.extensions.size()); 2902 EXPECT_EQ(id, send_stream->GetConfig().rtp.extensions[0].id); 2903 EXPECT_EQ(ext_uri, send_stream->GetConfig().rtp.extensions[0].uri); 2904 // Verify call with same set of extensions returns true. 2905 EXPECT_TRUE(send_channel_->SetSenderParameters(parameters)); 2906 2907 // Verify that existing RTP header extensions can be removed. 2908 EXPECT_TRUE(send_channel_->SetSenderParameters(send_parameters_)); 2909 ASSERT_EQ(1u, fake_call_->GetVideoSendStreams().size()); 2910 send_stream = fake_call_->GetVideoSendStreams()[0]; 2911 EXPECT_TRUE(send_stream->GetConfig().rtp.extensions.empty()); 2912 2913 // Verify that adding receive RTP header extensions adds them for existing 2914 // streams. 2915 EXPECT_TRUE(send_channel_->SetSenderParameters(parameters)); 2916 send_stream = fake_call_->GetVideoSendStreams()[0]; 2917 ASSERT_EQ(1u, send_stream->GetConfig().rtp.extensions.size()); 2918 EXPECT_EQ(id, send_stream->GetConfig().rtp.extensions[0].id); 2919 EXPECT_EQ(ext_uri, send_stream->GetConfig().rtp.extensions[0].uri); 2920 } 2921 2922 void TestSetRecvRtpHeaderExtensions(const std::string& ext_uri) { 2923 // Enable extension. 2924 const int id = 1; 2925 VideoReceiverParameters parameters = recv_parameters_; 2926 parameters.extensions.push_back(RtpExtension(ext_uri, id)); 2927 EXPECT_TRUE(receive_channel_->SetReceiverParameters(parameters)); 2928 2929 AddRecvStream(StreamParams::CreateLegacy(123)); 2930 EXPECT_THAT( 2931 receive_channel_->GetRtpReceiverParameters(123).header_extensions, 2932 ElementsAre(RtpExtension(ext_uri, id))); 2933 2934 // Verify call with same set of extensions returns true. 2935 EXPECT_TRUE(receive_channel_->SetReceiverParameters(parameters)); 2936 2937 // Verify that SetRecvRtpHeaderExtensions doesn't implicitly add them for 2938 // senders. 2939 EXPECT_TRUE(AddSendStream(StreamParams::CreateLegacy(123)) 2940 ->GetConfig() 2941 .rtp.extensions.empty()); 2942 2943 // Verify that existing RTP header extensions can be removed. 2944 EXPECT_TRUE(receive_channel_->SetReceiverParameters(recv_parameters_)); 2945 EXPECT_THAT( 2946 receive_channel_->GetRtpReceiverParameters(123).header_extensions, 2947 IsEmpty()); 2948 2949 // Verify that adding receive RTP header extensions adds them for existing 2950 // streams. 2951 EXPECT_TRUE(receive_channel_->SetReceiverParameters(parameters)); 2952 EXPECT_EQ(receive_channel_->GetRtpReceiverParameters(123).header_extensions, 2953 parameters.extensions); 2954 } 2955 2956 void TestLossNotificationState(bool expect_lntf_enabled) { 2957 AssignDefaultCodec(); 2958 VerifyCodecHasDefaultFeedbackParams(*default_codec_, expect_lntf_enabled); 2959 2960 VideoSenderParameters parameters; 2961 parameters.codecs = engine_->LegacySendCodecs(); 2962 EXPECT_TRUE(send_channel_->SetSenderParameters(parameters)); 2963 EXPECT_TRUE(send_channel_->SetSend(true)); 2964 2965 // Send side. 2966 FakeVideoSendStream* send_stream = 2967 AddSendStream(StreamParams::CreateLegacy(1)); 2968 EXPECT_EQ(send_stream->GetConfig().rtp.lntf.enabled, expect_lntf_enabled); 2969 2970 // Receiver side. 2971 FakeVideoReceiveStream* recv_stream = 2972 AddRecvStream(StreamParams::CreateLegacy(1)); 2973 EXPECT_EQ(recv_stream->GetConfig().rtp.lntf.enabled, expect_lntf_enabled); 2974 } 2975 2976 void TestExtensionFilter(const std::vector<std::string>& extensions, 2977 const std::string& expected_extension) { 2978 VideoSenderParameters parameters = send_parameters_; 2979 int expected_id = -1; 2980 int id = 1; 2981 for (const std::string& extension : extensions) { 2982 if (extension == expected_extension) 2983 expected_id = id; 2984 parameters.extensions.push_back(RtpExtension(extension, id++)); 2985 } 2986 EXPECT_TRUE(send_channel_->SetSenderParameters(parameters)); 2987 FakeVideoSendStream* send_stream = 2988 AddSendStream(StreamParams::CreateLegacy(123)); 2989 2990 // Verify that only one of them has been set, and that it is the one with 2991 // highest priority (transport sequence number). 2992 ASSERT_EQ(1u, send_stream->GetConfig().rtp.extensions.size()); 2993 EXPECT_EQ(expected_id, send_stream->GetConfig().rtp.extensions[0].id); 2994 EXPECT_EQ(expected_extension, 2995 send_stream->GetConfig().rtp.extensions[0].uri); 2996 } 2997 2998 void TestDegradationPreference(bool resolution_scaling_enabled, 2999 bool fps_scaling_enabled); 3000 3001 void TestCpuAdaptation(bool enable_overuse, bool is_screenshare); 3002 void TestReceiverLocalSsrcConfiguration(bool receiver_first); 3003 void TestReceiveUnsignaledSsrcPacket(uint8_t payload_type, 3004 bool expect_created_receive_stream); 3005 3006 FakeVideoSendStream* SetDenoisingOption(uint32_t ssrc, 3007 FrameForwarder* frame_forwarder, 3008 bool enabled) { 3009 VideoOptions options; 3010 options.video_noise_reduction = enabled; 3011 EXPECT_TRUE(send_channel_->SetVideoSend(ssrc, &options, frame_forwarder)); 3012 // Options only take effect on the next frame. 3013 frame_forwarder->IncomingCapturedFrame(frame_source_.GetFrame()); 3014 3015 return fake_call_->GetVideoSendStreams().back(); 3016 } 3017 3018 FakeVideoSendStream* SetUpSimulcast(bool enabled, bool with_rtx) { 3019 const int kRtxSsrcOffset = 0xDEADBEEF; 3020 last_ssrc_ += 3; 3021 std::vector<uint32_t> ssrcs; 3022 std::vector<uint32_t> rtx_ssrcs; 3023 uint32_t num_streams = enabled ? kNumSimulcastStreams : 1; 3024 for (uint32_t i = 0; i < num_streams; ++i) { 3025 uint32_t ssrc = last_ssrc_ + i; 3026 ssrcs.push_back(ssrc); 3027 if (with_rtx) { 3028 rtx_ssrcs.push_back(ssrc + kRtxSsrcOffset); 3029 } 3030 } 3031 if (with_rtx) { 3032 return AddSendStream( 3033 CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs)); 3034 } 3035 return AddSendStream(CreateSimStreamParams("cname", ssrcs)); 3036 } 3037 3038 int GetMaxEncoderBitrate() { 3039 std::vector<FakeVideoSendStream*> streams = 3040 fake_call_->GetVideoSendStreams(); 3041 EXPECT_EQ(1u, streams.size()); 3042 FakeVideoSendStream* stream = streams[streams.size() - 1]; 3043 EXPECT_EQ(1u, stream->GetEncoderConfig().number_of_streams); 3044 return stream->GetVideoStreams()[0].max_bitrate_bps; 3045 } 3046 3047 void SetAndExpectMaxBitrate(int global_max, 3048 int stream_max, 3049 int expected_encoder_bitrate) { 3050 VideoSenderParameters limited_send_params = send_parameters_; 3051 limited_send_params.max_bandwidth_bps = global_max; 3052 EXPECT_TRUE(send_channel_->SetSenderParameters(limited_send_params)); 3053 RtpParameters parameters = send_channel_->GetRtpSendParameters(last_ssrc_); 3054 EXPECT_EQ(1UL, parameters.encodings.size()); 3055 parameters.encodings[0].max_bitrate_bps = stream_max; 3056 EXPECT_TRUE( 3057 send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok()); 3058 // Read back the parameteres and verify they have the correct value 3059 parameters = send_channel_->GetRtpSendParameters(last_ssrc_); 3060 EXPECT_EQ(1UL, parameters.encodings.size()); 3061 EXPECT_EQ(stream_max, parameters.encodings[0].max_bitrate_bps); 3062 // Verify that the new value propagated down to the encoder 3063 EXPECT_EQ(expected_encoder_bitrate, GetMaxEncoderBitrate()); 3064 } 3065 3066 // Values from kSimulcastConfigs in simulcast.cc. 3067 const std::vector<VideoStream> GetSimulcastBitrates720p() const { 3068 std::vector<VideoStream> layers(3); 3069 layers[0].min_bitrate_bps = 30000; 3070 layers[0].target_bitrate_bps = 150000; 3071 layers[0].max_bitrate_bps = 200000; 3072 layers[1].min_bitrate_bps = 150000; 3073 layers[1].target_bitrate_bps = 500000; 3074 layers[1].max_bitrate_bps = 700000; 3075 layers[2].min_bitrate_bps = 600000; 3076 layers[2].target_bitrate_bps = 2500000; 3077 layers[2].max_bitrate_bps = 2500000; 3078 return layers; 3079 } 3080 3081 FakeFrameSource frame_source_; 3082 std::unique_ptr<FakeCall> fake_call_; 3083 std::unique_ptr<VideoMediaSendChannelInterface> send_channel_; 3084 std::unique_ptr<VideoMediaReceiveChannelInterface> receive_channel_; 3085 VideoSenderParameters send_parameters_; 3086 VideoReceiverParameters recv_parameters_; 3087 uint32_t last_ssrc_; 3088 }; 3089 3090 TEST_F(WebRtcVideoChannelTest, SetsSyncGroupFromSyncLabel) { 3091 const uint32_t kVideoSsrc = 123; 3092 const std::string kSyncLabel = "AvSyncLabel"; 3093 3094 StreamParams sp = StreamParams::CreateLegacy(kVideoSsrc); 3095 sp.set_stream_ids({kSyncLabel}); 3096 EXPECT_TRUE(receive_channel_->AddRecvStream(sp)); 3097 3098 EXPECT_EQ(1u, fake_call_->GetVideoReceiveStreams().size()); 3099 EXPECT_EQ(kSyncLabel, 3100 fake_call_->GetVideoReceiveStreams()[0]->GetConfig().sync_group) 3101 << "SyncGroup should be set based on sync_label"; 3102 } 3103 3104 TEST_F(WebRtcVideoChannelTest, RecvStreamWithSimAndRtx) { 3105 VideoSenderParameters parameters; 3106 parameters.codecs = engine_->LegacySendCodecs(); 3107 EXPECT_TRUE(send_channel_->SetSenderParameters(parameters)); 3108 EXPECT_TRUE(send_channel_->SetSend(true)); 3109 parameters.conference_mode = true; 3110 EXPECT_TRUE(send_channel_->SetSenderParameters(parameters)); 3111 3112 // Send side. 3113 const std::vector<uint32_t> ssrcs = MAKE_VECTOR(kSsrcs1); 3114 const std::vector<uint32_t> rtx_ssrcs = MAKE_VECTOR(kRtxSsrcs1); 3115 FakeVideoSendStream* send_stream = 3116 AddSendStream(CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs)); 3117 3118 ASSERT_EQ(rtx_ssrcs.size(), send_stream->GetConfig().rtp.rtx.ssrcs.size()); 3119 for (size_t i = 0; i < rtx_ssrcs.size(); ++i) 3120 EXPECT_EQ(rtx_ssrcs[i], send_stream->GetConfig().rtp.rtx.ssrcs[i]); 3121 3122 // Receiver side. 3123 FakeVideoReceiveStream* recv_stream = 3124 AddRecvStream(CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs)); 3125 EXPECT_FALSE( 3126 recv_stream->GetConfig().rtp.rtx_associated_payload_types.empty()); 3127 EXPECT_TRUE(VerifyRtxReceiveAssociations(recv_stream->GetConfig())) 3128 << "RTX should be mapped for all decoders/payload types."; 3129 EXPECT_TRUE(HasRtxReceiveAssociation(recv_stream->GetConfig(), 3130 GetEngineCodec("red").id)) 3131 << "RTX should be mapped for the RED payload type"; 3132 3133 EXPECT_EQ(rtx_ssrcs[0], recv_stream->GetConfig().rtp.rtx_ssrc); 3134 } 3135 3136 TEST_F(WebRtcVideoChannelTest, RecvStreamWithRtx) { 3137 // Setup one channel with an associated RTX stream. 3138 StreamParams params = StreamParams::CreateLegacy(kSsrcs1[0]); 3139 params.AddFidSsrc(kSsrcs1[0], kRtxSsrcs1[0]); 3140 FakeVideoReceiveStream* recv_stream = AddRecvStream(params); 3141 EXPECT_EQ(kRtxSsrcs1[0], recv_stream->GetConfig().rtp.rtx_ssrc); 3142 3143 EXPECT_TRUE(VerifyRtxReceiveAssociations(recv_stream->GetConfig())) 3144 << "RTX should be mapped for all decoders/payload types."; 3145 EXPECT_TRUE(HasRtxReceiveAssociation(recv_stream->GetConfig(), 3146 GetEngineCodec("red").id)) 3147 << "RTX should be mapped for the RED payload type"; 3148 } 3149 3150 TEST_F(WebRtcVideoChannelTest, RecvStreamNoRtx) { 3151 // Setup one channel without an associated RTX stream. 3152 StreamParams params = StreamParams::CreateLegacy(kSsrcs1[0]); 3153 FakeVideoReceiveStream* recv_stream = AddRecvStream(params); 3154 ASSERT_EQ(0U, recv_stream->GetConfig().rtp.rtx_ssrc); 3155 } 3156 3157 // Test propagation of extmap allow mixed setting. 3158 TEST_F(WebRtcVideoChannelTest, SetExtmapAllowMixedAsCaller) { 3159 TestExtmapAllowMixedCaller(/*extmap_allow_mixed=*/true); 3160 } 3161 TEST_F(WebRtcVideoChannelTest, SetExtmapAllowMixedDisabledAsCaller) { 3162 TestExtmapAllowMixedCaller(/*extmap_allow_mixed=*/false); 3163 } 3164 TEST_F(WebRtcVideoChannelTest, SetExtmapAllowMixedAsCallee) { 3165 TestExtmapAllowMixedCallee(/*extmap_allow_mixed=*/true); 3166 } 3167 TEST_F(WebRtcVideoChannelTest, SetExtmapAllowMixedDisabledAsCallee) { 3168 TestExtmapAllowMixedCallee(/*extmap_allow_mixed=*/false); 3169 } 3170 3171 TEST_F(WebRtcVideoChannelTest, NoHeaderExtesionsByDefault) { 3172 FakeVideoSendStream* send_stream = 3173 AddSendStream(StreamParams::CreateLegacy(kSsrcs1[0])); 3174 ASSERT_TRUE(send_stream->GetConfig().rtp.extensions.empty()); 3175 3176 AddRecvStream(StreamParams::CreateLegacy(kSsrcs1[0])); 3177 ASSERT_TRUE(receive_channel_->GetRtpReceiverParameters(kSsrcs1[0]) 3178 .header_extensions.empty()); 3179 } 3180 3181 // Test support for RTP timestamp offset header extension. 3182 TEST_F(WebRtcVideoChannelTest, SendRtpTimestampOffsetHeaderExtensions) { 3183 TestSetSendRtpHeaderExtensions(RtpExtension::kTimestampOffsetUri); 3184 } 3185 3186 TEST_F(WebRtcVideoChannelTest, RecvRtpTimestampOffsetHeaderExtensions) { 3187 TestSetRecvRtpHeaderExtensions(RtpExtension::kTimestampOffsetUri); 3188 } 3189 3190 // Test support for absolute send time header extension. 3191 TEST_F(WebRtcVideoChannelTest, SendAbsoluteSendTimeHeaderExtensions) { 3192 TestSetSendRtpHeaderExtensions(RtpExtension::kAbsSendTimeUri); 3193 } 3194 3195 TEST_F(WebRtcVideoChannelTest, RecvAbsoluteSendTimeHeaderExtensions) { 3196 TestSetRecvRtpHeaderExtensions(RtpExtension::kAbsSendTimeUri); 3197 } 3198 3199 class WebRtcVideoChannelWithFilterAbsSendTimeExtensionTest 3200 : public WebRtcVideoChannelTest { 3201 public: 3202 WebRtcVideoChannelWithFilterAbsSendTimeExtensionTest() 3203 : WebRtcVideoChannelTest("WebRTC-FilterAbsSendTimeExtension/Enabled/") {} 3204 }; 3205 3206 TEST_F(WebRtcVideoChannelWithFilterAbsSendTimeExtensionTest, 3207 FiltersExtensionsPicksTransportSeqNum) { 3208 // Enable three redundant extensions. 3209 std::vector<std::string> extensions; 3210 extensions.push_back(RtpExtension::kAbsSendTimeUri); 3211 extensions.push_back(RtpExtension::kTimestampOffsetUri); 3212 extensions.push_back(RtpExtension::kTransportSequenceNumberUri); 3213 TestExtensionFilter(extensions, RtpExtension::kTransportSequenceNumberUri); 3214 } 3215 3216 TEST_F(WebRtcVideoChannelTest, FiltersExtensionsPicksAbsSendTime) { 3217 // Enable two redundant extensions. 3218 std::vector<std::string> extensions; 3219 extensions.push_back(RtpExtension::kAbsSendTimeUri); 3220 extensions.push_back(RtpExtension::kTimestampOffsetUri); 3221 TestExtensionFilter(extensions, RtpExtension::kAbsSendTimeUri); 3222 } 3223 3224 // Test support for transport sequence number header extension. 3225 TEST_F(WebRtcVideoChannelTest, SendTransportSequenceNumberHeaderExtensions) { 3226 TestSetSendRtpHeaderExtensions(RtpExtension::kTransportSequenceNumberUri); 3227 } 3228 TEST_F(WebRtcVideoChannelTest, RecvTransportSequenceNumberHeaderExtensions) { 3229 TestSetRecvRtpHeaderExtensions(RtpExtension::kTransportSequenceNumberUri); 3230 } 3231 3232 // Test support for video rotation header extension. 3233 TEST_F(WebRtcVideoChannelTest, SendVideoRotationHeaderExtensions) { 3234 TestSetSendRtpHeaderExtensions(RtpExtension::kVideoRotationUri); 3235 } 3236 TEST_F(WebRtcVideoChannelTest, RecvVideoRotationHeaderExtensions) { 3237 TestSetRecvRtpHeaderExtensions(RtpExtension::kVideoRotationUri); 3238 } 3239 3240 TEST_F(WebRtcVideoChannelTest, SendCorruptionDetectionHeaderExtensions) { 3241 TestSetSendRtpHeaderExtensions(RtpExtension::kCorruptionDetectionUri); 3242 } 3243 TEST_F(WebRtcVideoChannelTest, RecvCorruptionDetectionHeaderExtensions) { 3244 TestSetRecvRtpHeaderExtensions(RtpExtension::kCorruptionDetectionUri); 3245 } 3246 3247 TEST_F(WebRtcVideoChannelTest, DisableFrameInstrumentationByDefault) { 3248 EXPECT_TRUE(send_channel_->SetSenderParameters(send_parameters_)); 3249 FakeVideoSendStream* send_stream = 3250 AddSendStream(StreamParams::CreateLegacy(123)); 3251 EXPECT_FALSE(send_stream->GetConfig() 3252 .encoder_settings.enable_frame_instrumentation_generator); 3253 } 3254 3255 TEST_F(WebRtcVideoChannelTest, 3256 EnableFrameInstrumentationWhenEncryptedExtensionIsPresent) { 3257 VideoSenderParameters parameters = send_parameters_; 3258 parameters.extensions.push_back(RtpExtension( 3259 RtpExtension::kCorruptionDetectionUri, /*id=*/1, /*encrypt=*/true)); 3260 EXPECT_TRUE(send_channel_->SetSenderParameters(parameters)); 3261 3262 FakeVideoSendStream* send_stream = 3263 AddSendStream(StreamParams::CreateLegacy(123)); 3264 EXPECT_TRUE(send_stream->GetConfig() 3265 .encoder_settings.enable_frame_instrumentation_generator); 3266 } 3267 3268 TEST_F(WebRtcVideoChannelTest, 3269 DisableFrameInstrumentationWhenNoEncryptedExtensionIsPresent) { 3270 VideoSenderParameters parameters = send_parameters_; 3271 parameters.extensions.push_back(RtpExtension( 3272 RtpExtension::kCorruptionDetectionUri, /*id=*/1, /*encrypt=*/false)); 3273 EXPECT_TRUE(send_channel_->SetSenderParameters(parameters)); 3274 3275 FakeVideoSendStream* send_stream = 3276 AddSendStream(StreamParams::CreateLegacy(123)); 3277 EXPECT_FALSE(send_stream->GetConfig() 3278 .encoder_settings.enable_frame_instrumentation_generator); 3279 } 3280 3281 TEST_F(WebRtcVideoChannelTest, IdenticalSendExtensionsDoesntRecreateStream) { 3282 const int kAbsSendTimeId = 1; 3283 const int kVideoRotationId = 2; 3284 send_parameters_.extensions.push_back( 3285 RtpExtension(RtpExtension::kAbsSendTimeUri, kAbsSendTimeId)); 3286 send_parameters_.extensions.push_back( 3287 RtpExtension(RtpExtension::kVideoRotationUri, kVideoRotationId)); 3288 3289 EXPECT_TRUE(send_channel_->SetSenderParameters(send_parameters_)); 3290 FakeVideoSendStream* send_stream = 3291 AddSendStream(StreamParams::CreateLegacy(123)); 3292 3293 EXPECT_EQ(1, fake_call_->GetNumCreatedSendStreams()); 3294 ASSERT_EQ(2u, send_stream->GetConfig().rtp.extensions.size()); 3295 3296 // Setting the same extensions (even if in different order) shouldn't 3297 // reallocate the stream. 3298 absl::c_reverse(send_parameters_.extensions); 3299 EXPECT_TRUE(send_channel_->SetSenderParameters(send_parameters_)); 3300 3301 EXPECT_EQ(1, fake_call_->GetNumCreatedSendStreams()); 3302 3303 // Setting different extensions should recreate the stream. 3304 send_parameters_.extensions.resize(1); 3305 EXPECT_TRUE(send_channel_->SetSenderParameters(send_parameters_)); 3306 3307 EXPECT_EQ(2, fake_call_->GetNumCreatedSendStreams()); 3308 } 3309 3310 TEST_F(WebRtcVideoChannelTest, 3311 SetSendRtpHeaderExtensionsExcludeUnsupportedExtensions) { 3312 const int kUnsupportedId = 1; 3313 const int kTOffsetId = 2; 3314 3315 send_parameters_.extensions.push_back( 3316 RtpExtension(kUnsupportedExtensionName, kUnsupportedId)); 3317 send_parameters_.extensions.push_back( 3318 RtpExtension(RtpExtension::kTimestampOffsetUri, kTOffsetId)); 3319 EXPECT_TRUE(send_channel_->SetSenderParameters(send_parameters_)); 3320 FakeVideoSendStream* send_stream = 3321 AddSendStream(StreamParams::CreateLegacy(123)); 3322 3323 // Only timestamp offset extension is set to send stream, 3324 // unsupported rtp extension is ignored. 3325 ASSERT_EQ(1u, send_stream->GetConfig().rtp.extensions.size()); 3326 EXPECT_STREQ(RtpExtension::kTimestampOffsetUri, 3327 send_stream->GetConfig().rtp.extensions[0].uri.c_str()); 3328 } 3329 3330 TEST_F(WebRtcVideoChannelTest, 3331 SetRecvRtpHeaderExtensionsExcludeUnsupportedExtensions) { 3332 const int kUnsupportedId = 1; 3333 const int kTOffsetId = 2; 3334 3335 recv_parameters_.extensions.push_back( 3336 RtpExtension(kUnsupportedExtensionName, kUnsupportedId)); 3337 recv_parameters_.extensions.push_back( 3338 RtpExtension(RtpExtension::kTimestampOffsetUri, kTOffsetId)); 3339 EXPECT_TRUE(receive_channel_->SetReceiverParameters(recv_parameters_)); 3340 AddRecvStream(StreamParams::CreateLegacy(123)); 3341 3342 // Only timestamp offset extension is set to receive stream, 3343 // unsupported rtp extension is ignored. 3344 ASSERT_THAT(receive_channel_->GetRtpReceiverParameters(123).header_extensions, 3345 SizeIs(1)); 3346 EXPECT_STREQ(receive_channel_->GetRtpReceiverParameters(123) 3347 .header_extensions[0] 3348 .uri.c_str(), 3349 RtpExtension::kTimestampOffsetUri); 3350 } 3351 3352 TEST_F(WebRtcVideoChannelTest, SetSendRtpHeaderExtensionsRejectsIncorrectIds) { 3353 const int kIncorrectIds[] = {-2, -1, 0, 15, 16}; 3354 for (int incorrect_id : kIncorrectIds) { 3355 send_parameters_.extensions.push_back( 3356 RtpExtension(RtpExtension::kTimestampOffsetUri, incorrect_id)); 3357 EXPECT_FALSE(send_channel_->SetSenderParameters(send_parameters_)) 3358 << "Bad extension id '" << incorrect_id << "' accepted."; 3359 } 3360 } 3361 3362 TEST_F(WebRtcVideoChannelTest, SetRecvRtpHeaderExtensionsRejectsIncorrectIds) { 3363 const int kIncorrectIds[] = {-2, -1, 0, 15, 16}; 3364 for (int incorrect_id : kIncorrectIds) { 3365 recv_parameters_.extensions.push_back( 3366 RtpExtension(RtpExtension::kTimestampOffsetUri, incorrect_id)); 3367 EXPECT_FALSE(receive_channel_->SetReceiverParameters(recv_parameters_)) 3368 << "Bad extension id '" << incorrect_id << "' accepted."; 3369 } 3370 } 3371 3372 TEST_F(WebRtcVideoChannelTest, SetSendRtpHeaderExtensionsRejectsDuplicateIds) { 3373 const int id = 1; 3374 send_parameters_.extensions.push_back( 3375 RtpExtension(RtpExtension::kTimestampOffsetUri, id)); 3376 send_parameters_.extensions.push_back( 3377 RtpExtension(RtpExtension::kAbsSendTimeUri, id)); 3378 EXPECT_FALSE(send_channel_->SetSenderParameters(send_parameters_)); 3379 3380 // Duplicate entries are also not supported. 3381 send_parameters_.extensions.clear(); 3382 send_parameters_.extensions.push_back( 3383 RtpExtension(RtpExtension::kTimestampOffsetUri, id)); 3384 send_parameters_.extensions.push_back(send_parameters_.extensions.back()); 3385 EXPECT_FALSE(send_channel_->SetSenderParameters(send_parameters_)); 3386 } 3387 3388 TEST_F(WebRtcVideoChannelTest, SetRecvRtpHeaderExtensionsRejectsDuplicateIds) { 3389 const int id = 1; 3390 recv_parameters_.extensions.push_back( 3391 RtpExtension(RtpExtension::kTimestampOffsetUri, id)); 3392 recv_parameters_.extensions.push_back( 3393 RtpExtension(RtpExtension::kAbsSendTimeUri, id)); 3394 EXPECT_FALSE(receive_channel_->SetReceiverParameters(recv_parameters_)); 3395 3396 // Duplicate entries are also not supported. 3397 recv_parameters_.extensions.clear(); 3398 recv_parameters_.extensions.push_back( 3399 RtpExtension(RtpExtension::kTimestampOffsetUri, id)); 3400 recv_parameters_.extensions.push_back(recv_parameters_.extensions.back()); 3401 EXPECT_FALSE(receive_channel_->SetReceiverParameters(recv_parameters_)); 3402 } 3403 3404 TEST_F(WebRtcVideoChannelTest, OnPacketReceivedIdentifiesExtensions) { 3405 VideoReceiverParameters parameters = recv_parameters_; 3406 parameters.extensions.push_back( 3407 RtpExtension(RtpExtension::kVideoRotationUri, /*id=*/1)); 3408 ASSERT_TRUE(receive_channel_->SetReceiverParameters(parameters)); 3409 RtpHeaderExtensionMap extension_map(parameters.extensions); 3410 RtpPacketReceived reference_packet(&extension_map); 3411 reference_packet.SetExtension<VideoOrientation>( 3412 VideoRotation::kVideoRotation_270); 3413 // Create a packet without the extension map but with the same content. 3414 RtpPacketReceived received_packet; 3415 ASSERT_TRUE(received_packet.Parse(reference_packet.Buffer())); 3416 3417 receive_channel_->OnPacketReceived(received_packet); 3418 time_controller_.AdvanceTime(TimeDelta::Zero()); 3419 3420 EXPECT_EQ( 3421 fake_call_->last_received_rtp_packet().GetExtension<VideoOrientation>(), 3422 VideoRotation::kVideoRotation_270); 3423 } 3424 3425 TEST_F(WebRtcVideoChannelTest, AddRecvStreamOnlyUsesOneReceiveStream) { 3426 EXPECT_TRUE(receive_channel_->AddRecvStream(StreamParams::CreateLegacy(1))); 3427 EXPECT_EQ(1u, fake_call_->GetVideoReceiveStreams().size()); 3428 } 3429 3430 TEST_F(WebRtcVideoChannelTest, RtcpIsCompoundByDefault) { 3431 FakeVideoReceiveStream* stream = AddRecvStream(); 3432 EXPECT_EQ(RtcpMode::kCompound, stream->GetConfig().rtp.rtcp_mode); 3433 } 3434 3435 TEST_F(WebRtcVideoChannelTest, LossNotificationIsDisabledByDefault) { 3436 TestLossNotificationState(false); 3437 } 3438 3439 class WebRtcVideoChannelWithRtcpLossNotificationTest 3440 : public WebRtcVideoChannelTest { 3441 public: 3442 WebRtcVideoChannelWithRtcpLossNotificationTest() 3443 : WebRtcVideoChannelTest("WebRTC-RtcpLossNotification/Enabled/") {} 3444 }; 3445 3446 TEST_F(WebRtcVideoChannelWithRtcpLossNotificationTest, 3447 LossNotificationIsEnabledByFieldTrial) { 3448 TestLossNotificationState(true); 3449 } 3450 3451 TEST_F(WebRtcVideoChannelWithRtcpLossNotificationTest, 3452 LossNotificationCanBeEnabledAndDisabled) { 3453 AssignDefaultCodec(); 3454 VerifyCodecHasDefaultFeedbackParams(*default_codec_, true); 3455 3456 { 3457 VideoSenderParameters parameters; 3458 parameters.codecs = engine_->LegacySendCodecs(); 3459 EXPECT_TRUE(send_channel_->SetSenderParameters(parameters)); 3460 EXPECT_TRUE(send_channel_->SetSend(true)); 3461 } 3462 3463 // Start with LNTF enabled. 3464 FakeVideoSendStream* send_stream = 3465 AddSendStream(StreamParams::CreateLegacy(1)); 3466 ASSERT_TRUE(send_stream->GetConfig().rtp.lntf.enabled); 3467 FakeVideoReceiveStream* recv_stream = 3468 AddRecvStream(StreamParams::CreateLegacy(1)); 3469 ASSERT_TRUE(recv_stream->GetConfig().rtp.lntf.enabled); 3470 3471 // Verify that LNTF is turned off when send(!) codecs without LNTF are set. 3472 VideoSenderParameters parameters; 3473 parameters.codecs.push_back(RemoveFeedbackParams(GetEngineCodec("VP8"))); 3474 EXPECT_TRUE(parameters.codecs[0].feedback_params.params().empty()); 3475 EXPECT_TRUE(send_channel_->SetSenderParameters(parameters)); 3476 recv_stream = fake_call_->GetVideoReceiveStreams()[0]; 3477 EXPECT_FALSE(recv_stream->GetConfig().rtp.lntf.enabled); 3478 send_stream = fake_call_->GetVideoSendStreams()[0]; 3479 EXPECT_FALSE(send_stream->GetConfig().rtp.lntf.enabled); 3480 3481 // Setting the default codecs again, including VP8, turns LNTF back on. 3482 parameters.codecs = engine_->LegacySendCodecs(); 3483 EXPECT_TRUE(send_channel_->SetSenderParameters(parameters)); 3484 recv_stream = fake_call_->GetVideoReceiveStreams()[0]; 3485 EXPECT_TRUE(recv_stream->GetConfig().rtp.lntf.enabled); 3486 send_stream = fake_call_->GetVideoSendStreams()[0]; 3487 EXPECT_TRUE(send_stream->GetConfig().rtp.lntf.enabled); 3488 } 3489 3490 TEST_F(WebRtcVideoChannelTest, NackIsEnabledByDefault) { 3491 AssignDefaultCodec(); 3492 VerifyCodecHasDefaultFeedbackParams(*default_codec_, false); 3493 3494 VideoSenderParameters parameters; 3495 parameters.codecs = engine_->LegacySendCodecs(); 3496 EXPECT_TRUE(send_channel_->SetSenderParameters(parameters)); 3497 EXPECT_TRUE(send_channel_->SetSend(true)); 3498 3499 // Send side. 3500 FakeVideoSendStream* send_stream = 3501 AddSendStream(StreamParams::CreateLegacy(1)); 3502 EXPECT_GT(send_stream->GetConfig().rtp.nack.rtp_history_ms, 0); 3503 3504 // Receiver side. 3505 FakeVideoReceiveStream* recv_stream = 3506 AddRecvStream(StreamParams::CreateLegacy(1)); 3507 EXPECT_GT(recv_stream->GetConfig().rtp.nack.rtp_history_ms, 0); 3508 3509 // Nack history size should match between sender and receiver. 3510 EXPECT_EQ(send_stream->GetConfig().rtp.nack.rtp_history_ms, 3511 recv_stream->GetConfig().rtp.nack.rtp_history_ms); 3512 } 3513 3514 TEST_F(WebRtcVideoChannelTest, NackCanBeEnabledAndDisabled) { 3515 FakeVideoSendStream* send_stream = AddSendStream(); 3516 FakeVideoReceiveStream* recv_stream = AddRecvStream(); 3517 3518 EXPECT_GT(recv_stream->GetConfig().rtp.nack.rtp_history_ms, 0); 3519 EXPECT_GT(send_stream->GetConfig().rtp.nack.rtp_history_ms, 0); 3520 3521 // Verify that NACK is turned off when send(!) codecs without NACK are set. 3522 VideoSenderParameters parameters; 3523 parameters.codecs.push_back(RemoveFeedbackParams(GetEngineCodec("VP8"))); 3524 EXPECT_TRUE(parameters.codecs[0].feedback_params.params().empty()); 3525 EXPECT_TRUE(send_channel_->SetSenderParameters(parameters)); 3526 recv_stream = fake_call_->GetVideoReceiveStreams()[0]; 3527 EXPECT_EQ(0, recv_stream->GetConfig().rtp.nack.rtp_history_ms); 3528 send_stream = fake_call_->GetVideoSendStreams()[0]; 3529 EXPECT_EQ(0, send_stream->GetConfig().rtp.nack.rtp_history_ms); 3530 3531 // Verify that NACK is turned on when setting default codecs since the 3532 // default codecs have NACK enabled. 3533 parameters.codecs = engine_->LegacySendCodecs(); 3534 EXPECT_TRUE(send_channel_->SetSenderParameters(parameters)); 3535 recv_stream = fake_call_->GetVideoReceiveStreams()[0]; 3536 EXPECT_GT(recv_stream->GetConfig().rtp.nack.rtp_history_ms, 0); 3537 send_stream = fake_call_->GetVideoSendStreams()[0]; 3538 EXPECT_GT(send_stream->GetConfig().rtp.nack.rtp_history_ms, 0); 3539 } 3540 3541 // This test verifies that new frame sizes reconfigures encoders even though not 3542 // (yet) sending. The purpose of this is to permit encoding as quickly as 3543 // possible once we start sending. Likely the frames being input are from the 3544 // same source that will be sent later, which just means that we're ready 3545 // earlier. 3546 TEST_F(WebRtcVideoChannelTest, ReconfiguresEncodersWhenNotSending) { 3547 VideoSenderParameters parameters; 3548 parameters.codecs.push_back(GetEngineCodec("VP8")); 3549 ASSERT_TRUE(send_channel_->SetSenderParameters(parameters)); 3550 send_channel_->SetSend(false); 3551 3552 FakeVideoSendStream* stream = AddSendStream(); 3553 3554 // No frames entered. 3555 std::vector<VideoStream> streams = stream->GetVideoStreams(); 3556 EXPECT_EQ(0u, streams[0].width); 3557 EXPECT_EQ(0u, streams[0].height); 3558 3559 FrameForwarder frame_forwarder; 3560 FakeFrameSource frame_source(1280, 720, kNumMicrosecsPerSec / 30); 3561 3562 EXPECT_TRUE( 3563 send_channel_->SetVideoSend(last_ssrc_, nullptr, &frame_forwarder)); 3564 frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame()); 3565 3566 // Frame entered, should be reconfigured to new dimensions. 3567 streams = stream->GetVideoStreams(); 3568 EXPECT_EQ(checked_cast<size_t>(1280), streams[0].width); 3569 EXPECT_EQ(checked_cast<size_t>(720), streams[0].height); 3570 3571 EXPECT_TRUE(send_channel_->SetVideoSend(last_ssrc_, nullptr, nullptr)); 3572 } 3573 3574 TEST_F(WebRtcVideoChannelTest, UsesCorrectSettingsForScreencast) { 3575 static const int kScreenshareMinBitrateKbps = 800; 3576 Codec codec = GetEngineCodec("VP8"); 3577 VideoSenderParameters parameters; 3578 parameters.codecs.push_back(codec); 3579 EXPECT_TRUE(send_channel_->SetSenderParameters(parameters)); 3580 AddSendStream(); 3581 3582 FrameForwarder frame_forwarder; 3583 FakeFrameSource frame_source(1280, 720, kNumMicrosecsPerSec / 30); 3584 VideoOptions min_bitrate_options; 3585 min_bitrate_options.screencast_min_bitrate_kbps = kScreenshareMinBitrateKbps; 3586 EXPECT_TRUE(send_channel_->SetVideoSend(last_ssrc_, &min_bitrate_options, 3587 &frame_forwarder)); 3588 3589 EXPECT_TRUE(send_channel_->SetSend(true)); 3590 3591 frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame()); 3592 ASSERT_EQ(1u, fake_call_->GetVideoSendStreams().size()); 3593 FakeVideoSendStream* send_stream = fake_call_->GetVideoSendStreams().front(); 3594 3595 EXPECT_EQ(1, send_stream->GetNumberOfSwappedFrames()); 3596 3597 // Verify non-screencast settings. 3598 VideoEncoderConfig encoder_config = send_stream->GetEncoderConfig().Copy(); 3599 EXPECT_EQ(VideoEncoderConfig::ContentType::kRealtimeVideo, 3600 encoder_config.content_type); 3601 std::vector<VideoStream> streams = send_stream->GetVideoStreams(); 3602 EXPECT_EQ(checked_cast<size_t>(1280), streams.front().width); 3603 EXPECT_EQ(checked_cast<size_t>(720), streams.front().height); 3604 EXPECT_EQ(0, encoder_config.min_transmit_bitrate_bps) 3605 << "Non-screenshare shouldn't use min-transmit bitrate."; 3606 3607 EXPECT_TRUE(send_channel_->SetVideoSend(last_ssrc_, nullptr, nullptr)); 3608 EXPECT_EQ(1, send_stream->GetNumberOfSwappedFrames()); 3609 VideoOptions screencast_options; 3610 screencast_options.is_screencast = true; 3611 EXPECT_TRUE(send_channel_->SetVideoSend(last_ssrc_, &screencast_options, 3612 &frame_forwarder)); 3613 frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame()); 3614 // Send stream recreated after option change. 3615 ASSERT_EQ(2, fake_call_->GetNumCreatedSendStreams()); 3616 send_stream = fake_call_->GetVideoSendStreams().front(); 3617 EXPECT_EQ(1, send_stream->GetNumberOfSwappedFrames()); 3618 3619 // Verify screencast settings. 3620 encoder_config = send_stream->GetEncoderConfig().Copy(); 3621 EXPECT_EQ(VideoEncoderConfig::ContentType::kScreen, 3622 encoder_config.content_type); 3623 EXPECT_EQ(kScreenshareMinBitrateKbps * 1000, 3624 encoder_config.min_transmit_bitrate_bps); 3625 3626 streams = send_stream->GetVideoStreams(); 3627 EXPECT_EQ(checked_cast<size_t>(1280), streams.front().width); 3628 EXPECT_EQ(checked_cast<size_t>(720), streams.front().height); 3629 EXPECT_FALSE(streams[0].num_temporal_layers.has_value()); 3630 EXPECT_TRUE(send_channel_->SetVideoSend(last_ssrc_, nullptr, nullptr)); 3631 } 3632 3633 TEST_F(WebRtcVideoChannelTest, 3634 ConferenceModeScreencastConfiguresTemporalLayer) { 3635 static const int kConferenceScreencastTemporalBitrateBps = 200 * 1000; 3636 send_parameters_.conference_mode = true; 3637 send_channel_->SetSenderParameters(send_parameters_); 3638 3639 AddSendStream(); 3640 VideoOptions options; 3641 options.is_screencast = true; 3642 FrameForwarder frame_forwarder; 3643 FakeFrameSource frame_source(1280, 720, kNumMicrosecsPerSec / 30); 3644 EXPECT_TRUE( 3645 send_channel_->SetVideoSend(last_ssrc_, &options, &frame_forwarder)); 3646 EXPECT_TRUE(send_channel_->SetSend(true)); 3647 3648 frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame()); 3649 ASSERT_EQ(1u, fake_call_->GetVideoSendStreams().size()); 3650 FakeVideoSendStream* send_stream = fake_call_->GetVideoSendStreams().front(); 3651 3652 VideoEncoderConfig encoder_config = send_stream->GetEncoderConfig().Copy(); 3653 3654 // Verify screencast settings. 3655 encoder_config = send_stream->GetEncoderConfig().Copy(); 3656 EXPECT_EQ(VideoEncoderConfig::ContentType::kScreen, 3657 encoder_config.content_type); 3658 3659 std::vector<VideoStream> streams = send_stream->GetVideoStreams(); 3660 ASSERT_EQ(1u, streams.size()); 3661 ASSERT_EQ(2u, streams[0].num_temporal_layers); 3662 EXPECT_EQ(kConferenceScreencastTemporalBitrateBps, 3663 streams[0].target_bitrate_bps); 3664 3665 EXPECT_TRUE(send_channel_->SetVideoSend(last_ssrc_, nullptr, nullptr)); 3666 } 3667 3668 TEST_F(WebRtcVideoChannelTest, SuspendBelowMinBitrateDisabledByDefault) { 3669 FakeVideoSendStream* stream = AddSendStream(); 3670 EXPECT_FALSE(stream->GetConfig().suspend_below_min_bitrate); 3671 } 3672 3673 TEST_F(WebRtcVideoChannelTest, SetMediaConfigSuspendBelowMinBitrate) { 3674 MediaConfig media_config = GetMediaConfig(); 3675 media_config.video.suspend_below_min_bitrate = true; 3676 3677 send_channel_ = engine_->CreateSendChannel( 3678 env_, fake_call_.get(), media_config, VideoOptions(), CryptoOptions(), 3679 video_bitrate_allocator_factory_.get()); 3680 receive_channel_ = engine_->CreateReceiveChannel( 3681 env_, fake_call_.get(), media_config, VideoOptions(), CryptoOptions()); 3682 send_channel_->OnReadyToSend(true); 3683 3684 send_channel_->SetSenderParameters(send_parameters_); 3685 3686 FakeVideoSendStream* stream = AddSendStream(); 3687 EXPECT_TRUE(stream->GetConfig().suspend_below_min_bitrate); 3688 3689 media_config.video.suspend_below_min_bitrate = false; 3690 send_channel_ = engine_->CreateSendChannel( 3691 env_, fake_call_.get(), media_config, VideoOptions(), CryptoOptions(), 3692 video_bitrate_allocator_factory_.get()); 3693 receive_channel_ = engine_->CreateReceiveChannel( 3694 env_, fake_call_.get(), media_config, VideoOptions(), CryptoOptions()); 3695 send_channel_->OnReadyToSend(true); 3696 3697 send_channel_->SetSenderParameters(send_parameters_); 3698 3699 stream = AddSendStream(); 3700 EXPECT_FALSE(stream->GetConfig().suspend_below_min_bitrate); 3701 } 3702 3703 TEST_F(WebRtcVideoChannelTest, Vp8DenoisingEnabledByDefault) { 3704 FakeVideoSendStream* stream = AddSendStream(); 3705 VideoCodecVP8 vp8_settings; 3706 ASSERT_TRUE(stream->GetVp8Settings(&vp8_settings)) << "No VP8 config set."; 3707 EXPECT_TRUE(vp8_settings.denoisingOn); 3708 } 3709 3710 TEST_F(WebRtcVideoChannelTest, VerifyVp8SpecificSettings) { 3711 VideoSenderParameters parameters; 3712 parameters.codecs.push_back(GetEngineCodec("VP8")); 3713 ASSERT_TRUE(send_channel_->SetSenderParameters(parameters)); 3714 3715 // Single-stream settings should apply with RTX as well (verifies that we 3716 // check number of regular SSRCs and not StreamParams::ssrcs which contains 3717 // both RTX and regular SSRCs). 3718 FakeVideoSendStream* stream = SetUpSimulcast(false, /*with_rtx=*/true); 3719 3720 FrameForwarder frame_forwarder; 3721 EXPECT_TRUE( 3722 send_channel_->SetVideoSend(last_ssrc_, nullptr, &frame_forwarder)); 3723 send_channel_->SetSend(true); 3724 3725 frame_forwarder.IncomingCapturedFrame(frame_source_.GetFrame()); 3726 3727 VideoCodecVP8 vp8_settings; 3728 ASSERT_TRUE(stream->GetVp8Settings(&vp8_settings)) << "No VP8 config set."; 3729 EXPECT_TRUE(vp8_settings.denoisingOn) 3730 << "VP8 denoising should be on by default."; 3731 3732 stream = SetDenoisingOption(last_ssrc_, &frame_forwarder, false); 3733 3734 ASSERT_TRUE(stream->GetVp8Settings(&vp8_settings)) << "No VP8 config set."; 3735 EXPECT_FALSE(vp8_settings.denoisingOn); 3736 EXPECT_TRUE(vp8_settings.automaticResizeOn); 3737 EXPECT_TRUE(stream->GetEncoderConfig().frame_drop_enabled); 3738 3739 stream = SetDenoisingOption(last_ssrc_, &frame_forwarder, true); 3740 3741 ASSERT_TRUE(stream->GetVp8Settings(&vp8_settings)) << "No VP8 config set."; 3742 EXPECT_TRUE(vp8_settings.denoisingOn); 3743 EXPECT_TRUE(vp8_settings.automaticResizeOn); 3744 EXPECT_TRUE(stream->GetEncoderConfig().frame_drop_enabled); 3745 3746 EXPECT_TRUE(send_channel_->SetVideoSend(last_ssrc_, nullptr, nullptr)); 3747 stream = SetUpSimulcast(true, /*with_rtx=*/false); 3748 EXPECT_TRUE( 3749 send_channel_->SetVideoSend(last_ssrc_, nullptr, &frame_forwarder)); 3750 send_channel_->SetSend(true); 3751 frame_forwarder.IncomingCapturedFrame(frame_source_.GetFrame()); 3752 3753 EXPECT_EQ(3u, stream->GetVideoStreams().size()); 3754 ASSERT_TRUE(stream->GetVp8Settings(&vp8_settings)) << "No VP8 config set."; 3755 // Autmatic resize off when using simulcast. 3756 EXPECT_FALSE(vp8_settings.automaticResizeOn); 3757 EXPECT_TRUE(stream->GetEncoderConfig().frame_drop_enabled); 3758 3759 // In screen-share mode, denoising is forced off. 3760 VideoOptions options; 3761 options.is_screencast = true; 3762 EXPECT_TRUE( 3763 send_channel_->SetVideoSend(last_ssrc_, &options, &frame_forwarder)); 3764 3765 stream = SetDenoisingOption(last_ssrc_, &frame_forwarder, false); 3766 3767 EXPECT_EQ(3u, stream->GetVideoStreams().size()); 3768 ASSERT_TRUE(stream->GetVp8Settings(&vp8_settings)) << "No VP8 config set."; 3769 EXPECT_FALSE(vp8_settings.denoisingOn); 3770 // Resizing always off for screen sharing. 3771 EXPECT_FALSE(vp8_settings.automaticResizeOn); 3772 EXPECT_TRUE(stream->GetEncoderConfig().frame_drop_enabled); 3773 3774 stream = SetDenoisingOption(last_ssrc_, &frame_forwarder, true); 3775 3776 ASSERT_TRUE(stream->GetVp8Settings(&vp8_settings)) << "No VP8 config set."; 3777 EXPECT_FALSE(vp8_settings.denoisingOn); 3778 EXPECT_FALSE(vp8_settings.automaticResizeOn); 3779 EXPECT_TRUE(stream->GetEncoderConfig().frame_drop_enabled); 3780 3781 EXPECT_TRUE(send_channel_->SetVideoSend(last_ssrc_, nullptr, nullptr)); 3782 } 3783 3784 TEST_F(WebRtcVideoChannelTest, VerifyAv1SpecificSettings) { 3785 VideoSenderParameters parameters; 3786 parameters.codecs.push_back(GetEngineCodec("AV1")); 3787 ASSERT_TRUE(send_channel_->SetSenderParameters(parameters)); 3788 FrameForwarder frame_forwarder; 3789 VideoCodecAV1 settings; 3790 3791 // Single-stream settings should apply with RTX as well (verifies that we 3792 // check number of regular SSRCs and not StreamParams::ssrcs which contains 3793 // both RTX and regular SSRCs). 3794 FakeVideoSendStream* stream = SetUpSimulcast(false, /*with_rtx=*/true); 3795 EXPECT_TRUE( 3796 send_channel_->SetVideoSend(last_ssrc_, nullptr, &frame_forwarder)); 3797 send_channel_->SetSend(true); 3798 frame_forwarder.IncomingCapturedFrame(frame_source_.GetFrame()); 3799 3800 ASSERT_TRUE(stream->GetAv1Settings(&settings)) << "No AV1 config set."; 3801 EXPECT_TRUE(settings.automatic_resize_on); 3802 3803 RtpParameters rtp_parameters = 3804 send_channel_->GetRtpSendParameters(last_ssrc_); 3805 EXPECT_THAT(rtp_parameters.encodings, 3806 ElementsAre(Field(&RtpEncodingParameters::scalability_mode, 3807 std::nullopt))); 3808 rtp_parameters.encodings[0].scalability_mode = "L2T3"; 3809 EXPECT_TRUE( 3810 send_channel_->SetRtpSendParameters(last_ssrc_, rtp_parameters).ok()); 3811 frame_forwarder.IncomingCapturedFrame(frame_source_.GetFrame()); 3812 3813 ASSERT_TRUE(stream->GetAv1Settings(&settings)) << "No AV1 config set."; 3814 EXPECT_FALSE(settings.automatic_resize_on); 3815 3816 EXPECT_TRUE(send_channel_->SetVideoSend(last_ssrc_, nullptr, nullptr)); 3817 } 3818 3819 // Test that setting the same options doesn't result in the encoder being 3820 // reconfigured. 3821 TEST_F(WebRtcVideoChannelTest, SetIdenticalOptionsDoesntReconfigureEncoder) { 3822 VideoOptions options; 3823 FrameForwarder frame_forwarder; 3824 3825 AddSendStream(); 3826 VideoSenderParameters parameters; 3827 parameters.codecs.push_back(GetEngineCodec("VP8")); 3828 ASSERT_TRUE(send_channel_->SetSenderParameters(parameters)); 3829 FakeVideoSendStream* send_stream = fake_call_->GetVideoSendStreams().front(); 3830 3831 EXPECT_TRUE( 3832 send_channel_->SetVideoSend(last_ssrc_, &options, &frame_forwarder)); 3833 EXPECT_TRUE( 3834 send_channel_->SetVideoSend(last_ssrc_, &options, &frame_forwarder)); 3835 frame_forwarder.IncomingCapturedFrame(frame_source_.GetFrame()); 3836 // Expect 1 reconfigurations at this point from the initial configuration. 3837 EXPECT_EQ(1, send_stream->num_encoder_reconfigurations()); 3838 3839 FrameForwarder new_frame_forwarder; 3840 3841 // Set the options one more time but with a new source instance, expect 3842 // one additional reconfiguration. 3843 EXPECT_TRUE( 3844 send_channel_->SetVideoSend(last_ssrc_, &options, &new_frame_forwarder)); 3845 new_frame_forwarder.IncomingCapturedFrame(frame_source_.GetFrame()); 3846 EXPECT_EQ(2, send_stream->num_encoder_reconfigurations()); 3847 3848 EXPECT_TRUE(send_channel_->SetVideoSend(last_ssrc_, nullptr, nullptr)); 3849 } 3850 3851 // Test that if a new source is set, we reconfigure the encoder even if the 3852 // same options are used. 3853 TEST_F(WebRtcVideoChannelTest, 3854 SetNewSourceWithIdenticalOptionsReconfiguresEncoder) { 3855 VideoOptions options; 3856 FrameForwarder frame_forwarder; 3857 3858 AddSendStream(); 3859 VideoSenderParameters parameters; 3860 parameters.codecs.push_back(GetEngineCodec("VP8")); 3861 ASSERT_TRUE(send_channel_->SetSenderParameters(parameters)); 3862 FakeVideoSendStream* send_stream = fake_call_->GetVideoSendStreams().front(); 3863 3864 EXPECT_TRUE( 3865 send_channel_->SetVideoSend(last_ssrc_, &options, &frame_forwarder)); 3866 EXPECT_TRUE( 3867 send_channel_->SetVideoSend(last_ssrc_, &options, &frame_forwarder)); 3868 frame_forwarder.IncomingCapturedFrame(frame_source_.GetFrame()); 3869 // Expect 1 reconfigurations at this point from the initial configuration. 3870 EXPECT_EQ(1, send_stream->num_encoder_reconfigurations()); 3871 3872 // Set the options one more time and expect no additional reconfigurations. 3873 EXPECT_TRUE( 3874 send_channel_->SetVideoSend(last_ssrc_, &options, &frame_forwarder)); 3875 EXPECT_EQ(1, send_stream->num_encoder_reconfigurations()); 3876 3877 // Change `options` and expect 2 reconfigurations. 3878 options.video_noise_reduction = true; 3879 EXPECT_TRUE( 3880 send_channel_->SetVideoSend(last_ssrc_, &options, &frame_forwarder)); 3881 EXPECT_EQ(2, send_stream->num_encoder_reconfigurations()); 3882 3883 EXPECT_TRUE(send_channel_->SetVideoSend(last_ssrc_, nullptr, nullptr)); 3884 } 3885 3886 class Vp9SettingsTest : public WebRtcVideoChannelTest { 3887 public: 3888 Vp9SettingsTest() : Vp9SettingsTest("") {} 3889 explicit Vp9SettingsTest(const char* field_trials) 3890 : WebRtcVideoChannelTest(field_trials) { 3891 encoder_factory_->AddSupportedVideoCodecType("VP9"); 3892 } 3893 ~Vp9SettingsTest() override {} 3894 3895 protected: 3896 void TearDown() override { 3897 // Remove references to encoder_factory_ since this will be destroyed 3898 // before send_channel_ and engine_-> 3899 ASSERT_TRUE(send_channel_->SetSenderParameters(send_parameters_)); 3900 } 3901 }; 3902 3903 TEST_F(Vp9SettingsTest, VerifyVp9SpecificSettings) { 3904 encoder_factory_->AddSupportedVideoCodec( 3905 SdpVideoFormat("VP9", CodecParameterMap(), 3906 {ScalabilityMode::kL1T1, ScalabilityMode::kL2T1})); 3907 3908 VideoSenderParameters parameters; 3909 parameters.codecs.push_back(GetEngineCodec("VP9")); 3910 ASSERT_TRUE(send_channel_->SetSenderParameters(parameters)); 3911 3912 FakeVideoSendStream* stream = SetUpSimulcast(false, /*with_rtx=*/false); 3913 3914 FrameForwarder frame_forwarder; 3915 EXPECT_TRUE( 3916 send_channel_->SetVideoSend(last_ssrc_, nullptr, &frame_forwarder)); 3917 send_channel_->SetSend(true); 3918 3919 frame_forwarder.IncomingCapturedFrame(frame_source_.GetFrame()); 3920 3921 VideoCodecVP9 vp9_settings; 3922 ASSERT_TRUE(stream->GetVp9Settings(&vp9_settings)) << "No VP9 config set."; 3923 EXPECT_TRUE(vp9_settings.denoisingOn) 3924 << "VP9 denoising should be on by default."; 3925 EXPECT_TRUE(vp9_settings.automaticResizeOn) 3926 << "Automatic resize on for one active stream."; 3927 3928 stream = SetDenoisingOption(last_ssrc_, &frame_forwarder, false); 3929 3930 ASSERT_TRUE(stream->GetVp9Settings(&vp9_settings)) << "No VP9 config set."; 3931 EXPECT_FALSE(vp9_settings.denoisingOn); 3932 EXPECT_TRUE(stream->GetEncoderConfig().frame_drop_enabled) 3933 << "Frame dropping always on for real time video."; 3934 EXPECT_TRUE(vp9_settings.automaticResizeOn); 3935 3936 stream = SetDenoisingOption(last_ssrc_, &frame_forwarder, true); 3937 3938 ASSERT_TRUE(stream->GetVp9Settings(&vp9_settings)) << "No VP9 config set."; 3939 EXPECT_TRUE(vp9_settings.denoisingOn); 3940 EXPECT_TRUE(stream->GetEncoderConfig().frame_drop_enabled); 3941 EXPECT_TRUE(vp9_settings.automaticResizeOn); 3942 3943 RtpParameters rtp_parameters = 3944 send_channel_->GetRtpSendParameters(last_ssrc_); 3945 EXPECT_THAT(rtp_parameters.encodings, 3946 ElementsAre(Field(&RtpEncodingParameters::scalability_mode, 3947 std::nullopt))); 3948 rtp_parameters.encodings[0].scalability_mode = "L2T1"; 3949 EXPECT_TRUE( 3950 send_channel_->SetRtpSendParameters(last_ssrc_, rtp_parameters).ok()); 3951 3952 ASSERT_TRUE(stream->GetVp9Settings(&vp9_settings)) << "No VP9 config set."; 3953 EXPECT_TRUE(vp9_settings.denoisingOn); 3954 EXPECT_TRUE(stream->GetEncoderConfig().frame_drop_enabled); 3955 EXPECT_FALSE(vp9_settings.automaticResizeOn) 3956 << "Automatic resize off for multiple spatial layers."; 3957 3958 rtp_parameters = send_channel_->GetRtpSendParameters(last_ssrc_); 3959 EXPECT_THAT( 3960 rtp_parameters.encodings, 3961 ElementsAre(Field(&RtpEncodingParameters::scalability_mode, "L2T1"))); 3962 rtp_parameters.encodings[0].scalability_mode = "L1T1"; 3963 EXPECT_TRUE( 3964 send_channel_->SetRtpSendParameters(last_ssrc_, rtp_parameters).ok()); 3965 rtp_parameters = send_channel_->GetRtpSendParameters(last_ssrc_); 3966 EXPECT_THAT( 3967 rtp_parameters.encodings, 3968 ElementsAre(Field(&RtpEncodingParameters::scalability_mode, "L1T1"))); 3969 3970 ASSERT_TRUE(stream->GetVp9Settings(&vp9_settings)) << "No VP9 config set."; 3971 EXPECT_TRUE(vp9_settings.denoisingOn); 3972 EXPECT_TRUE(stream->GetEncoderConfig().frame_drop_enabled); 3973 EXPECT_TRUE(vp9_settings.automaticResizeOn) 3974 << "Automatic resize on for one spatial layer."; 3975 3976 // In screen-share mode, denoising is forced off. 3977 VideoOptions options; 3978 options.is_screencast = true; 3979 EXPECT_TRUE( 3980 send_channel_->SetVideoSend(last_ssrc_, &options, &frame_forwarder)); 3981 3982 stream = SetDenoisingOption(last_ssrc_, &frame_forwarder, false); 3983 3984 ASSERT_TRUE(stream->GetVp9Settings(&vp9_settings)) << "No VP9 config set."; 3985 EXPECT_FALSE(vp9_settings.denoisingOn); 3986 EXPECT_TRUE(stream->GetEncoderConfig().frame_drop_enabled) 3987 << "Frame dropping always on for screen sharing."; 3988 EXPECT_FALSE(vp9_settings.automaticResizeOn) 3989 << "Automatic resize off for screencast."; 3990 3991 stream = SetDenoisingOption(last_ssrc_, &frame_forwarder, false); 3992 3993 ASSERT_TRUE(stream->GetVp9Settings(&vp9_settings)) << "No VP9 config set."; 3994 EXPECT_FALSE(vp9_settings.denoisingOn); 3995 EXPECT_TRUE(stream->GetEncoderConfig().frame_drop_enabled); 3996 EXPECT_FALSE(vp9_settings.automaticResizeOn); 3997 3998 EXPECT_TRUE(send_channel_->SetVideoSend(last_ssrc_, nullptr, nullptr)); 3999 } 4000 4001 TEST_F(Vp9SettingsTest, MultipleSsrcsEnablesSvc) { 4002 VideoSenderParameters parameters; 4003 parameters.codecs.push_back(GetEngineCodec("VP9")); 4004 ASSERT_TRUE(send_channel_->SetSenderParameters(parameters)); 4005 4006 std::vector<uint32_t> ssrcs = MAKE_VECTOR(kSsrcs3); 4007 4008 FakeVideoSendStream* stream = 4009 AddSendStream(CreateSimStreamParams("cname", ssrcs)); 4010 4011 VideoSendStream::Config config = stream->GetConfig().Copy(); 4012 4013 FrameForwarder frame_forwarder; 4014 EXPECT_TRUE(send_channel_->SetVideoSend(ssrcs[0], nullptr, &frame_forwarder)); 4015 send_channel_->SetSend(true); 4016 4017 frame_forwarder.IncomingCapturedFrame(frame_source_.GetFrame()); 4018 4019 VideoCodecVP9 vp9_settings; 4020 ASSERT_TRUE(stream->GetVp9Settings(&vp9_settings)) << "No VP9 config set."; 4021 4022 const size_t kNumSpatialLayers = ssrcs.size(); 4023 const size_t kNumTemporalLayers = 3; 4024 EXPECT_EQ(vp9_settings.numberOfSpatialLayers, kNumSpatialLayers); 4025 EXPECT_EQ(vp9_settings.numberOfTemporalLayers, kNumTemporalLayers); 4026 4027 EXPECT_TRUE(send_channel_->SetVideoSend(ssrcs[0], nullptr, nullptr)); 4028 } 4029 4030 TEST_F(Vp9SettingsTest, SvcModeCreatesSingleRtpStream) { 4031 VideoSenderParameters parameters; 4032 parameters.codecs.push_back(GetEngineCodec("VP9")); 4033 ASSERT_TRUE(send_channel_->SetSenderParameters(parameters)); 4034 4035 std::vector<uint32_t> ssrcs = MAKE_VECTOR(kSsrcs3); 4036 4037 FakeVideoSendStream* stream = 4038 AddSendStream(CreateSimStreamParams("cname", ssrcs)); 4039 4040 VideoSendStream::Config config = stream->GetConfig().Copy(); 4041 4042 // Despite 3 ssrcs provided, single layer is used. 4043 EXPECT_EQ(1u, config.rtp.ssrcs.size()); 4044 4045 FrameForwarder frame_forwarder; 4046 EXPECT_TRUE(send_channel_->SetVideoSend(ssrcs[0], nullptr, &frame_forwarder)); 4047 send_channel_->SetSend(true); 4048 4049 frame_forwarder.IncomingCapturedFrame(frame_source_.GetFrame()); 4050 4051 VideoCodecVP9 vp9_settings; 4052 ASSERT_TRUE(stream->GetVp9Settings(&vp9_settings)) << "No VP9 config set."; 4053 4054 const size_t kNumSpatialLayers = ssrcs.size(); 4055 EXPECT_EQ(vp9_settings.numberOfSpatialLayers, kNumSpatialLayers); 4056 4057 EXPECT_TRUE(send_channel_->SetVideoSend(ssrcs[0], nullptr, nullptr)); 4058 } 4059 4060 TEST_F(Vp9SettingsTest, AllEncodingParametersCopied) { 4061 VideoSenderParameters send_parameters; 4062 send_parameters.codecs.push_back(GetEngineCodec("VP9")); 4063 ASSERT_TRUE(send_channel_->SetSenderParameters(send_parameters)); 4064 4065 const size_t kNumSpatialLayers = 3; 4066 std::vector<uint32_t> ssrcs = MAKE_VECTOR(kSsrcs3); 4067 4068 FakeVideoSendStream* stream = 4069 AddSendStream(CreateSimStreamParams("cname", ssrcs)); 4070 4071 RtpParameters parameters = send_channel_->GetRtpSendParameters(ssrcs[0]); 4072 ASSERT_EQ(kNumSpatialLayers, parameters.encodings.size()); 4073 ASSERT_TRUE(parameters.encodings[0].active); 4074 ASSERT_TRUE(parameters.encodings[1].active); 4075 ASSERT_TRUE(parameters.encodings[2].active); 4076 // Invert value to verify copying. 4077 parameters.encodings[1].active = false; 4078 EXPECT_TRUE(send_channel_->SetRtpSendParameters(ssrcs[0], parameters).ok()); 4079 4080 VideoEncoderConfig encoder_config = stream->GetEncoderConfig().Copy(); 4081 4082 // number_of_streams should be 1 since all spatial layers are sent on the 4083 // same SSRC. But encoding parameters of all layers is supposed to be copied 4084 // and stored in simulcast_layers[]. 4085 EXPECT_EQ(1u, encoder_config.number_of_streams); 4086 EXPECT_EQ(encoder_config.simulcast_layers.size(), kNumSpatialLayers); 4087 EXPECT_TRUE(encoder_config.simulcast_layers[0].active); 4088 EXPECT_FALSE(encoder_config.simulcast_layers[1].active); 4089 EXPECT_TRUE(encoder_config.simulcast_layers[2].active); 4090 } 4091 4092 TEST_F(Vp9SettingsTest, MaxBitrateDeterminedBySvcResolutions) { 4093 VideoSenderParameters parameters; 4094 parameters.codecs.push_back(GetEngineCodec("VP9")); 4095 ASSERT_TRUE(send_channel_->SetSenderParameters(parameters)); 4096 4097 std::vector<uint32_t> ssrcs = MAKE_VECTOR(kSsrcs3); 4098 4099 FakeVideoSendStream* stream = 4100 AddSendStream(CreateSimStreamParams("cname", ssrcs)); 4101 4102 VideoSendStream::Config config = stream->GetConfig().Copy(); 4103 4104 FrameForwarder frame_forwarder; 4105 EXPECT_TRUE(send_channel_->SetVideoSend(ssrcs[0], nullptr, &frame_forwarder)); 4106 send_channel_->SetSend(true); 4107 4108 // Send frame at 1080p@30fps. 4109 frame_forwarder.IncomingCapturedFrame( 4110 frame_source_.GetFrame(1920, 1080, VideoRotation::kVideoRotation_0, 4111 /*duration_us=*/33000)); 4112 4113 VideoCodecVP9 vp9_settings; 4114 ASSERT_TRUE(stream->GetVp9Settings(&vp9_settings)) << "No VP9 config set."; 4115 4116 const size_t kNumSpatialLayers = ssrcs.size(); 4117 const size_t kNumTemporalLayers = 3; 4118 EXPECT_EQ(vp9_settings.numberOfSpatialLayers, kNumSpatialLayers); 4119 EXPECT_EQ(vp9_settings.numberOfTemporalLayers, kNumTemporalLayers); 4120 4121 EXPECT_TRUE(send_channel_->SetVideoSend(ssrcs[0], nullptr, nullptr)); 4122 4123 // VideoStream max bitrate should be more than legacy 2.5Mbps default stream 4124 // cap. 4125 EXPECT_THAT(stream->GetVideoStreams(), 4126 ElementsAre(Field(&VideoStream::max_bitrate_bps, Gt(2500000)))); 4127 4128 // Update send parameters to 2Mbps, this should cap the max bitrate of the 4129 // stream. 4130 parameters.max_bandwidth_bps = 2000000; 4131 send_channel_->SetSenderParameters(parameters); 4132 EXPECT_THAT(stream->GetVideoStreams(), 4133 ElementsAre(Field(&VideoStream::max_bitrate_bps, Eq(2000000)))); 4134 } 4135 4136 TEST_F(Vp9SettingsTest, Vp9SvcTargetBitrateCappedByMax) { 4137 VideoSenderParameters parameters; 4138 parameters.codecs.push_back(GetEngineCodec("VP9")); 4139 ASSERT_TRUE(send_channel_->SetSenderParameters(parameters)); 4140 4141 std::vector<uint32_t> ssrcs = MAKE_VECTOR(kSsrcs3); 4142 4143 FakeVideoSendStream* stream = 4144 AddSendStream(CreateSimStreamParams("cname", ssrcs)); 4145 4146 VideoSendStream::Config config = stream->GetConfig().Copy(); 4147 4148 FrameForwarder frame_forwarder; 4149 EXPECT_TRUE(send_channel_->SetVideoSend(ssrcs[0], nullptr, &frame_forwarder)); 4150 send_channel_->SetSend(true); 4151 4152 // Set up 3 spatial layers with 720p, which should result in a max bitrate of 4153 // 2084 kbps. 4154 frame_forwarder.IncomingCapturedFrame( 4155 frame_source_.GetFrame(1280, 720, VideoRotation::kVideoRotation_0, 4156 /*duration_us=*/33000)); 4157 4158 VideoCodecVP9 vp9_settings; 4159 ASSERT_TRUE(stream->GetVp9Settings(&vp9_settings)) << "No VP9 config set."; 4160 4161 const size_t kNumSpatialLayers = ssrcs.size(); 4162 const size_t kNumTemporalLayers = 3; 4163 EXPECT_EQ(vp9_settings.numberOfSpatialLayers, kNumSpatialLayers); 4164 EXPECT_EQ(vp9_settings.numberOfTemporalLayers, kNumTemporalLayers); 4165 4166 EXPECT_TRUE(send_channel_->SetVideoSend(ssrcs[0], nullptr, nullptr)); 4167 4168 // VideoStream both min and max bitrate should be lower than legacy 2.5Mbps 4169 // default stream cap. 4170 EXPECT_THAT(stream->GetVideoStreams()[0], 4171 AllOf(Field(&VideoStream::max_bitrate_bps, Lt(2500000)), 4172 Field(&VideoStream::target_bitrate_bps, Lt(2500000)))); 4173 } 4174 4175 class Vp9SettingsTestWithFieldTrial 4176 : public Vp9SettingsTest, 4177 public ::testing::WithParamInterface< 4178 ::testing::tuple<const char*, int, int, InterLayerPredMode>> { 4179 protected: 4180 Vp9SettingsTestWithFieldTrial() 4181 : Vp9SettingsTest(::testing::get<0>(GetParam())), 4182 num_spatial_layers_(::testing::get<1>(GetParam())), 4183 num_temporal_layers_(::testing::get<2>(GetParam())), 4184 inter_layer_pred_mode_(::testing::get<3>(GetParam())) {} 4185 4186 void VerifySettings(int num_spatial_layers, 4187 int num_temporal_layers, 4188 InterLayerPredMode /* interLayerPred */) { 4189 VideoSenderParameters parameters; 4190 parameters.codecs.push_back(GetEngineCodec("VP9")); 4191 ASSERT_TRUE(send_channel_->SetSenderParameters(parameters)); 4192 4193 FakeVideoSendStream* stream = SetUpSimulcast(false, /*with_rtx=*/false); 4194 4195 FrameForwarder frame_forwarder; 4196 EXPECT_TRUE( 4197 send_channel_->SetVideoSend(last_ssrc_, nullptr, &frame_forwarder)); 4198 send_channel_->SetSend(true); 4199 4200 frame_forwarder.IncomingCapturedFrame(frame_source_.GetFrame()); 4201 4202 VideoCodecVP9 vp9_settings; 4203 ASSERT_TRUE(stream->GetVp9Settings(&vp9_settings)) << "No VP9 config set."; 4204 EXPECT_EQ(num_spatial_layers, vp9_settings.numberOfSpatialLayers); 4205 EXPECT_EQ(num_temporal_layers, vp9_settings.numberOfTemporalLayers); 4206 EXPECT_EQ(inter_layer_pred_mode_, vp9_settings.interLayerPred); 4207 4208 EXPECT_TRUE(send_channel_->SetVideoSend(last_ssrc_, nullptr, nullptr)); 4209 } 4210 4211 const uint8_t num_spatial_layers_; 4212 const uint8_t num_temporal_layers_; 4213 const InterLayerPredMode inter_layer_pred_mode_; 4214 }; 4215 4216 TEST_P(Vp9SettingsTestWithFieldTrial, VerifyCodecSettings) { 4217 VerifySettings(num_spatial_layers_, num_temporal_layers_, 4218 inter_layer_pred_mode_); 4219 } 4220 4221 INSTANTIATE_TEST_SUITE_P( 4222 All, 4223 Vp9SettingsTestWithFieldTrial, 4224 Values( 4225 std::make_tuple("", 1, 1, InterLayerPredMode::kOnKeyPic), 4226 std::make_tuple("WebRTC-Vp9InterLayerPred/Default/", 4227 1, 4228 1, 4229 InterLayerPredMode::kOnKeyPic), 4230 std::make_tuple("WebRTC-Vp9InterLayerPred/Disabled/", 4231 1, 4232 1, 4233 InterLayerPredMode::kOnKeyPic), 4234 std::make_tuple( 4235 "WebRTC-Vp9InterLayerPred/Enabled,inter_layer_pred_mode:off/", 4236 1, 4237 1, 4238 InterLayerPredMode::kOff), 4239 std::make_tuple( 4240 "WebRTC-Vp9InterLayerPred/Enabled,inter_layer_pred_mode:on/", 4241 1, 4242 1, 4243 InterLayerPredMode::kOn), 4244 std::make_tuple( 4245 "WebRTC-Vp9InterLayerPred/Enabled,inter_layer_pred_mode:onkeypic/", 4246 1, 4247 1, 4248 InterLayerPredMode::kOnKeyPic))); 4249 4250 TEST_F(WebRtcVideoChannelTest, VerifyMinBitrate) { 4251 std::vector<VideoStream> streams = AddSendStream()->GetVideoStreams(); 4252 ASSERT_EQ(1u, streams.size()); 4253 EXPECT_EQ(kDefaultMinVideoBitrateBps, streams[0].min_bitrate_bps); 4254 } 4255 4256 class WebRtcVideoChanneWithForcedFallbackTest : public WebRtcVideoChannelTest { 4257 public: 4258 WebRtcVideoChanneWithForcedFallbackTest() 4259 : WebRtcVideoChannelTest( 4260 "WebRTC-VP8-Forced-Fallback-Encoder-v2/Enabled-1,2,34567/") {} 4261 }; 4262 4263 TEST_F(WebRtcVideoChanneWithForcedFallbackTest, 4264 VerifyMinBitrateWithForcedFallbackFieldTrial) { 4265 std::vector<VideoStream> streams = AddSendStream()->GetVideoStreams(); 4266 ASSERT_EQ(1u, streams.size()); 4267 EXPECT_EQ(34567, streams[0].min_bitrate_bps); 4268 } 4269 4270 TEST_F(WebRtcVideoChannelTest, 4271 BalancedDegradationPreferenceNotSupportedWithoutFieldtrial) { 4272 const bool kResolutionScalingEnabled = true; 4273 const bool kFpsScalingEnabled = false; 4274 TestDegradationPreference(kResolutionScalingEnabled, kFpsScalingEnabled); 4275 } 4276 4277 class WebRtcVideoChannelWithBalancedDegradationTest 4278 : public WebRtcVideoChannelTest { 4279 public: 4280 WebRtcVideoChannelWithBalancedDegradationTest() 4281 : WebRtcVideoChannelTest("WebRTC-Video-BalancedDegradation/Enabled/") {} 4282 }; 4283 4284 TEST_F(WebRtcVideoChannelWithBalancedDegradationTest, 4285 BalancedDegradationPreferenceSupportedBehindFieldtrial) { 4286 const bool kResolutionScalingEnabled = true; 4287 const bool kFpsScalingEnabled = true; 4288 TestDegradationPreference(kResolutionScalingEnabled, kFpsScalingEnabled); 4289 } 4290 4291 TEST_F(WebRtcVideoChannelTest, AdaptsOnOveruse) { 4292 TestCpuAdaptation(true, false); 4293 } 4294 4295 TEST_F(WebRtcVideoChannelTest, DoesNotAdaptOnOveruseWhenDisabled) { 4296 TestCpuAdaptation(false, false); 4297 } 4298 4299 TEST_F(WebRtcVideoChannelTest, DoesNotAdaptWhenScreeensharing) { 4300 TestCpuAdaptation(false, true); 4301 } 4302 4303 TEST_F(WebRtcVideoChannelTest, DoesNotAdaptOnOveruseWhenScreensharing) { 4304 TestCpuAdaptation(true, true); 4305 } 4306 4307 TEST_F(WebRtcVideoChannelTest, PreviousAdaptationDoesNotApplyToScreenshare) { 4308 Codec codec = GetEngineCodec("VP8"); 4309 VideoSenderParameters parameters; 4310 parameters.codecs.push_back(codec); 4311 4312 MediaConfig media_config = GetMediaConfig(); 4313 media_config.video.enable_cpu_adaptation = true; 4314 send_channel_ = engine_->CreateSendChannel( 4315 env_, fake_call_.get(), media_config, VideoOptions(), CryptoOptions(), 4316 video_bitrate_allocator_factory_.get()); 4317 receive_channel_ = engine_->CreateReceiveChannel( 4318 env_, fake_call_.get(), media_config, VideoOptions(), CryptoOptions()); 4319 4320 send_channel_->OnReadyToSend(true); 4321 ASSERT_TRUE(send_channel_->SetSenderParameters(parameters)); 4322 4323 AddSendStream(); 4324 FrameForwarder frame_forwarder; 4325 4326 ASSERT_TRUE(send_channel_->SetSend(true)); 4327 VideoOptions camera_options; 4328 camera_options.is_screencast = false; 4329 send_channel_->SetVideoSend(last_ssrc_, &camera_options, &frame_forwarder); 4330 4331 ASSERT_EQ(1u, fake_call_->GetVideoSendStreams().size()); 4332 FakeVideoSendStream* send_stream = fake_call_->GetVideoSendStreams().front(); 4333 4334 EXPECT_TRUE(send_stream->resolution_scaling_enabled()); 4335 // Dont' expect anything on framerate_scaling_enabled, since the default is 4336 // transitioning from MAINTAIN_FRAMERATE to BALANCED. 4337 4338 // Switch to screen share. Expect no resolution scaling. 4339 VideoOptions screenshare_options; 4340 screenshare_options.is_screencast = true; 4341 send_channel_->SetVideoSend(last_ssrc_, &screenshare_options, 4342 &frame_forwarder); 4343 ASSERT_EQ(2, fake_call_->GetNumCreatedSendStreams()); 4344 send_stream = fake_call_->GetVideoSendStreams().front(); 4345 EXPECT_FALSE(send_stream->resolution_scaling_enabled()); 4346 4347 // Switch back to the normal capturer. Expect resolution scaling to be 4348 // reenabled. 4349 send_channel_->SetVideoSend(last_ssrc_, &camera_options, &frame_forwarder); 4350 send_stream = fake_call_->GetVideoSendStreams().front(); 4351 ASSERT_EQ(3, fake_call_->GetNumCreatedSendStreams()); 4352 send_stream = fake_call_->GetVideoSendStreams().front(); 4353 EXPECT_TRUE(send_stream->resolution_scaling_enabled()); 4354 4355 EXPECT_TRUE(send_channel_->SetVideoSend(last_ssrc_, nullptr, nullptr)); 4356 } 4357 4358 // TODO(asapersson): Remove this test when the balanced field trial is removed. 4359 void WebRtcVideoChannelTest::TestDegradationPreference( 4360 bool resolution_scaling_enabled, 4361 bool fps_scaling_enabled) { 4362 Codec codec = GetEngineCodec("VP8"); 4363 VideoSenderParameters parameters; 4364 parameters.codecs.push_back(codec); 4365 4366 MediaConfig media_config = GetMediaConfig(); 4367 media_config.video.enable_cpu_adaptation = true; 4368 send_channel_ = engine_->CreateSendChannel( 4369 env_, fake_call_.get(), media_config, VideoOptions(), CryptoOptions(), 4370 video_bitrate_allocator_factory_.get()); 4371 receive_channel_ = engine_->CreateReceiveChannel( 4372 env_, fake_call_.get(), media_config, VideoOptions(), CryptoOptions()); 4373 send_channel_->OnReadyToSend(true); 4374 4375 EXPECT_TRUE(send_channel_->SetSenderParameters(parameters)); 4376 4377 AddSendStream(); 4378 4379 FrameForwarder frame_forwarder; 4380 VideoOptions options; 4381 EXPECT_TRUE( 4382 send_channel_->SetVideoSend(last_ssrc_, &options, &frame_forwarder)); 4383 4384 EXPECT_TRUE(send_channel_->SetSend(true)); 4385 4386 FakeVideoSendStream* send_stream = fake_call_->GetVideoSendStreams().front(); 4387 EXPECT_EQ(resolution_scaling_enabled, 4388 send_stream->resolution_scaling_enabled()); 4389 EXPECT_EQ(fps_scaling_enabled, send_stream->framerate_scaling_enabled()); 4390 4391 EXPECT_TRUE(send_channel_->SetVideoSend(last_ssrc_, nullptr, nullptr)); 4392 } 4393 4394 void WebRtcVideoChannelTest::TestCpuAdaptation(bool enable_overuse, 4395 bool is_screenshare) { 4396 Codec codec = GetEngineCodec("VP8"); 4397 VideoSenderParameters parameters; 4398 parameters.codecs.push_back(codec); 4399 4400 MediaConfig media_config = GetMediaConfig(); 4401 if (enable_overuse) { 4402 media_config.video.enable_cpu_adaptation = true; 4403 } 4404 send_channel_ = engine_->CreateSendChannel( 4405 env_, fake_call_.get(), media_config, VideoOptions(), CryptoOptions(), 4406 video_bitrate_allocator_factory_.get()); 4407 receive_channel_ = engine_->CreateReceiveChannel( 4408 env_, fake_call_.get(), media_config, VideoOptions(), CryptoOptions()); 4409 send_channel_->OnReadyToSend(true); 4410 4411 EXPECT_TRUE(send_channel_->SetSenderParameters(parameters)); 4412 4413 AddSendStream(); 4414 4415 FrameForwarder frame_forwarder; 4416 VideoOptions options; 4417 options.is_screencast = is_screenshare; 4418 EXPECT_TRUE( 4419 send_channel_->SetVideoSend(last_ssrc_, &options, &frame_forwarder)); 4420 4421 EXPECT_TRUE(send_channel_->SetSend(true)); 4422 4423 FakeVideoSendStream* send_stream = fake_call_->GetVideoSendStreams().front(); 4424 4425 if (!enable_overuse) { 4426 EXPECT_FALSE(send_stream->resolution_scaling_enabled()); 4427 EXPECT_FALSE(send_stream->framerate_scaling_enabled()); 4428 } else if (is_screenshare) { 4429 EXPECT_FALSE(send_stream->resolution_scaling_enabled()); 4430 EXPECT_TRUE(send_stream->framerate_scaling_enabled()); 4431 } else { 4432 EXPECT_TRUE(send_stream->resolution_scaling_enabled()); 4433 EXPECT_FALSE(send_stream->framerate_scaling_enabled()); 4434 } 4435 EXPECT_TRUE(send_channel_->SetVideoSend(last_ssrc_, nullptr, nullptr)); 4436 } 4437 4438 TEST_F(WebRtcVideoChannelTest, EstimatesNtpStartTimeCorrectly) { 4439 // Start at last timestamp to verify that wraparounds are estimated correctly. 4440 static const uint32_t kInitialTimestamp = 0xFFFFFFFFu; 4441 static const int64_t kInitialNtpTimeMs = 1247891230; 4442 static const int kFrameOffsetMs = 20; 4443 EXPECT_TRUE(receive_channel_->SetReceiverParameters(recv_parameters_)); 4444 4445 FakeVideoReceiveStream* stream = AddRecvStream(); 4446 FakeVideoRenderer renderer; 4447 EXPECT_TRUE(receive_channel_->SetSink(last_ssrc_, &renderer)); 4448 4449 VideoFrame video_frame = 4450 VideoFrame::Builder() 4451 .set_video_frame_buffer(CreateBlackFrameBuffer(4, 4)) 4452 .set_rtp_timestamp(kInitialTimestamp) 4453 .set_timestamp_us(0) 4454 .set_rotation(kVideoRotation_0) 4455 .build(); 4456 // Initial NTP time is not available on the first frame, but should still be 4457 // able to be estimated. 4458 stream->InjectFrame(video_frame); 4459 4460 EXPECT_EQ(1, renderer.num_rendered_frames()); 4461 4462 // This timestamp is kInitialTimestamp (-1) + kFrameOffsetMs * 90, which 4463 // triggers a constant-overflow warning, hence we're calculating it explicitly 4464 // here. 4465 time_controller_.AdvanceTime(TimeDelta::Millis(kFrameOffsetMs)); 4466 video_frame.set_rtp_timestamp(kFrameOffsetMs * 90 - 1); 4467 video_frame.set_ntp_time_ms(kInitialNtpTimeMs + kFrameOffsetMs); 4468 stream->InjectFrame(video_frame); 4469 4470 EXPECT_EQ(2, renderer.num_rendered_frames()); 4471 4472 // Verify that NTP time has been correctly deduced. 4473 VideoMediaSendInfo send_info; 4474 VideoMediaReceiveInfo receive_info; 4475 EXPECT_TRUE(send_channel_->GetStats(&send_info)); 4476 EXPECT_TRUE(receive_channel_->GetStats(&receive_info)); 4477 4478 ASSERT_EQ(1u, receive_info.receivers.size()); 4479 EXPECT_EQ(kInitialNtpTimeMs, 4480 receive_info.receivers[0].capture_start_ntp_time_ms); 4481 } 4482 4483 TEST_F(WebRtcVideoChannelTest, SetDefaultSendCodecs) { 4484 AssignDefaultAptRtxTypes(); 4485 ASSERT_TRUE(send_channel_->SetSenderParameters(send_parameters_)); 4486 4487 std::optional<Codec> codec = send_channel_->GetSendCodec(); 4488 ASSERT_TRUE(codec); 4489 EXPECT_TRUE(codec->Matches(engine_->LegacySendCodecs()[0])); 4490 4491 // Using a RTX setup to verify that the default RTX payload type is good. 4492 const std::vector<uint32_t> ssrcs = MAKE_VECTOR(kSsrcs1); 4493 const std::vector<uint32_t> rtx_ssrcs = MAKE_VECTOR(kRtxSsrcs1); 4494 FakeVideoSendStream* stream = 4495 AddSendStream(CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs)); 4496 VideoSendStream::Config config = stream->GetConfig().Copy(); 4497 4498 // Make sure NACK and FEC are enabled on the correct payload types. 4499 EXPECT_EQ(1000, config.rtp.nack.rtp_history_ms); 4500 EXPECT_EQ(GetEngineCodec("ulpfec").id, config.rtp.ulpfec.ulpfec_payload_type); 4501 EXPECT_EQ(GetEngineCodec("red").id, config.rtp.ulpfec.red_payload_type); 4502 4503 EXPECT_EQ(1u, config.rtp.rtx.ssrcs.size()); 4504 EXPECT_EQ(kRtxSsrcs1[0], config.rtp.rtx.ssrcs[0]); 4505 VerifySendStreamHasRtxTypes(config, default_apt_rtx_types_); 4506 // TODO(juberti): Check RTCP, PLI, TMMBR. 4507 } 4508 4509 TEST_F(WebRtcVideoChannelTest, SetSendCodecsWithoutPacketization) { 4510 VideoSenderParameters parameters; 4511 parameters.codecs.push_back(GetEngineCodec("VP8")); 4512 EXPECT_TRUE(send_channel_->SetSenderParameters(parameters)); 4513 4514 FakeVideoSendStream* stream = AddSendStream(); 4515 const VideoSendStream::Config config = stream->GetConfig().Copy(); 4516 EXPECT_FALSE(config.rtp.raw_payload); 4517 } 4518 4519 TEST_F(WebRtcVideoChannelTest, SetSendCodecsWithPacketization) { 4520 VideoSenderParameters parameters; 4521 parameters.codecs.push_back(GetEngineCodec("VP8")); 4522 parameters.codecs.back().packetization = kPacketizationParamRaw; 4523 EXPECT_TRUE(send_channel_->SetSenderParameters(parameters)); 4524 4525 FakeVideoSendStream* stream = AddSendStream(); 4526 const VideoSendStream::Config config = stream->GetConfig().Copy(); 4527 EXPECT_TRUE(config.rtp.raw_payload); 4528 } 4529 4530 // The following four tests ensures that FlexFEC is not activated by default 4531 // when the field trials are not enabled. 4532 // TODO(brandtr): Remove or update these tests when FlexFEC _is_ enabled by 4533 // default. 4534 TEST_F(WebRtcVideoChannelTest, FlexfecSendCodecWithoutSsrcNotExposedByDefault) { 4535 FakeVideoSendStream* stream = AddSendStream(); 4536 VideoSendStream::Config config = stream->GetConfig().Copy(); 4537 4538 EXPECT_EQ(-1, config.rtp.flexfec.payload_type); 4539 EXPECT_EQ(0U, config.rtp.flexfec.ssrc); 4540 EXPECT_TRUE(config.rtp.flexfec.protected_media_ssrcs.empty()); 4541 } 4542 4543 TEST_F(WebRtcVideoChannelTest, FlexfecSendCodecWithSsrcNotExposedByDefault) { 4544 FakeVideoSendStream* stream = AddSendStream( 4545 CreatePrimaryWithFecFrStreamParams("cname", kSsrcs1[0], kFlexfecSsrc)); 4546 VideoSendStream::Config config = stream->GetConfig().Copy(); 4547 4548 EXPECT_EQ(-1, config.rtp.flexfec.payload_type); 4549 EXPECT_EQ(0U, config.rtp.flexfec.ssrc); 4550 EXPECT_TRUE(config.rtp.flexfec.protected_media_ssrcs.empty()); 4551 } 4552 4553 TEST_F(WebRtcVideoChannelTest, FlexfecRecvCodecWithoutSsrcNotExposedByDefault) { 4554 AddRecvStream(); 4555 4556 const std::vector<FakeFlexfecReceiveStream*>& streams = 4557 fake_call_->GetFlexfecReceiveStreams(); 4558 EXPECT_TRUE(streams.empty()); 4559 } 4560 4561 TEST_F(WebRtcVideoChannelTest, FlexfecRecvCodecWithSsrcExposedByDefault) { 4562 AddRecvStream( 4563 CreatePrimaryWithFecFrStreamParams("cname", kSsrcs1[0], kFlexfecSsrc)); 4564 4565 const std::vector<FakeFlexfecReceiveStream*>& streams = 4566 fake_call_->GetFlexfecReceiveStreams(); 4567 EXPECT_EQ(1U, streams.size()); 4568 } 4569 4570 // TODO(brandtr): When FlexFEC is no longer behind a field trial, merge all 4571 // tests that use this test fixture into the corresponding "non-field trial" 4572 // tests. 4573 class WebRtcVideoChannelFlexfecRecvTest : public WebRtcVideoChannelTest { 4574 public: 4575 WebRtcVideoChannelFlexfecRecvTest() 4576 : WebRtcVideoChannelTest("WebRTC-FlexFEC-03-Advertised/Enabled/") {} 4577 }; 4578 4579 TEST_F(WebRtcVideoChannelFlexfecRecvTest, 4580 DefaultFlexfecCodecHasRembFeedbackParam) { 4581 EXPECT_TRUE(HasRemb(GetEngineCodec("flexfec-03"))); 4582 } 4583 4584 TEST_F(WebRtcVideoChannelFlexfecRecvTest, SetDefaultRecvCodecsWithoutSsrc) { 4585 AddRecvStream(); 4586 4587 const std::vector<FakeFlexfecReceiveStream*>& streams = 4588 fake_call_->GetFlexfecReceiveStreams(); 4589 EXPECT_TRUE(streams.empty()); 4590 4591 const std::vector<FakeVideoReceiveStream*>& video_streams = 4592 fake_call_->GetVideoReceiveStreams(); 4593 ASSERT_EQ(1U, video_streams.size()); 4594 const FakeVideoReceiveStream& video_stream = *video_streams.front(); 4595 const VideoReceiveStreamInterface::Config& video_config = 4596 video_stream.GetConfig(); 4597 EXPECT_FALSE(video_config.rtp.protected_by_flexfec); 4598 EXPECT_EQ(video_config.rtp.packet_sink_, nullptr); 4599 } 4600 4601 TEST_F(WebRtcVideoChannelFlexfecRecvTest, SetDefaultRecvCodecsWithSsrc) { 4602 AddRecvStream( 4603 CreatePrimaryWithFecFrStreamParams("cname", kSsrcs1[0], kFlexfecSsrc)); 4604 4605 const std::vector<FakeFlexfecReceiveStream*>& streams = 4606 fake_call_->GetFlexfecReceiveStreams(); 4607 ASSERT_EQ(1U, streams.size()); 4608 const auto* stream = streams.front(); 4609 const FlexfecReceiveStream::Config& config = stream->GetConfig(); 4610 EXPECT_EQ(GetEngineCodec("flexfec-03").id, config.payload_type); 4611 EXPECT_EQ(kFlexfecSsrc, config.rtp.remote_ssrc); 4612 ASSERT_EQ(1U, config.protected_media_ssrcs.size()); 4613 EXPECT_EQ(kSsrcs1[0], config.protected_media_ssrcs[0]); 4614 4615 const std::vector<FakeVideoReceiveStream*>& video_streams = 4616 fake_call_->GetVideoReceiveStreams(); 4617 ASSERT_EQ(1U, video_streams.size()); 4618 const FakeVideoReceiveStream& video_stream = *video_streams.front(); 4619 const VideoReceiveStreamInterface::Config& video_config = 4620 video_stream.GetConfig(); 4621 EXPECT_TRUE(video_config.rtp.protected_by_flexfec); 4622 EXPECT_NE(video_config.rtp.packet_sink_, nullptr); 4623 } 4624 4625 // Test changing the configuration after a video stream has been created and 4626 // turn on flexfec. This will result in video stream being reconfigured but not 4627 // recreated because the flexfec stream pointer will be given to the already 4628 // existing video stream instance. 4629 TEST_F(WebRtcVideoChannelFlexfecRecvTest, 4630 EnablingFlexfecDoesNotRecreateVideoReceiveStream) { 4631 VideoReceiverParameters recv_parameters; 4632 recv_parameters.codecs.push_back(GetEngineCodec("VP8")); 4633 ASSERT_TRUE(receive_channel_->SetReceiverParameters(recv_parameters)); 4634 4635 AddRecvStream( 4636 CreatePrimaryWithFecFrStreamParams("cname", kSsrcs1[0], kFlexfecSsrc)); 4637 EXPECT_EQ(1, fake_call_->GetNumCreatedReceiveStreams()); 4638 const std::vector<FakeVideoReceiveStream*>& video_streams = 4639 fake_call_->GetVideoReceiveStreams(); 4640 ASSERT_EQ(1U, video_streams.size()); 4641 const FakeVideoReceiveStream* video_stream = video_streams.front(); 4642 const VideoReceiveStreamInterface::Config* video_config = 4643 &video_stream->GetConfig(); 4644 EXPECT_FALSE(video_config->rtp.protected_by_flexfec); 4645 EXPECT_EQ(video_config->rtp.packet_sink_, nullptr); 4646 4647 // Enable FlexFEC. 4648 recv_parameters.codecs.push_back(GetEngineCodec("flexfec-03")); 4649 ASSERT_TRUE(receive_channel_->SetReceiverParameters(recv_parameters)); 4650 4651 // The count of created streams will remain 2 despite the creation of a new 4652 // flexfec stream. The existing receive stream will have been reconfigured 4653 // to use the new flexfec instance. 4654 EXPECT_EQ(2, fake_call_->GetNumCreatedReceiveStreams()) 4655 << "Enabling FlexFEC should not create VideoReceiveStreamInterface (1)."; 4656 EXPECT_EQ(1U, fake_call_->GetVideoReceiveStreams().size()) 4657 << "Enabling FlexFEC should not create VideoReceiveStreamInterface (2)."; 4658 EXPECT_EQ(1U, fake_call_->GetFlexfecReceiveStreams().size()) 4659 << "Enabling FlexFEC should create a single FlexfecReceiveStream."; 4660 video_stream = video_streams.front(); 4661 video_config = &video_stream->GetConfig(); 4662 EXPECT_TRUE(video_config->rtp.protected_by_flexfec); 4663 EXPECT_NE(video_config->rtp.packet_sink_, nullptr); 4664 } 4665 4666 // Test changing the configuration after a video stream has been created with 4667 // flexfec enabled and then turn off flexfec. This will not result in the video 4668 // stream being recreated. The flexfec stream pointer that's held by the video 4669 // stream will be set/cleared as dictated by the configuration change. 4670 TEST_F(WebRtcVideoChannelFlexfecRecvTest, 4671 DisablingFlexfecDoesNotRecreateVideoReceiveStream) { 4672 VideoReceiverParameters recv_parameters; 4673 recv_parameters.codecs.push_back(GetEngineCodec("VP8")); 4674 recv_parameters.codecs.push_back(GetEngineCodec("flexfec-03")); 4675 ASSERT_TRUE(receive_channel_->SetReceiverParameters(recv_parameters)); 4676 4677 AddRecvStream( 4678 CreatePrimaryWithFecFrStreamParams("cname", kSsrcs1[0], kFlexfecSsrc)); 4679 EXPECT_EQ(2, fake_call_->GetNumCreatedReceiveStreams()); 4680 EXPECT_EQ(1U, fake_call_->GetFlexfecReceiveStreams().size()); 4681 const std::vector<FakeVideoReceiveStream*>& video_streams = 4682 fake_call_->GetVideoReceiveStreams(); 4683 ASSERT_EQ(1U, video_streams.size()); 4684 const FakeVideoReceiveStream* video_stream = video_streams.front(); 4685 const VideoReceiveStreamInterface::Config* video_config = 4686 &video_stream->GetConfig(); 4687 EXPECT_TRUE(video_config->rtp.protected_by_flexfec); 4688 EXPECT_NE(video_config->rtp.packet_sink_, nullptr); 4689 4690 // Disable FlexFEC. 4691 recv_parameters.codecs.clear(); 4692 recv_parameters.codecs.push_back(GetEngineCodec("VP8")); 4693 ASSERT_TRUE(receive_channel_->SetReceiverParameters(recv_parameters)); 4694 // The count of created streams should remain 2 since the video stream will 4695 // have been reconfigured to not reference flexfec and not recreated on 4696 // account of the flexfec stream being deleted. 4697 EXPECT_EQ(2, fake_call_->GetNumCreatedReceiveStreams()) 4698 << "Disabling FlexFEC should not recreate VideoReceiveStreamInterface."; 4699 EXPECT_EQ(1U, fake_call_->GetVideoReceiveStreams().size()) 4700 << "Disabling FlexFEC should not destroy VideoReceiveStreamInterface."; 4701 EXPECT_TRUE(fake_call_->GetFlexfecReceiveStreams().empty()) 4702 << "Disabling FlexFEC should destroy FlexfecReceiveStream."; 4703 video_stream = video_streams.front(); 4704 video_config = &video_stream->GetConfig(); 4705 EXPECT_FALSE(video_config->rtp.protected_by_flexfec); 4706 EXPECT_EQ(video_config->rtp.packet_sink_, nullptr); 4707 } 4708 4709 TEST_F(WebRtcVideoChannelFlexfecRecvTest, DuplicateFlexfecCodecIsDropped) { 4710 constexpr int kUnusedPayloadType1 = 127; 4711 4712 VideoReceiverParameters recv_parameters; 4713 recv_parameters.codecs.push_back(GetEngineCodec("VP8")); 4714 recv_parameters.codecs.push_back(GetEngineCodec("flexfec-03")); 4715 Codec duplicate = GetEngineCodec("flexfec-03"); 4716 duplicate.id = kUnusedPayloadType1; 4717 recv_parameters.codecs.push_back(duplicate); 4718 ASSERT_TRUE(receive_channel_->SetReceiverParameters(recv_parameters)); 4719 4720 AddRecvStream( 4721 CreatePrimaryWithFecFrStreamParams("cname", kSsrcs1[0], kFlexfecSsrc)); 4722 4723 const std::vector<FakeFlexfecReceiveStream*>& streams = 4724 fake_call_->GetFlexfecReceiveStreams(); 4725 ASSERT_EQ(1U, streams.size()); 4726 const auto* stream = streams.front(); 4727 const FlexfecReceiveStream::Config& config = stream->GetConfig(); 4728 EXPECT_EQ(GetEngineCodec("flexfec-03").id, config.payload_type); 4729 } 4730 4731 // TODO(brandtr): When FlexFEC is no longer behind a field trial, merge all 4732 // tests that use this test fixture into the corresponding "non-field trial" 4733 // tests. 4734 class WebRtcVideoChannelFlexfecSendRecvTest : public WebRtcVideoChannelTest { 4735 public: 4736 WebRtcVideoChannelFlexfecSendRecvTest() 4737 : WebRtcVideoChannelTest( 4738 "WebRTC-FlexFEC-03-Advertised/Enabled/WebRTC-FlexFEC-03/Enabled/") { 4739 } 4740 }; 4741 4742 TEST_F(WebRtcVideoChannelFlexfecSendRecvTest, SetDefaultSendCodecsWithoutSsrc) { 4743 FakeVideoSendStream* stream = AddSendStream(); 4744 VideoSendStream::Config config = stream->GetConfig().Copy(); 4745 4746 EXPECT_EQ(GetEngineCodec("flexfec-03").id, config.rtp.flexfec.payload_type); 4747 EXPECT_EQ(0U, config.rtp.flexfec.ssrc); 4748 EXPECT_TRUE(config.rtp.flexfec.protected_media_ssrcs.empty()); 4749 } 4750 4751 TEST_F(WebRtcVideoChannelFlexfecSendRecvTest, SetDefaultSendCodecsWithSsrc) { 4752 FakeVideoSendStream* stream = AddSendStream( 4753 CreatePrimaryWithFecFrStreamParams("cname", kSsrcs1[0], kFlexfecSsrc)); 4754 VideoSendStream::Config config = stream->GetConfig().Copy(); 4755 4756 EXPECT_EQ(GetEngineCodec("flexfec-03").id, config.rtp.flexfec.payload_type); 4757 EXPECT_EQ(kFlexfecSsrc, config.rtp.flexfec.ssrc); 4758 ASSERT_EQ(1U, config.rtp.flexfec.protected_media_ssrcs.size()); 4759 EXPECT_EQ(kSsrcs1[0], config.rtp.flexfec.protected_media_ssrcs[0]); 4760 } 4761 4762 TEST_F(WebRtcVideoChannelTest, SetSendCodecsWithoutFec) { 4763 VideoSenderParameters parameters; 4764 parameters.codecs.push_back(GetEngineCodec("VP8")); 4765 ASSERT_TRUE(send_channel_->SetSenderParameters(parameters)); 4766 4767 FakeVideoSendStream* stream = AddSendStream(); 4768 VideoSendStream::Config config = stream->GetConfig().Copy(); 4769 4770 EXPECT_EQ(-1, config.rtp.ulpfec.ulpfec_payload_type); 4771 EXPECT_EQ(-1, config.rtp.ulpfec.red_payload_type); 4772 } 4773 4774 TEST_F(WebRtcVideoChannelFlexfecSendRecvTest, SetSendCodecsWithoutFec) { 4775 VideoSenderParameters parameters; 4776 parameters.codecs.push_back(GetEngineCodec("VP8")); 4777 ASSERT_TRUE(send_channel_->SetSenderParameters(parameters)); 4778 4779 FakeVideoSendStream* stream = AddSendStream(); 4780 VideoSendStream::Config config = stream->GetConfig().Copy(); 4781 4782 EXPECT_EQ(-1, config.rtp.flexfec.payload_type); 4783 } 4784 4785 TEST_F(WebRtcVideoChannelFlexfecRecvTest, SetRecvCodecsWithFec) { 4786 AddRecvStream( 4787 CreatePrimaryWithFecFrStreamParams("cname", kSsrcs1[0], kFlexfecSsrc)); 4788 4789 VideoReceiverParameters recv_parameters; 4790 recv_parameters.codecs.push_back(GetEngineCodec("VP8")); 4791 recv_parameters.codecs.push_back(GetEngineCodec("flexfec-03")); 4792 ASSERT_TRUE(receive_channel_->SetReceiverParameters(recv_parameters)); 4793 4794 const std::vector<FakeFlexfecReceiveStream*>& flexfec_streams = 4795 fake_call_->GetFlexfecReceiveStreams(); 4796 ASSERT_EQ(1U, flexfec_streams.size()); 4797 const FakeFlexfecReceiveStream* flexfec_stream = flexfec_streams.front(); 4798 const FlexfecReceiveStream::Config& flexfec_stream_config = 4799 flexfec_stream->GetConfig(); 4800 EXPECT_EQ(GetEngineCodec("flexfec-03").id, 4801 flexfec_stream_config.payload_type); 4802 EXPECT_EQ(kFlexfecSsrc, flexfec_stream_config.rtp.remote_ssrc); 4803 ASSERT_EQ(1U, flexfec_stream_config.protected_media_ssrcs.size()); 4804 EXPECT_EQ(kSsrcs1[0], flexfec_stream_config.protected_media_ssrcs[0]); 4805 const std::vector<FakeVideoReceiveStream*>& video_streams = 4806 fake_call_->GetVideoReceiveStreams(); 4807 const FakeVideoReceiveStream* video_stream = video_streams.front(); 4808 const VideoReceiveStreamInterface::Config& video_stream_config = 4809 video_stream->GetConfig(); 4810 EXPECT_EQ(video_stream_config.rtp.local_ssrc, 4811 flexfec_stream_config.rtp.local_ssrc); 4812 EXPECT_EQ(video_stream_config.rtp.rtcp_mode, flexfec_stream_config.rtcp_mode); 4813 EXPECT_EQ(video_stream_config.rtcp_send_transport, 4814 flexfec_stream_config.rtcp_send_transport); 4815 EXPECT_EQ(video_stream_config.rtp.rtcp_mode, flexfec_stream_config.rtcp_mode); 4816 } 4817 4818 // We should not send FlexFEC, even if we advertise it, unless the right 4819 // field trial is set. 4820 // TODO(brandtr): Remove when FlexFEC is enabled by default. 4821 TEST_F(WebRtcVideoChannelFlexfecRecvTest, 4822 SetSendCodecsWithoutSsrcWithFecDoesNotEnableFec) { 4823 VideoSenderParameters parameters; 4824 parameters.codecs.push_back(GetEngineCodec("VP8")); 4825 parameters.codecs.push_back(GetEngineCodec("flexfec-03")); 4826 ASSERT_TRUE(send_channel_->SetSenderParameters(parameters)); 4827 4828 FakeVideoSendStream* stream = AddSendStream(); 4829 VideoSendStream::Config config = stream->GetConfig().Copy(); 4830 4831 EXPECT_EQ(-1, config.rtp.flexfec.payload_type); 4832 EXPECT_EQ(0u, config.rtp.flexfec.ssrc); 4833 EXPECT_TRUE(config.rtp.flexfec.protected_media_ssrcs.empty()); 4834 } 4835 4836 TEST_F(WebRtcVideoChannelFlexfecRecvTest, 4837 SetSendCodecsWithSsrcWithFecDoesNotEnableFec) { 4838 VideoSenderParameters parameters; 4839 parameters.codecs.push_back(GetEngineCodec("VP8")); 4840 parameters.codecs.push_back(GetEngineCodec("flexfec-03")); 4841 ASSERT_TRUE(send_channel_->SetSenderParameters(parameters)); 4842 4843 FakeVideoSendStream* stream = AddSendStream( 4844 CreatePrimaryWithFecFrStreamParams("cname", kSsrcs1[0], kFlexfecSsrc)); 4845 VideoSendStream::Config config = stream->GetConfig().Copy(); 4846 4847 EXPECT_EQ(-1, config.rtp.flexfec.payload_type); 4848 EXPECT_EQ(0u, config.rtp.flexfec.ssrc); 4849 EXPECT_TRUE(config.rtp.flexfec.protected_media_ssrcs.empty()); 4850 } 4851 4852 TEST_F(WebRtcVideoChannelTest, 4853 SetSendCodecRejectsRtxWithoutAssociatedPayloadType) { 4854 const int kUnusedPayloadType = 127; 4855 EXPECT_FALSE(FindCodecById(engine_->LegacySendCodecs(), kUnusedPayloadType)); 4856 4857 VideoSenderParameters parameters; 4858 Codec rtx_codec = CreateVideoCodec(kUnusedPayloadType, "rtx"); 4859 parameters.codecs.push_back(rtx_codec); 4860 EXPECT_FALSE(send_channel_->SetSenderParameters(parameters)) 4861 << "RTX codec without associated payload type should be rejected."; 4862 } 4863 4864 TEST_F(WebRtcVideoChannelTest, 4865 SetSendCodecRejectsRtxWithoutMatchingVideoCodec) { 4866 const int kUnusedPayloadType1 = 126; 4867 const int kUnusedPayloadType2 = 127; 4868 EXPECT_FALSE(FindCodecById(engine_->LegacySendCodecs(), kUnusedPayloadType1)); 4869 EXPECT_FALSE(FindCodecById(engine_->LegacySendCodecs(), kUnusedPayloadType2)); 4870 { 4871 Codec rtx_codec = 4872 CreateVideoRtxCodec(kUnusedPayloadType1, GetEngineCodec("VP8").id); 4873 VideoSenderParameters parameters; 4874 parameters.codecs.push_back(GetEngineCodec("VP8")); 4875 parameters.codecs.push_back(rtx_codec); 4876 ASSERT_TRUE(send_channel_->SetSenderParameters(parameters)); 4877 } 4878 { 4879 Codec rtx_codec = 4880 CreateVideoRtxCodec(kUnusedPayloadType1, kUnusedPayloadType2); 4881 VideoSenderParameters parameters; 4882 parameters.codecs.push_back(GetEngineCodec("VP8")); 4883 parameters.codecs.push_back(rtx_codec); 4884 EXPECT_FALSE(send_channel_->SetSenderParameters(parameters)) 4885 << "RTX without matching video codec should be rejected."; 4886 } 4887 } 4888 4889 TEST_F(WebRtcVideoChannelTest, SetSendCodecsWithChangedRtxPayloadType) { 4890 const int kUnusedPayloadType1 = 126; 4891 const int kUnusedPayloadType2 = 127; 4892 EXPECT_FALSE(FindCodecById(engine_->LegacySendCodecs(), kUnusedPayloadType1)); 4893 EXPECT_FALSE(FindCodecById(engine_->LegacySendCodecs(), kUnusedPayloadType2)); 4894 4895 // SSRCs for RTX. 4896 StreamParams params = StreamParams::CreateLegacy(kSsrcs1[0]); 4897 params.AddFidSsrc(kSsrcs1[0], kRtxSsrcs1[0]); 4898 AddSendStream(params); 4899 4900 // Original payload type for RTX. 4901 VideoSenderParameters parameters; 4902 parameters.codecs.push_back(GetEngineCodec("VP8")); 4903 Codec rtx_codec = CreateVideoCodec(kUnusedPayloadType1, "rtx"); 4904 rtx_codec.SetParam("apt", GetEngineCodec("VP8").id); 4905 parameters.codecs.push_back(rtx_codec); 4906 EXPECT_TRUE(send_channel_->SetSenderParameters(parameters)); 4907 ASSERT_EQ(1U, fake_call_->GetVideoSendStreams().size()); 4908 const VideoSendStream::Config& config_before = 4909 fake_call_->GetVideoSendStreams()[0]->GetConfig(); 4910 EXPECT_EQ(kUnusedPayloadType1, config_before.rtp.rtx.payload_type); 4911 ASSERT_EQ(1U, config_before.rtp.rtx.ssrcs.size()); 4912 EXPECT_EQ(kRtxSsrcs1[0], config_before.rtp.rtx.ssrcs[0]); 4913 4914 // Change payload type for RTX. 4915 parameters.codecs[1].id = kUnusedPayloadType2; 4916 EXPECT_TRUE(send_channel_->SetSenderParameters(parameters)); 4917 ASSERT_EQ(1U, fake_call_->GetVideoSendStreams().size()); 4918 const VideoSendStream::Config& config_after = 4919 fake_call_->GetVideoSendStreams()[0]->GetConfig(); 4920 EXPECT_EQ(kUnusedPayloadType2, config_after.rtp.rtx.payload_type); 4921 ASSERT_EQ(1U, config_after.rtp.rtx.ssrcs.size()); 4922 EXPECT_EQ(kRtxSsrcs1[0], config_after.rtp.rtx.ssrcs[0]); 4923 } 4924 4925 TEST_F(WebRtcVideoChannelTest, SetSendCodecsWithoutFecDisablesFec) { 4926 VideoSenderParameters parameters; 4927 parameters.codecs.push_back(GetEngineCodec("VP8")); 4928 parameters.codecs.push_back(GetEngineCodec("ulpfec")); 4929 ASSERT_TRUE(send_channel_->SetSenderParameters(parameters)); 4930 4931 FakeVideoSendStream* stream = AddSendStream(); 4932 VideoSendStream::Config config = stream->GetConfig().Copy(); 4933 4934 EXPECT_EQ(GetEngineCodec("ulpfec").id, config.rtp.ulpfec.ulpfec_payload_type); 4935 4936 parameters.codecs.pop_back(); 4937 ASSERT_TRUE(send_channel_->SetSenderParameters(parameters)); 4938 stream = fake_call_->GetVideoSendStreams()[0]; 4939 ASSERT_TRUE(stream != nullptr); 4940 config = stream->GetConfig().Copy(); 4941 EXPECT_EQ(-1, config.rtp.ulpfec.ulpfec_payload_type) 4942 << "SetSendCodec without ULPFEC should disable current ULPFEC."; 4943 } 4944 4945 TEST_F(WebRtcVideoChannelFlexfecSendRecvTest, 4946 SetSendCodecsWithoutFecDisablesFec) { 4947 VideoSenderParameters parameters; 4948 parameters.codecs.push_back(GetEngineCodec("VP8")); 4949 parameters.codecs.push_back(GetEngineCodec("flexfec-03")); 4950 ASSERT_TRUE(send_channel_->SetSenderParameters(parameters)); 4951 4952 FakeVideoSendStream* stream = AddSendStream( 4953 CreatePrimaryWithFecFrStreamParams("cname", kSsrcs1[0], kFlexfecSsrc)); 4954 VideoSendStream::Config config = stream->GetConfig().Copy(); 4955 4956 EXPECT_EQ(GetEngineCodec("flexfec-03").id, config.rtp.flexfec.payload_type); 4957 EXPECT_EQ(kFlexfecSsrc, config.rtp.flexfec.ssrc); 4958 ASSERT_EQ(1U, config.rtp.flexfec.protected_media_ssrcs.size()); 4959 EXPECT_EQ(kSsrcs1[0], config.rtp.flexfec.protected_media_ssrcs[0]); 4960 4961 parameters.codecs.pop_back(); 4962 ASSERT_TRUE(send_channel_->SetSenderParameters(parameters)); 4963 stream = fake_call_->GetVideoSendStreams()[0]; 4964 ASSERT_TRUE(stream != nullptr); 4965 config = stream->GetConfig().Copy(); 4966 EXPECT_EQ(-1, config.rtp.flexfec.payload_type) 4967 << "SetSendCodec without FlexFEC should disable current FlexFEC."; 4968 } 4969 4970 TEST_F(WebRtcVideoChannelTest, SetSendCodecsChangesExistingStreams) { 4971 VideoSenderParameters parameters; 4972 Codec codec = CreateVideoCodec(100, "VP8"); 4973 codec.SetParam(kCodecParamMaxQuantization, kDefaultVideoMaxQpVpx); 4974 parameters.codecs.push_back(codec); 4975 4976 ASSERT_TRUE(send_channel_->SetSenderParameters(parameters)); 4977 send_channel_->SetSend(true); 4978 4979 FakeVideoSendStream* stream = AddSendStream(); 4980 FrameForwarder frame_forwarder; 4981 EXPECT_TRUE( 4982 send_channel_->SetVideoSend(last_ssrc_, nullptr, &frame_forwarder)); 4983 4984 std::vector<VideoStream> streams = stream->GetVideoStreams(); 4985 EXPECT_EQ(kDefaultVideoMaxQpVpx, streams[0].max_qp); 4986 4987 parameters.codecs.clear(); 4988 codec.SetParam(kCodecParamMaxQuantization, kDefaultVideoMaxQpVpx + 1); 4989 parameters.codecs.push_back(codec); 4990 ASSERT_TRUE(send_channel_->SetSenderParameters(parameters)); 4991 streams = fake_call_->GetVideoSendStreams()[0]->GetVideoStreams(); 4992 EXPECT_EQ(kDefaultVideoMaxQpVpx + 1, streams[0].max_qp); 4993 EXPECT_TRUE(send_channel_->SetVideoSend(last_ssrc_, nullptr, nullptr)); 4994 } 4995 4996 TEST_F(WebRtcVideoChannelTest, SetSendCodecsWithBitrates) { 4997 SetSendCodecsShouldWorkForBitrates("100", 100000, "150", 150000, "200", 4998 200000); 4999 } 5000 5001 TEST_F(WebRtcVideoChannelTest, SetSendCodecsWithHighMaxBitrate) { 5002 SetSendCodecsShouldWorkForBitrates("", 0, "", -1, "10000", 10000000); 5003 std::vector<VideoStream> streams = AddSendStream()->GetVideoStreams(); 5004 ASSERT_EQ(1u, streams.size()); 5005 EXPECT_EQ(10000000, streams[0].max_bitrate_bps); 5006 } 5007 5008 TEST_F(WebRtcVideoChannelTest, 5009 SetSendCodecsWithoutBitratesUsesCorrectDefaults) { 5010 SetSendCodecsShouldWorkForBitrates("", 0, "", -1, "", -1); 5011 } 5012 5013 TEST_F(WebRtcVideoChannelTest, SetSendCodecsCapsMinAndStartBitrate) { 5014 SetSendCodecsShouldWorkForBitrates("-1", 0, "-100", -1, "", -1); 5015 } 5016 5017 TEST_F(WebRtcVideoChannelTest, SetSendCodecsRejectsMaxLessThanMinBitrate) { 5018 send_parameters_.codecs[0].params[kCodecParamMinBitrate] = "300"; 5019 send_parameters_.codecs[0].params[kCodecParamMaxBitrate] = "200"; 5020 EXPECT_FALSE(send_channel_->SetSenderParameters(send_parameters_)); 5021 } 5022 5023 TEST_F(WebRtcVideoChannelTest, 5024 SetSenderParametersRemovesSelectedCodecFromRtpParameters) { 5025 EXPECT_TRUE(AddSendStream()); 5026 VideoSenderParameters parameters; 5027 parameters.codecs.push_back(CreateVideoCodec(100, "VP8")); 5028 parameters.codecs.push_back(CreateVideoCodec(100, "VP9")); 5029 send_channel_->SetSenderParameters(parameters); 5030 5031 RtpParameters initial_params = 5032 send_channel_->GetRtpSendParameters(last_ssrc_); 5033 5034 RtpCodec vp9_rtp_codec; 5035 vp9_rtp_codec.name = "VP9"; 5036 vp9_rtp_codec.kind = MediaType::VIDEO; 5037 vp9_rtp_codec.clock_rate = 90000; 5038 initial_params.encodings[0].codec = vp9_rtp_codec; 5039 5040 // We should be able to set the params with the VP9 codec that has been 5041 // negotiated. 5042 EXPECT_TRUE( 5043 send_channel_->SetRtpSendParameters(last_ssrc_, initial_params).ok()); 5044 5045 parameters.codecs.clear(); 5046 parameters.codecs.push_back(CreateVideoCodec(100, "VP8")); 5047 send_channel_->SetSenderParameters(parameters); 5048 5049 // Since VP9 is no longer negotiated, the RTP parameters should not have a 5050 // forced codec anymore. 5051 RtpParameters new_params = send_channel_->GetRtpSendParameters(last_ssrc_); 5052 EXPECT_EQ(new_params.encodings[0].codec, std::nullopt); 5053 } 5054 5055 // Test that when both the codec-specific bitrate params and max_bandwidth_bps 5056 // are present in the same send parameters, the settings are combined correctly. 5057 TEST_F(WebRtcVideoChannelTest, SetSendCodecsWithBitratesAndMaxSendBandwidth) { 5058 send_parameters_.codecs[0].params[kCodecParamMinBitrate] = "100"; 5059 send_parameters_.codecs[0].params[kCodecParamStartBitrate] = "200"; 5060 send_parameters_.codecs[0].params[kCodecParamMaxBitrate] = "300"; 5061 send_parameters_.max_bandwidth_bps = 400000; 5062 // We expect max_bandwidth_bps to take priority, if set. 5063 ExpectSetBitrateParameters(100000, 200000, 400000); 5064 EXPECT_TRUE(send_channel_->SetSenderParameters(send_parameters_)); 5065 // Since the codec isn't changing, start_bitrate_bps should be -1. 5066 ExpectSetBitrateParameters(100000, -1, 350000); 5067 5068 // Decrease max_bandwidth_bps. 5069 send_parameters_.max_bandwidth_bps = 350000; 5070 EXPECT_TRUE(send_channel_->SetSenderParameters(send_parameters_)); 5071 5072 // Now try again with the values flipped around. 5073 send_parameters_.codecs[0].params[kCodecParamMaxBitrate] = "400"; 5074 send_parameters_.max_bandwidth_bps = 300000; 5075 ExpectSetBitrateParameters(100000, 200000, 300000); 5076 EXPECT_TRUE(send_channel_->SetSenderParameters(send_parameters_)); 5077 5078 // If we change the codec max, max_bandwidth_bps should still apply. 5079 send_parameters_.codecs[0].params[kCodecParamMaxBitrate] = "350"; 5080 ExpectSetBitrateParameters(100000, 200000, 300000); 5081 EXPECT_TRUE(send_channel_->SetSenderParameters(send_parameters_)); 5082 } 5083 5084 TEST_F(WebRtcVideoChannelTest, SetMaxSendBandwidthShouldPreserveOtherBitrates) { 5085 SetSendCodecsShouldWorkForBitrates("100", 100000, "150", 150000, "200", 5086 200000); 5087 send_parameters_.max_bandwidth_bps = 300000; 5088 // Setting max bitrate should keep previous min bitrate. 5089 // Setting max bitrate should not reset start bitrate. 5090 ExpectSetBitrateParameters(100000, -1, 300000); 5091 EXPECT_TRUE(send_channel_->SetSenderParameters(send_parameters_)); 5092 } 5093 5094 TEST_F(WebRtcVideoChannelTest, SetMaxSendBandwidthShouldBeRemovable) { 5095 send_parameters_.max_bandwidth_bps = 300000; 5096 ExpectSetMaxBitrate(300000); 5097 EXPECT_TRUE(send_channel_->SetSenderParameters(send_parameters_)); 5098 // -1 means to disable max bitrate (set infinite). 5099 send_parameters_.max_bandwidth_bps = -1; 5100 ExpectSetMaxBitrate(-1); 5101 EXPECT_TRUE(send_channel_->SetSenderParameters(send_parameters_)); 5102 } 5103 5104 TEST_F(WebRtcVideoChannelTest, SetMaxSendBandwidthAndAddSendStream) { 5105 send_parameters_.max_bandwidth_bps = 99999; 5106 FakeVideoSendStream* stream = AddSendStream(); 5107 ExpectSetMaxBitrate(send_parameters_.max_bandwidth_bps); 5108 ASSERT_TRUE(send_channel_->SetSenderParameters(send_parameters_)); 5109 ASSERT_EQ(1u, stream->GetVideoStreams().size()); 5110 EXPECT_EQ(send_parameters_.max_bandwidth_bps, 5111 stream->GetVideoStreams()[0].max_bitrate_bps); 5112 5113 send_parameters_.max_bandwidth_bps = 77777; 5114 ExpectSetMaxBitrate(send_parameters_.max_bandwidth_bps); 5115 ASSERT_TRUE(send_channel_->SetSenderParameters(send_parameters_)); 5116 EXPECT_EQ(send_parameters_.max_bandwidth_bps, 5117 stream->GetVideoStreams()[0].max_bitrate_bps); 5118 } 5119 5120 // Tests that when the codec specific max bitrate and VideoSenderParameters 5121 // max_bandwidth_bps are used, that it sets the VideoStream's max bitrate 5122 // appropriately. 5123 TEST_F(WebRtcVideoChannelTest, 5124 MaxBitratePrioritizesVideoSendParametersOverCodecMaxBitrate) { 5125 send_parameters_.codecs[0].params[kCodecParamMinBitrate] = "100"; 5126 send_parameters_.codecs[0].params[kCodecParamStartBitrate] = "200"; 5127 send_parameters_.codecs[0].params[kCodecParamMaxBitrate] = "300"; 5128 send_parameters_.max_bandwidth_bps = -1; 5129 AddSendStream(); 5130 ExpectSetMaxBitrate(300000); 5131 ASSERT_TRUE(send_channel_->SetSenderParameters(send_parameters_)); 5132 5133 std::vector<FakeVideoSendStream*> video_send_streams = GetFakeSendStreams(); 5134 ASSERT_EQ(1u, video_send_streams.size()); 5135 FakeVideoSendStream* video_send_stream = video_send_streams[0]; 5136 ASSERT_EQ(1u, video_send_streams[0]->GetVideoStreams().size()); 5137 // First the max bitrate is set based upon the codec param. 5138 EXPECT_EQ(300000, 5139 video_send_streams[0]->GetVideoStreams()[0].max_bitrate_bps); 5140 5141 // The VideoSenderParameters max bitrate overrides the codec's. 5142 send_parameters_.max_bandwidth_bps = 500000; 5143 ExpectSetMaxBitrate(send_parameters_.max_bandwidth_bps); 5144 ASSERT_TRUE(send_channel_->SetSenderParameters(send_parameters_)); 5145 ASSERT_EQ(1u, video_send_stream->GetVideoStreams().size()); 5146 EXPECT_EQ(500000, video_send_stream->GetVideoStreams()[0].max_bitrate_bps); 5147 } 5148 5149 // Tests that when the codec specific max bitrate and RtpParameters 5150 // max_bitrate_bps are used, that it sets the VideoStream's max bitrate 5151 // appropriately. 5152 TEST_F(WebRtcVideoChannelTest, 5153 MaxBitratePrioritizesRtpParametersOverCodecMaxBitrate) { 5154 send_parameters_.codecs[0].params[kCodecParamMinBitrate] = "100"; 5155 send_parameters_.codecs[0].params[kCodecParamStartBitrate] = "200"; 5156 send_parameters_.codecs[0].params[kCodecParamMaxBitrate] = "300"; 5157 send_parameters_.max_bandwidth_bps = -1; 5158 AddSendStream(); 5159 ExpectSetMaxBitrate(300000); 5160 ASSERT_TRUE(send_channel_->SetSenderParameters(send_parameters_)); 5161 5162 std::vector<FakeVideoSendStream*> video_send_streams = GetFakeSendStreams(); 5163 ASSERT_EQ(1u, video_send_streams.size()); 5164 FakeVideoSendStream* video_send_stream = video_send_streams[0]; 5165 ASSERT_EQ(1u, video_send_stream->GetVideoStreams().size()); 5166 // First the max bitrate is set based upon the codec param. 5167 EXPECT_EQ(300000, video_send_stream->GetVideoStreams()[0].max_bitrate_bps); 5168 5169 // The RtpParameter max bitrate overrides the codec's. 5170 RtpParameters parameters = send_channel_->GetRtpSendParameters(last_ssrc_); 5171 ASSERT_EQ(1u, parameters.encodings.size()); 5172 parameters.encodings[0].max_bitrate_bps = 500000; 5173 EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok()); 5174 ASSERT_EQ(1u, video_send_stream->GetVideoStreams().size()); 5175 EXPECT_EQ(parameters.encodings[0].max_bitrate_bps, 5176 video_send_stream->GetVideoStreams()[0].max_bitrate_bps); 5177 } 5178 5179 TEST_F(WebRtcVideoChannelTest, 5180 MaxBitrateIsMinimumOfMaxSendBandwidthAndMaxEncodingBitrate) { 5181 send_parameters_.max_bandwidth_bps = 99999; 5182 FakeVideoSendStream* stream = AddSendStream(); 5183 ExpectSetMaxBitrate(send_parameters_.max_bandwidth_bps); 5184 ASSERT_TRUE(send_channel_->SetSenderParameters(send_parameters_)); 5185 ASSERT_EQ(1u, stream->GetVideoStreams().size()); 5186 EXPECT_EQ(send_parameters_.max_bandwidth_bps, 5187 stream->GetVideoStreams()[0].max_bitrate_bps); 5188 5189 // Get and set the rtp encoding parameters. 5190 RtpParameters parameters = send_channel_->GetRtpSendParameters(last_ssrc_); 5191 EXPECT_EQ(1u, parameters.encodings.size()); 5192 5193 parameters.encodings[0].max_bitrate_bps = 99999 - 1; 5194 EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok()); 5195 EXPECT_EQ(parameters.encodings[0].max_bitrate_bps, 5196 stream->GetVideoStreams()[0].max_bitrate_bps); 5197 5198 parameters.encodings[0].max_bitrate_bps = 99999 + 1; 5199 EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok()); 5200 EXPECT_EQ(send_parameters_.max_bandwidth_bps, 5201 stream->GetVideoStreams()[0].max_bitrate_bps); 5202 } 5203 5204 TEST_F(WebRtcVideoChannelTest, SetMaxSendBitrateCanIncreaseSenderBitrate) { 5205 VideoSenderParameters parameters; 5206 parameters.codecs.push_back(GetEngineCodec("VP8")); 5207 ASSERT_TRUE(send_channel_->SetSenderParameters(parameters)); 5208 send_channel_->SetSend(true); 5209 5210 FakeVideoSendStream* stream = AddSendStream(); 5211 5212 FrameForwarder frame_forwarder; 5213 EXPECT_TRUE( 5214 send_channel_->SetVideoSend(last_ssrc_, nullptr, &frame_forwarder)); 5215 5216 std::vector<VideoStream> streams = stream->GetVideoStreams(); 5217 int initial_max_bitrate_bps = streams[0].max_bitrate_bps; 5218 EXPECT_GT(initial_max_bitrate_bps, 0); 5219 5220 parameters.max_bandwidth_bps = initial_max_bitrate_bps * 2; 5221 EXPECT_TRUE(send_channel_->SetSenderParameters(parameters)); 5222 // Insert a frame to update the encoder config. 5223 frame_forwarder.IncomingCapturedFrame(frame_source_.GetFrame()); 5224 streams = stream->GetVideoStreams(); 5225 EXPECT_EQ(initial_max_bitrate_bps * 2, streams[0].max_bitrate_bps); 5226 EXPECT_TRUE(send_channel_->SetVideoSend(last_ssrc_, nullptr, nullptr)); 5227 } 5228 5229 TEST_F(WebRtcVideoChannelTest, 5230 SetMaxSendBitrateCanIncreaseSimulcastSenderBitrate) { 5231 VideoSenderParameters parameters; 5232 parameters.codecs.push_back(GetEngineCodec("VP8")); 5233 ASSERT_TRUE(send_channel_->SetSenderParameters(parameters)); 5234 send_channel_->SetSend(true); 5235 5236 FakeVideoSendStream* stream = 5237 AddSendStream(CreateSimStreamParams("cname", MAKE_VECTOR(kSsrcs3))); 5238 5239 // Send a frame to make sure this scales up to >1 stream (simulcast). 5240 FrameForwarder frame_forwarder; 5241 EXPECT_TRUE( 5242 send_channel_->SetVideoSend(kSsrcs3[0], nullptr, &frame_forwarder)); 5243 frame_forwarder.IncomingCapturedFrame(frame_source_.GetFrame()); 5244 5245 std::vector<VideoStream> streams = stream->GetVideoStreams(); 5246 ASSERT_GT(streams.size(), 1u) 5247 << "Without simulcast this test doesn't make sense."; 5248 int initial_max_bitrate_bps = GetTotalMaxBitrate(streams).bps(); 5249 EXPECT_GT(initial_max_bitrate_bps, 0); 5250 5251 parameters.max_bandwidth_bps = initial_max_bitrate_bps * 2; 5252 EXPECT_TRUE(send_channel_->SetSenderParameters(parameters)); 5253 // Insert a frame to update the encoder config. 5254 frame_forwarder.IncomingCapturedFrame(frame_source_.GetFrame()); 5255 streams = stream->GetVideoStreams(); 5256 int increased_max_bitrate_bps = GetTotalMaxBitrate(streams).bps(); 5257 EXPECT_EQ(initial_max_bitrate_bps * 2, increased_max_bitrate_bps); 5258 5259 EXPECT_TRUE(send_channel_->SetVideoSend(kSsrcs3[0], nullptr, nullptr)); 5260 } 5261 5262 TEST_F(WebRtcVideoChannelTest, SetSendCodecsWithMaxQuantization) { 5263 static const char* kMaxQuantization = "21"; 5264 VideoSenderParameters parameters; 5265 parameters.codecs.push_back(GetEngineCodec("VP8")); 5266 parameters.codecs[0].params[kCodecParamMaxQuantization] = kMaxQuantization; 5267 EXPECT_TRUE(send_channel_->SetSenderParameters(parameters)); 5268 EXPECT_EQ(atoi(kMaxQuantization), 5269 AddSendStream()->GetVideoStreams().back().max_qp); 5270 5271 std::optional<Codec> codec = send_channel_->GetSendCodec(); 5272 ASSERT_TRUE(codec); 5273 EXPECT_EQ(kMaxQuantization, codec->params[kCodecParamMaxQuantization]); 5274 } 5275 5276 TEST_F(WebRtcVideoChannelTest, SetSendCodecsRejectBadPayloadTypes) { 5277 // TODO(pbos): Should we only allow the dynamic range? 5278 static const int kIncorrectPayloads[] = {-2, -1, 128, 129}; 5279 VideoSenderParameters parameters; 5280 parameters.codecs.push_back(GetEngineCodec("VP8")); 5281 for (int incorrect_id : kIncorrectPayloads) { 5282 parameters.codecs[0].id = incorrect_id; 5283 EXPECT_FALSE(send_channel_->SetSenderParameters(parameters)) 5284 << "Bad payload type '" << incorrect_id << "' accepted."; 5285 } 5286 } 5287 5288 TEST_F(WebRtcVideoChannelTest, SetSendCodecsAcceptAllValidPayloadTypes) { 5289 VideoSenderParameters parameters; 5290 parameters.codecs.push_back(GetEngineCodec("VP8")); 5291 for (int payload_type = 96; payload_type <= 127; ++payload_type) { 5292 parameters.codecs[0].id = payload_type; 5293 EXPECT_TRUE(send_channel_->SetSenderParameters(parameters)) 5294 << "Payload type '" << payload_type << "' rejected."; 5295 } 5296 } 5297 5298 // Test that setting the a different set of codecs but with an identical front 5299 // codec doesn't result in the stream being recreated. 5300 // This may happen when a subsequent negotiation includes fewer codecs, as a 5301 // result of one of the codecs being rejected. 5302 TEST_F(WebRtcVideoChannelTest, 5303 SetSendCodecsIdenticalFirstCodecDoesntRecreateStream) { 5304 VideoSenderParameters parameters1; 5305 parameters1.codecs.push_back(GetEngineCodec("VP8")); 5306 parameters1.codecs.push_back(GetEngineCodec("VP9")); 5307 EXPECT_TRUE(send_channel_->SetSenderParameters(parameters1)); 5308 5309 AddSendStream(); 5310 EXPECT_EQ(1, fake_call_->GetNumCreatedSendStreams()); 5311 5312 VideoSenderParameters parameters2; 5313 parameters2.codecs.push_back(GetEngineCodec("VP8")); 5314 EXPECT_TRUE(send_channel_->SetSenderParameters(parameters2)); 5315 EXPECT_EQ(1, fake_call_->GetNumCreatedSendStreams()); 5316 } 5317 5318 TEST_F(WebRtcVideoChannelTest, SetRecvCodecsWithOnlyVp8) { 5319 VideoReceiverParameters parameters; 5320 parameters.codecs.push_back(GetEngineCodec("VP8")); 5321 EXPECT_TRUE(receive_channel_->SetReceiverParameters(parameters)); 5322 } 5323 5324 // Test that we set our inbound RTX codecs properly. 5325 TEST_F(WebRtcVideoChannelTest, SetRecvCodecsWithRtx) { 5326 const int kUnusedPayloadType1 = 126; 5327 const int kUnusedPayloadType2 = 127; 5328 EXPECT_FALSE(FindCodecById(engine_->LegacyRecvCodecs(), kUnusedPayloadType1)); 5329 EXPECT_FALSE(FindCodecById(engine_->LegacyRecvCodecs(), kUnusedPayloadType2)); 5330 5331 VideoReceiverParameters parameters; 5332 parameters.codecs.push_back(GetEngineCodec("VP8")); 5333 Codec rtx_codec = CreateVideoCodec(kUnusedPayloadType1, "rtx"); 5334 parameters.codecs.push_back(rtx_codec); 5335 EXPECT_FALSE(receive_channel_->SetReceiverParameters(parameters)) 5336 << "RTX codec without associated payload should be rejected."; 5337 5338 parameters.codecs[1].SetParam("apt", kUnusedPayloadType2); 5339 EXPECT_FALSE(receive_channel_->SetReceiverParameters(parameters)) 5340 << "RTX codec with invalid associated payload type should be rejected."; 5341 5342 parameters.codecs[1].SetParam("apt", GetEngineCodec("VP8").id); 5343 EXPECT_TRUE(receive_channel_->SetReceiverParameters(parameters)); 5344 5345 Codec rtx_codec2 = CreateVideoCodec(kUnusedPayloadType2, "rtx"); 5346 rtx_codec2.SetParam("apt", rtx_codec.id); 5347 parameters.codecs.push_back(rtx_codec2); 5348 5349 EXPECT_FALSE(receive_channel_->SetReceiverParameters(parameters)) 5350 << "RTX codec with another RTX as associated payload type should be " 5351 "rejected."; 5352 } 5353 5354 TEST_F(WebRtcVideoChannelTest, SetRecvCodecsWithPacketization) { 5355 Codec vp8_codec = GetEngineCodec("VP8"); 5356 vp8_codec.packetization = kPacketizationParamRaw; 5357 5358 VideoReceiverParameters parameters; 5359 parameters.codecs = {vp8_codec, GetEngineCodec("VP9")}; 5360 EXPECT_TRUE(receive_channel_->SetReceiverParameters(parameters)); 5361 5362 const StreamParams params = StreamParams::CreateLegacy(kSsrcs1[0]); 5363 AddRecvStream(params); 5364 ASSERT_THAT(fake_call_->GetVideoReceiveStreams(), testing::SizeIs(1)); 5365 5366 const VideoReceiveStreamInterface::Config& config = 5367 fake_call_->GetVideoReceiveStreams()[0]->GetConfig(); 5368 ASSERT_THAT(config.rtp.raw_payload_types, testing::SizeIs(1)); 5369 EXPECT_EQ(config.rtp.raw_payload_types.count(vp8_codec.id), 1U); 5370 } 5371 5372 TEST_F(WebRtcVideoChannelTest, SetRecvCodecsWithPacketizationRecreatesStream) { 5373 VideoReceiverParameters parameters; 5374 parameters.codecs = {GetEngineCodec("VP8"), GetEngineCodec("VP9")}; 5375 parameters.codecs.back().packetization = kPacketizationParamRaw; 5376 EXPECT_TRUE(receive_channel_->SetReceiverParameters(parameters)); 5377 5378 const StreamParams params = StreamParams::CreateLegacy(kSsrcs1[0]); 5379 AddRecvStream(params); 5380 ASSERT_THAT(fake_call_->GetVideoReceiveStreams(), testing::SizeIs(1)); 5381 EXPECT_EQ(fake_call_->GetNumCreatedReceiveStreams(), 1); 5382 5383 parameters.codecs.back().packetization.reset(); 5384 EXPECT_TRUE(receive_channel_->SetReceiverParameters(parameters)); 5385 EXPECT_EQ(fake_call_->GetNumCreatedReceiveStreams(), 2); 5386 } 5387 5388 TEST_F(WebRtcVideoChannelTest, DuplicateUlpfecCodecIsDropped) { 5389 constexpr int kFirstUlpfecPayloadType = 126; 5390 constexpr int kSecondUlpfecPayloadType = 127; 5391 5392 VideoReceiverParameters parameters; 5393 parameters.codecs.push_back(GetEngineCodec("VP8")); 5394 parameters.codecs.push_back( 5395 CreateVideoCodec(kFirstUlpfecPayloadType, kUlpfecCodecName)); 5396 parameters.codecs.push_back( 5397 CreateVideoCodec(kSecondUlpfecPayloadType, kUlpfecCodecName)); 5398 ASSERT_TRUE(receive_channel_->SetReceiverParameters(parameters)); 5399 5400 FakeVideoReceiveStream* recv_stream = AddRecvStream(); 5401 EXPECT_EQ(kFirstUlpfecPayloadType, 5402 recv_stream->GetConfig().rtp.ulpfec_payload_type); 5403 } 5404 5405 TEST_F(WebRtcVideoChannelTest, DuplicateRedCodecIsDropped) { 5406 constexpr int kFirstRedPayloadType = 126; 5407 constexpr int kSecondRedPayloadType = 127; 5408 5409 VideoReceiverParameters parameters; 5410 parameters.codecs.push_back(GetEngineCodec("VP8")); 5411 parameters.codecs.push_back( 5412 CreateVideoCodec(kFirstRedPayloadType, kRedCodecName)); 5413 parameters.codecs.push_back( 5414 CreateVideoCodec(kSecondRedPayloadType, kRedCodecName)); 5415 ASSERT_TRUE(receive_channel_->SetReceiverParameters(parameters)); 5416 5417 FakeVideoReceiveStream* recv_stream = AddRecvStream(); 5418 EXPECT_EQ(kFirstRedPayloadType, 5419 recv_stream->GetConfig().rtp.red_payload_type); 5420 } 5421 5422 TEST_F(WebRtcVideoChannelTest, SetRecvCodecsWithChangedRtxPayloadType) { 5423 const int kUnusedPayloadType1 = 126; 5424 const int kUnusedPayloadType2 = 127; 5425 EXPECT_FALSE(FindCodecById(engine_->LegacyRecvCodecs(), kUnusedPayloadType1)); 5426 EXPECT_FALSE(FindCodecById(engine_->LegacyRecvCodecs(), kUnusedPayloadType2)); 5427 5428 // SSRCs for RTX. 5429 StreamParams params = StreamParams::CreateLegacy(kSsrcs1[0]); 5430 params.AddFidSsrc(kSsrcs1[0], kRtxSsrcs1[0]); 5431 AddRecvStream(params); 5432 5433 // Original payload type for RTX. 5434 VideoReceiverParameters parameters; 5435 parameters.codecs.push_back(GetEngineCodec("VP8")); 5436 Codec rtx_codec = CreateVideoCodec(kUnusedPayloadType1, "rtx"); 5437 rtx_codec.SetParam("apt", GetEngineCodec("VP8").id); 5438 parameters.codecs.push_back(rtx_codec); 5439 EXPECT_TRUE(receive_channel_->SetReceiverParameters(parameters)); 5440 ASSERT_EQ(1U, fake_call_->GetVideoReceiveStreams().size()); 5441 const VideoReceiveStreamInterface::Config& config_before = 5442 fake_call_->GetVideoReceiveStreams()[0]->GetConfig(); 5443 EXPECT_EQ(1U, config_before.rtp.rtx_associated_payload_types.size()); 5444 const int* payload_type_before = FindKeyByValue( 5445 config_before.rtp.rtx_associated_payload_types, GetEngineCodec("VP8").id); 5446 ASSERT_NE(payload_type_before, nullptr); 5447 EXPECT_EQ(kUnusedPayloadType1, *payload_type_before); 5448 EXPECT_EQ(kRtxSsrcs1[0], config_before.rtp.rtx_ssrc); 5449 5450 // Change payload type for RTX. 5451 parameters.codecs[1].id = kUnusedPayloadType2; 5452 EXPECT_TRUE(receive_channel_->SetReceiverParameters(parameters)); 5453 ASSERT_EQ(1U, fake_call_->GetVideoReceiveStreams().size()); 5454 const VideoReceiveStreamInterface::Config& config_after = 5455 fake_call_->GetVideoReceiveStreams()[0]->GetConfig(); 5456 EXPECT_EQ(1U, config_after.rtp.rtx_associated_payload_types.size()); 5457 const int* payload_type_after = FindKeyByValue( 5458 config_after.rtp.rtx_associated_payload_types, GetEngineCodec("VP8").id); 5459 ASSERT_NE(payload_type_after, nullptr); 5460 EXPECT_EQ(kUnusedPayloadType2, *payload_type_after); 5461 EXPECT_EQ(kRtxSsrcs1[0], config_after.rtp.rtx_ssrc); 5462 } 5463 5464 TEST_F(WebRtcVideoChannelTest, SetRecvCodecsRtxWithRtxTime) { 5465 const int kUnusedPayloadType1 = 126; 5466 const int kUnusedPayloadType2 = 127; 5467 EXPECT_FALSE(FindCodecById(engine_->LegacyRecvCodecs(), kUnusedPayloadType1)); 5468 EXPECT_FALSE(FindCodecById(engine_->LegacyRecvCodecs(), kUnusedPayloadType2)); 5469 5470 // SSRCs for RTX. 5471 StreamParams params = StreamParams::CreateLegacy(kSsrcs1[0]); 5472 params.AddFidSsrc(kSsrcs1[0], kRtxSsrcs1[0]); 5473 AddRecvStream(params); 5474 5475 // Payload type for RTX. 5476 VideoReceiverParameters parameters; 5477 parameters.codecs.push_back(GetEngineCodec("VP8")); 5478 Codec rtx_codec = CreateVideoCodec(kUnusedPayloadType1, "rtx"); 5479 rtx_codec.SetParam("apt", GetEngineCodec("VP8").id); 5480 parameters.codecs.push_back(rtx_codec); 5481 EXPECT_TRUE(receive_channel_->SetReceiverParameters(parameters)); 5482 ASSERT_EQ(1U, fake_call_->GetVideoReceiveStreams().size()); 5483 const VideoReceiveStreamInterface::Config& config = 5484 fake_call_->GetVideoReceiveStreams()[0]->GetConfig(); 5485 5486 const int kRtxTime = 343; 5487 // Assert that the default value is different from the ones we test 5488 // and store the default value. 5489 EXPECT_NE(config.rtp.nack.rtp_history_ms, kRtxTime); 5490 int default_history_ms = config.rtp.nack.rtp_history_ms; 5491 5492 // Set rtx-time. 5493 parameters.codecs[1].SetParam(kCodecParamRtxTime, kRtxTime); 5494 EXPECT_TRUE(receive_channel_->SetReceiverParameters(parameters)); 5495 EXPECT_EQ(fake_call_->GetVideoReceiveStreams()[0] 5496 ->GetConfig() 5497 .rtp.nack.rtp_history_ms, 5498 kRtxTime); 5499 5500 // Negative values are ignored so the default value applies. 5501 parameters.codecs[1].SetParam(kCodecParamRtxTime, -1); 5502 EXPECT_TRUE(receive_channel_->SetReceiverParameters(parameters)); 5503 EXPECT_NE(fake_call_->GetVideoReceiveStreams()[0] 5504 ->GetConfig() 5505 .rtp.nack.rtp_history_ms, 5506 -1); 5507 EXPECT_EQ(fake_call_->GetVideoReceiveStreams()[0] 5508 ->GetConfig() 5509 .rtp.nack.rtp_history_ms, 5510 default_history_ms); 5511 5512 // 0 is ignored so the default applies. 5513 parameters.codecs[1].SetParam(kCodecParamRtxTime, 0); 5514 EXPECT_TRUE(receive_channel_->SetReceiverParameters(parameters)); 5515 EXPECT_NE(fake_call_->GetVideoReceiveStreams()[0] 5516 ->GetConfig() 5517 .rtp.nack.rtp_history_ms, 5518 0); 5519 EXPECT_EQ(fake_call_->GetVideoReceiveStreams()[0] 5520 ->GetConfig() 5521 .rtp.nack.rtp_history_ms, 5522 default_history_ms); 5523 5524 // Values larger than the default are clamped to the default. 5525 parameters.codecs[1].SetParam(kCodecParamRtxTime, default_history_ms + 100); 5526 EXPECT_TRUE(receive_channel_->SetReceiverParameters(parameters)); 5527 EXPECT_EQ(fake_call_->GetVideoReceiveStreams()[0] 5528 ->GetConfig() 5529 .rtp.nack.rtp_history_ms, 5530 default_history_ms); 5531 } 5532 5533 TEST_F(WebRtcVideoChannelTest, SetRecvCodecsDifferentPayloadType) { 5534 VideoReceiverParameters parameters; 5535 parameters.codecs.push_back(GetEngineCodec("VP8")); 5536 parameters.codecs[0].id = 99; 5537 EXPECT_TRUE(receive_channel_->SetReceiverParameters(parameters)); 5538 } 5539 5540 TEST_F(WebRtcVideoChannelTest, SetRecvCodecsAcceptDefaultCodecs) { 5541 VideoReceiverParameters parameters; 5542 parameters.codecs = engine_->LegacyRecvCodecs(); 5543 EXPECT_TRUE(receive_channel_->SetReceiverParameters(parameters)); 5544 5545 FakeVideoReceiveStream* stream = AddRecvStream(); 5546 const VideoReceiveStreamInterface::Config& config = stream->GetConfig(); 5547 EXPECT_EQ(engine_->LegacyRecvCodecs()[0].name, 5548 config.decoders[0].video_format.name); 5549 EXPECT_EQ(engine_->LegacyRecvCodecs()[0].id, config.decoders[0].payload_type); 5550 } 5551 5552 TEST_F(WebRtcVideoChannelTest, SetRecvCodecsRejectUnsupportedCodec) { 5553 VideoReceiverParameters parameters; 5554 parameters.codecs.push_back(GetEngineCodec("VP8")); 5555 parameters.codecs.push_back(CreateVideoCodec(101, "WTF3")); 5556 EXPECT_FALSE(receive_channel_->SetReceiverParameters(parameters)); 5557 } 5558 5559 TEST_F(WebRtcVideoChannelTest, SetRecvCodecsAcceptsMultipleVideoCodecs) { 5560 VideoReceiverParameters parameters; 5561 parameters.codecs.push_back(GetEngineCodec("VP8")); 5562 parameters.codecs.push_back(GetEngineCodec("VP9")); 5563 EXPECT_TRUE(receive_channel_->SetReceiverParameters(parameters)); 5564 } 5565 5566 TEST_F(WebRtcVideoChannelTest, SetRecvCodecsWithoutFecDisablesFec) { 5567 VideoSenderParameters send_parameters; 5568 send_parameters.codecs.push_back(GetEngineCodec("VP8")); 5569 send_parameters.codecs.push_back(GetEngineCodec("red")); 5570 send_parameters.codecs.push_back(GetEngineCodec("ulpfec")); 5571 ASSERT_TRUE(send_channel_->SetSenderParameters(send_parameters)); 5572 5573 FakeVideoReceiveStream* stream = AddRecvStream(); 5574 5575 EXPECT_EQ(GetEngineCodec("ulpfec").id, 5576 stream->GetConfig().rtp.ulpfec_payload_type); 5577 5578 VideoReceiverParameters recv_parameters; 5579 recv_parameters.codecs.push_back(GetEngineCodec("VP8")); 5580 ASSERT_TRUE(receive_channel_->SetReceiverParameters(recv_parameters)); 5581 stream = fake_call_->GetVideoReceiveStreams()[0]; 5582 ASSERT_TRUE(stream != nullptr); 5583 EXPECT_EQ(-1, stream->GetConfig().rtp.ulpfec_payload_type) 5584 << "SetSendCodec without ULPFEC should disable current ULPFEC."; 5585 } 5586 5587 TEST_F(WebRtcVideoChannelFlexfecRecvTest, SetRecvParamsWithoutFecDisablesFec) { 5588 AddRecvStream( 5589 CreatePrimaryWithFecFrStreamParams("cname", kSsrcs1[0], kFlexfecSsrc)); 5590 const std::vector<FakeFlexfecReceiveStream*>& streams = 5591 fake_call_->GetFlexfecReceiveStreams(); 5592 5593 ASSERT_EQ(1U, streams.size()); 5594 const FakeFlexfecReceiveStream* stream = streams.front(); 5595 EXPECT_EQ(GetEngineCodec("flexfec-03").id, stream->GetConfig().payload_type); 5596 EXPECT_EQ(kFlexfecSsrc, stream->remote_ssrc()); 5597 ASSERT_EQ(1U, stream->GetConfig().protected_media_ssrcs.size()); 5598 EXPECT_EQ(kSsrcs1[0], stream->GetConfig().protected_media_ssrcs[0]); 5599 5600 VideoReceiverParameters recv_parameters; 5601 recv_parameters.codecs.push_back(GetEngineCodec("VP8")); 5602 ASSERT_TRUE(receive_channel_->SetReceiverParameters(recv_parameters)); 5603 EXPECT_TRUE(streams.empty()) 5604 << "SetSendCodec without FlexFEC should disable current FlexFEC."; 5605 } 5606 5607 TEST_F(WebRtcVideoChannelTest, SetSendParamsWithFecEnablesFec) { 5608 FakeVideoReceiveStream* stream = AddRecvStream(); 5609 EXPECT_EQ(GetEngineCodec("ulpfec").id, 5610 stream->GetConfig().rtp.ulpfec_payload_type); 5611 5612 VideoReceiverParameters recv_parameters; 5613 recv_parameters.codecs.push_back(GetEngineCodec("VP8")); 5614 recv_parameters.codecs.push_back(GetEngineCodec("red")); 5615 recv_parameters.codecs.push_back(GetEngineCodec("ulpfec")); 5616 ASSERT_TRUE(receive_channel_->SetReceiverParameters(recv_parameters)); 5617 stream = fake_call_->GetVideoReceiveStreams()[0]; 5618 ASSERT_TRUE(stream != nullptr); 5619 EXPECT_EQ(GetEngineCodec("ulpfec").id, 5620 stream->GetConfig().rtp.ulpfec_payload_type) 5621 << "ULPFEC should be enabled on the receive stream."; 5622 5623 VideoSenderParameters send_parameters; 5624 send_parameters.codecs.push_back(GetEngineCodec("VP8")); 5625 send_parameters.codecs.push_back(GetEngineCodec("red")); 5626 send_parameters.codecs.push_back(GetEngineCodec("ulpfec")); 5627 ASSERT_TRUE(send_channel_->SetSenderParameters(send_parameters)); 5628 stream = fake_call_->GetVideoReceiveStreams()[0]; 5629 EXPECT_EQ(GetEngineCodec("ulpfec").id, 5630 stream->GetConfig().rtp.ulpfec_payload_type) 5631 << "ULPFEC should be enabled on the receive stream."; 5632 } 5633 5634 TEST_F(WebRtcVideoChannelFlexfecSendRecvTest, 5635 SetSendRecvParamsWithFecEnablesFec) { 5636 AddRecvStream( 5637 CreatePrimaryWithFecFrStreamParams("cname", kSsrcs1[0], kFlexfecSsrc)); 5638 const std::vector<FakeFlexfecReceiveStream*>& streams = 5639 fake_call_->GetFlexfecReceiveStreams(); 5640 5641 VideoReceiverParameters recv_parameters; 5642 recv_parameters.codecs.push_back(GetEngineCodec("VP8")); 5643 recv_parameters.codecs.push_back(GetEngineCodec("flexfec-03")); 5644 ASSERT_TRUE(receive_channel_->SetReceiverParameters(recv_parameters)); 5645 ASSERT_EQ(1U, streams.size()); 5646 const FakeFlexfecReceiveStream* stream_with_recv_params = streams.front(); 5647 EXPECT_EQ(GetEngineCodec("flexfec-03").id, 5648 stream_with_recv_params->GetConfig().payload_type); 5649 EXPECT_EQ(kFlexfecSsrc, stream_with_recv_params->GetConfig().rtp.remote_ssrc); 5650 EXPECT_EQ(1U, 5651 stream_with_recv_params->GetConfig().protected_media_ssrcs.size()); 5652 EXPECT_EQ(kSsrcs1[0], 5653 stream_with_recv_params->GetConfig().protected_media_ssrcs[0]); 5654 5655 VideoSenderParameters send_parameters; 5656 send_parameters.codecs.push_back(GetEngineCodec("VP8")); 5657 send_parameters.codecs.push_back(GetEngineCodec("flexfec-03")); 5658 ASSERT_TRUE(send_channel_->SetSenderParameters(send_parameters)); 5659 ASSERT_EQ(1U, streams.size()); 5660 const FakeFlexfecReceiveStream* stream_with_send_params = streams.front(); 5661 EXPECT_EQ(GetEngineCodec("flexfec-03").id, 5662 stream_with_send_params->GetConfig().payload_type); 5663 EXPECT_EQ(kFlexfecSsrc, stream_with_send_params->GetConfig().rtp.remote_ssrc); 5664 EXPECT_EQ(1U, 5665 stream_with_send_params->GetConfig().protected_media_ssrcs.size()); 5666 EXPECT_EQ(kSsrcs1[0], 5667 stream_with_send_params->GetConfig().protected_media_ssrcs[0]); 5668 } 5669 5670 TEST_F(WebRtcVideoChannelTest, SetRecvCodecsRejectDuplicateFecPayloads) { 5671 VideoReceiverParameters parameters; 5672 parameters.codecs.push_back(GetEngineCodec("VP8")); 5673 parameters.codecs.push_back(GetEngineCodec("red")); 5674 parameters.codecs[1].id = parameters.codecs[0].id; 5675 EXPECT_FALSE(receive_channel_->SetReceiverParameters(parameters)); 5676 } 5677 5678 TEST_F(WebRtcVideoChannelFlexfecRecvTest, 5679 SetRecvCodecsRejectDuplicateFecPayloads) { 5680 VideoReceiverParameters parameters; 5681 parameters.codecs.push_back(GetEngineCodec("VP8")); 5682 parameters.codecs.push_back(GetEngineCodec("flexfec-03")); 5683 parameters.codecs[1].id = parameters.codecs[0].id; 5684 EXPECT_FALSE(receive_channel_->SetReceiverParameters(parameters)); 5685 } 5686 5687 TEST_F(WebRtcVideoChannelTest, SetRecvCodecsRejectDuplicateCodecPayloads) { 5688 VideoReceiverParameters parameters; 5689 parameters.codecs.push_back(GetEngineCodec("VP8")); 5690 parameters.codecs.push_back(GetEngineCodec("VP9")); 5691 parameters.codecs[1].id = parameters.codecs[0].id; 5692 EXPECT_FALSE(receive_channel_->SetReceiverParameters(parameters)); 5693 } 5694 5695 TEST_F(WebRtcVideoChannelTest, 5696 SetRecvCodecsAcceptSameCodecOnMultiplePayloadTypes) { 5697 VideoReceiverParameters parameters; 5698 parameters.codecs.push_back(GetEngineCodec("VP8")); 5699 parameters.codecs.push_back(GetEngineCodec("VP8")); 5700 parameters.codecs[1].id += 1; 5701 EXPECT_TRUE(receive_channel_->SetReceiverParameters(parameters)); 5702 } 5703 5704 // Test that setting the same codecs but with a different order 5705 // doesn't result in the stream being recreated. 5706 TEST_F(WebRtcVideoChannelTest, 5707 SetRecvCodecsDifferentOrderDoesntRecreateStream) { 5708 VideoReceiverParameters parameters1; 5709 parameters1.codecs.push_back(GetEngineCodec("VP8")); 5710 parameters1.codecs.push_back(GetEngineCodec("red")); 5711 EXPECT_TRUE(receive_channel_->SetReceiverParameters(parameters1)); 5712 5713 AddRecvStream(StreamParams::CreateLegacy(123)); 5714 EXPECT_EQ(1, fake_call_->GetNumCreatedReceiveStreams()); 5715 5716 VideoReceiverParameters parameters2; 5717 parameters2.codecs.push_back(GetEngineCodec("red")); 5718 parameters2.codecs.push_back(GetEngineCodec("VP8")); 5719 EXPECT_TRUE(receive_channel_->SetReceiverParameters(parameters2)); 5720 EXPECT_EQ(1, fake_call_->GetNumCreatedReceiveStreams()); 5721 } 5722 5723 TEST_F(WebRtcVideoChannelTest, SendStreamNotSendingByDefault) { 5724 EXPECT_FALSE(AddSendStream()->IsSending()); 5725 } 5726 5727 TEST_F(WebRtcVideoChannelTest, ReceiveStreamReceivingByDefault) { 5728 EXPECT_TRUE(AddRecvStream()->IsReceiving()); 5729 } 5730 5731 TEST_F(WebRtcVideoChannelTest, SetSend) { 5732 FakeVideoSendStream* stream = AddSendStream(); 5733 EXPECT_FALSE(stream->IsSending()); 5734 5735 // false->true 5736 EXPECT_TRUE(send_channel_->SetSend(true)); 5737 EXPECT_TRUE(stream->IsSending()); 5738 // true->true 5739 EXPECT_TRUE(send_channel_->SetSend(true)); 5740 EXPECT_TRUE(stream->IsSending()); 5741 // true->false 5742 EXPECT_TRUE(send_channel_->SetSend(false)); 5743 EXPECT_FALSE(stream->IsSending()); 5744 // false->false 5745 EXPECT_TRUE(send_channel_->SetSend(false)); 5746 EXPECT_FALSE(stream->IsSending()); 5747 5748 EXPECT_TRUE(send_channel_->SetSend(true)); 5749 FakeVideoSendStream* new_stream = AddSendStream(); 5750 EXPECT_TRUE(new_stream->IsSending()) 5751 << "Send stream created after SetSend(true) not sending initially."; 5752 } 5753 5754 // This test verifies DSCP settings are properly applied on video media channel. 5755 TEST_F(WebRtcVideoChannelTest, TestSetDscpOptions) { 5756 std::unique_ptr<FakeNetworkInterface> network_interface( 5757 new FakeNetworkInterface); 5758 MediaConfig config; 5759 std::unique_ptr<VideoMediaSendChannelInterface> send_channel; 5760 RtpParameters parameters; 5761 5762 send_channel = engine_->CreateSendChannel( 5763 env_, call_.get(), config, VideoOptions(), CryptoOptions(), 5764 video_bitrate_allocator_factory_.get()); 5765 5766 send_channel->SetInterface(network_interface.get()); 5767 // Default value when DSCP is disabled should be DSCP_DEFAULT. 5768 EXPECT_EQ(DSCP_DEFAULT, network_interface->dscp()); 5769 send_channel->SetInterface(nullptr); 5770 5771 // Default value when DSCP is enabled is also DSCP_DEFAULT, until it is set 5772 // through rtp parameters. 5773 config.enable_dscp = true; 5774 send_channel = engine_->CreateSendChannel( 5775 env_, call_.get(), config, VideoOptions(), CryptoOptions(), 5776 video_bitrate_allocator_factory_.get()); 5777 send_channel->SetInterface(network_interface.get()); 5778 EXPECT_EQ(DSCP_DEFAULT, network_interface->dscp()); 5779 5780 // Create a send stream to configure 5781 EXPECT_TRUE(send_channel->AddSendStream(StreamParams::CreateLegacy(kSsrc))); 5782 parameters = send_channel->GetRtpSendParameters(kSsrc); 5783 ASSERT_FALSE(parameters.encodings.empty()); 5784 5785 // Various priorities map to various dscp values. 5786 parameters.encodings[0].network_priority = Priority::kHigh; 5787 ASSERT_TRUE( 5788 send_channel->SetRtpSendParameters(kSsrc, parameters, nullptr).ok()); 5789 EXPECT_EQ(DSCP_AF41, network_interface->dscp()); 5790 parameters.encodings[0].network_priority = Priority::kVeryLow; 5791 ASSERT_TRUE( 5792 send_channel->SetRtpSendParameters(kSsrc, parameters, nullptr).ok()); 5793 EXPECT_EQ(DSCP_CS1, network_interface->dscp()); 5794 5795 // Packets should also self-identify their dscp in PacketOptions. 5796 const uint8_t kData[10] = {0}; 5797 EXPECT_TRUE(ChannelImplAsTransport(send_channel.get()) 5798 ->SendRtcp(kData, /*packet_options=*/{})); 5799 EXPECT_EQ(DSCP_CS1, network_interface->options().dscp); 5800 send_channel->SetInterface(nullptr); 5801 5802 // Verify that setting the option to false resets the 5803 // DiffServCodePoint. 5804 config.enable_dscp = false; 5805 send_channel = engine_->CreateSendChannel( 5806 env_, call_.get(), config, VideoOptions(), CryptoOptions(), 5807 video_bitrate_allocator_factory_.get()); 5808 send_channel->SetInterface(network_interface.get()); 5809 EXPECT_EQ(DSCP_DEFAULT, network_interface->dscp()); 5810 send_channel->SetInterface(nullptr); 5811 } 5812 5813 // This test verifies that the RTCP reduced size mode is properly applied to 5814 // send video streams. 5815 TEST_F(WebRtcVideoChannelTest, TestSetSendRtcpReducedSize) { 5816 // Create stream, expecting that default mode is "compound". 5817 FakeVideoSendStream* stream1 = AddSendStream(); 5818 EXPECT_EQ(RtcpMode::kCompound, stream1->GetConfig().rtp.rtcp_mode); 5819 RtpParameters rtp_parameters = 5820 send_channel_->GetRtpSendParameters(last_ssrc_); 5821 EXPECT_FALSE(rtp_parameters.rtcp.reduced_size); 5822 5823 // Now enable reduced size mode. 5824 send_parameters_.rtcp.reduced_size = true; 5825 EXPECT_TRUE(send_channel_->SetSenderParameters(send_parameters_)); 5826 stream1 = fake_call_->GetVideoSendStreams()[0]; 5827 EXPECT_EQ(RtcpMode::kReducedSize, stream1->GetConfig().rtp.rtcp_mode); 5828 rtp_parameters = send_channel_->GetRtpSendParameters(last_ssrc_); 5829 EXPECT_TRUE(rtp_parameters.rtcp.reduced_size); 5830 5831 // Create a new stream and ensure it picks up the reduced size mode. 5832 FakeVideoSendStream* stream2 = AddSendStream(); 5833 EXPECT_EQ(RtcpMode::kReducedSize, stream2->GetConfig().rtp.rtcp_mode); 5834 } 5835 5836 // This test verifies that the RTCP reduced size mode is properly applied to 5837 // receive video streams. 5838 TEST_F(WebRtcVideoChannelTest, TestSetRecvRtcpReducedSize) { 5839 // Create stream, expecting that default mode is "compound". 5840 FakeVideoReceiveStream* stream1 = AddRecvStream(); 5841 EXPECT_EQ(RtcpMode::kCompound, stream1->GetConfig().rtp.rtcp_mode); 5842 5843 // Now enable reduced size mode. 5844 // TODO(deadbeef): Once "recv_parameters" becomes "receiver_parameters", 5845 // the reduced_size flag should come from that. 5846 send_parameters_.rtcp.reduced_size = true; 5847 EXPECT_TRUE(send_channel_->SetSenderParameters(send_parameters_)); 5848 stream1 = fake_call_->GetVideoReceiveStreams()[0]; 5849 EXPECT_EQ(RtcpMode::kReducedSize, stream1->GetConfig().rtp.rtcp_mode); 5850 5851 // Create a new stream and ensure it picks up the reduced size mode. 5852 FakeVideoReceiveStream* stream2 = AddRecvStream(); 5853 EXPECT_EQ(RtcpMode::kReducedSize, stream2->GetConfig().rtp.rtcp_mode); 5854 } 5855 5856 TEST_F(WebRtcVideoChannelTest, OnReadyToSendSignalsNetworkState) { 5857 EXPECT_EQ(kNetworkUp, fake_call_->GetNetworkState(MediaType::VIDEO)); 5858 EXPECT_EQ(kNetworkUp, fake_call_->GetNetworkState(MediaType::AUDIO)); 5859 5860 send_channel_->OnReadyToSend(false); 5861 EXPECT_EQ(kNetworkDown, fake_call_->GetNetworkState(MediaType::VIDEO)); 5862 EXPECT_EQ(kNetworkUp, fake_call_->GetNetworkState(MediaType::AUDIO)); 5863 5864 send_channel_->OnReadyToSend(true); 5865 EXPECT_EQ(kNetworkUp, fake_call_->GetNetworkState(MediaType::VIDEO)); 5866 EXPECT_EQ(kNetworkUp, fake_call_->GetNetworkState(MediaType::AUDIO)); 5867 } 5868 5869 TEST_F(WebRtcVideoChannelTest, GetStatsReportsSentCodecName) { 5870 VideoSenderParameters parameters; 5871 parameters.codecs.push_back(GetEngineCodec("VP8")); 5872 EXPECT_TRUE(send_channel_->SetSenderParameters(parameters)); 5873 5874 AddSendStream(); 5875 5876 VideoMediaSendInfo send_info; 5877 VideoMediaReceiveInfo receive_info; 5878 EXPECT_TRUE(send_channel_->GetStats(&send_info)); 5879 EXPECT_TRUE(receive_channel_->GetStats(&receive_info)); 5880 5881 EXPECT_EQ("VP8", send_info.senders[0].codec_name); 5882 } 5883 5884 TEST_F(WebRtcVideoChannelTest, GetStatsReportsEncoderImplementationName) { 5885 FakeVideoSendStream* stream = AddSendStream(); 5886 VideoSendStream::Stats stats; 5887 stats.encoder_implementation_name = "encoder_implementation_name"; 5888 stream->SetStats(stats); 5889 5890 VideoMediaSendInfo send_info; 5891 VideoMediaReceiveInfo receive_info; 5892 EXPECT_TRUE(send_channel_->GetStats(&send_info)); 5893 EXPECT_TRUE(receive_channel_->GetStats(&receive_info)); 5894 5895 EXPECT_EQ(stats.encoder_implementation_name, 5896 send_info.senders[0].encoder_implementation_name); 5897 } 5898 5899 TEST_F(WebRtcVideoChannelTest, GetStatsReportsPowerEfficientEncoder) { 5900 FakeVideoSendStream* stream = AddSendStream(); 5901 VideoSendStream::Stats stats; 5902 stats.power_efficient_encoder = true; 5903 stream->SetStats(stats); 5904 5905 VideoMediaSendInfo send_info; 5906 VideoMediaReceiveInfo receive_info; 5907 EXPECT_TRUE(send_channel_->GetStats(&send_info)); 5908 EXPECT_TRUE(receive_channel_->GetStats(&receive_info)); 5909 5910 EXPECT_TRUE(send_info.senders[0].power_efficient_encoder); 5911 } 5912 5913 TEST_F(WebRtcVideoChannelTest, GetStatsReportsCpuOveruseMetrics) { 5914 FakeVideoSendStream* stream = AddSendStream(); 5915 VideoSendStream::Stats stats; 5916 stats.avg_encode_time_ms = 13; 5917 stats.encode_usage_percent = 42; 5918 stream->SetStats(stats); 5919 5920 VideoMediaSendInfo send_info; 5921 VideoMediaReceiveInfo receive_info; 5922 EXPECT_TRUE(send_channel_->GetStats(&send_info)); 5923 EXPECT_TRUE(receive_channel_->GetStats(&receive_info)); 5924 5925 EXPECT_EQ(stats.avg_encode_time_ms, send_info.senders[0].avg_encode_ms); 5926 EXPECT_EQ(stats.encode_usage_percent, 5927 send_info.senders[0].encode_usage_percent); 5928 } 5929 5930 TEST_F(WebRtcVideoChannelTest, GetStatsReportsFramesEncoded) { 5931 FakeVideoSendStream* stream = AddSendStream(); 5932 VideoSendStream::Stats stats; 5933 stats.substreams[123].frames_encoded = 13; 5934 stream->SetStats(stats); 5935 5936 VideoMediaSendInfo send_info; 5937 VideoMediaReceiveInfo receive_info; 5938 EXPECT_TRUE(send_channel_->GetStats(&send_info)); 5939 EXPECT_TRUE(receive_channel_->GetStats(&receive_info)); 5940 5941 EXPECT_EQ(13u, send_info.senders[0].frames_encoded); 5942 } 5943 5944 TEST_F(WebRtcVideoChannelTest, GetStatsReportsKeyFramesEncoded) { 5945 FakeVideoSendStream* stream = AddSendStream(); 5946 VideoSendStream::Stats stats; 5947 stats.substreams[123].frame_counts.key_frames = 10; 5948 stats.substreams[456].frame_counts.key_frames = 87; 5949 stream->SetStats(stats); 5950 5951 VideoMediaSendInfo send_info; 5952 VideoMediaReceiveInfo receive_info; 5953 EXPECT_TRUE(send_channel_->GetStats(&send_info)); 5954 EXPECT_TRUE(receive_channel_->GetStats(&receive_info)); 5955 5956 EXPECT_EQ(send_info.senders.size(), 2u); 5957 EXPECT_EQ(10u, send_info.senders[0].key_frames_encoded); 5958 EXPECT_EQ(87u, send_info.senders[1].key_frames_encoded); 5959 EXPECT_EQ(97u, send_info.aggregated_senders[0].key_frames_encoded); 5960 } 5961 5962 TEST_F(WebRtcVideoChannelTest, GetStatsReportsPerLayerQpSum) { 5963 FakeVideoSendStream* stream = AddSendStream(); 5964 VideoSendStream::Stats stats; 5965 stats.substreams[123].qp_sum = 15; 5966 stats.substreams[456].qp_sum = 11; 5967 stream->SetStats(stats); 5968 5969 VideoMediaSendInfo send_info; 5970 VideoMediaReceiveInfo receive_info; 5971 EXPECT_TRUE(send_channel_->GetStats(&send_info)); 5972 EXPECT_TRUE(receive_channel_->GetStats(&receive_info)); 5973 5974 EXPECT_EQ(send_info.senders.size(), 2u); 5975 EXPECT_EQ(stats.substreams[123].qp_sum, send_info.senders[0].qp_sum); 5976 EXPECT_EQ(stats.substreams[456].qp_sum, send_info.senders[1].qp_sum); 5977 EXPECT_EQ(*send_info.aggregated_senders[0].qp_sum, 26u); 5978 } 5979 5980 VideoSendStream::Stats GetInitialisedStats() { 5981 VideoSendStream::Stats stats; 5982 stats.encoder_implementation_name = "vp"; 5983 stats.input_frame_rate = 1.0; 5984 stats.encode_frame_rate = 2; 5985 stats.avg_encode_time_ms = 3; 5986 stats.encode_usage_percent = 4; 5987 stats.frames_encoded = 5; 5988 stats.total_encode_time_ms = 6; 5989 stats.frames_dropped_by_capturer = 7; 5990 stats.frames_dropped_by_encoder_queue = 8; 5991 stats.frames_dropped_by_rate_limiter = 9; 5992 stats.frames_dropped_by_congestion_window = 10; 5993 stats.frames_dropped_by_encoder = 11; 5994 stats.target_media_bitrate_bps = 13; 5995 stats.media_bitrate_bps = 14; 5996 stats.suspended = true; 5997 stats.bw_limited_resolution = true; 5998 stats.cpu_limited_resolution = true; 5999 // Not wired. 6000 stats.bw_limited_framerate = true; 6001 // Not wired. 6002 stats.cpu_limited_framerate = true; 6003 stats.quality_limitation_reason = QualityLimitationReason::kCpu; 6004 stats.quality_limitation_durations_ms[QualityLimitationReason::kCpu] = 15; 6005 stats.quality_limitation_resolution_changes = 16; 6006 stats.number_of_cpu_adapt_changes = 17; 6007 stats.number_of_quality_adapt_changes = 18; 6008 stats.has_entered_low_resolution = true; 6009 stats.content_type = VideoContentType::SCREENSHARE; 6010 stats.frames_sent = 19; 6011 stats.huge_frames_sent = 20; 6012 6013 return stats; 6014 } 6015 6016 TEST_F(WebRtcVideoChannelTest, GetAggregatedStatsReportWithoutSubStreams) { 6017 FakeVideoSendStream* stream = AddSendStream(); 6018 auto stats = GetInitialisedStats(); 6019 stream->SetStats(stats); 6020 VideoMediaSendInfo send_info; 6021 VideoMediaReceiveInfo receive_info; 6022 EXPECT_TRUE(send_channel_->GetStats(&send_info)); 6023 EXPECT_TRUE(receive_channel_->GetStats(&receive_info)); 6024 6025 EXPECT_EQ(send_info.aggregated_senders.size(), 1u); 6026 auto& sender = send_info.aggregated_senders[0]; 6027 6028 // MediaSenderInfo 6029 6030 EXPECT_EQ(sender.payload_bytes_sent, 0); 6031 EXPECT_EQ(sender.header_and_padding_bytes_sent, 0); 6032 EXPECT_EQ(sender.retransmitted_bytes_sent, 0u); 6033 EXPECT_EQ(sender.packets_sent, 0); 6034 EXPECT_EQ(sender.retransmitted_packets_sent, 0u); 6035 EXPECT_EQ(sender.packets_lost, 0); 6036 EXPECT_EQ(sender.fraction_lost, 0.0f); 6037 EXPECT_EQ(sender.rtt_ms, 0); 6038 EXPECT_EQ(sender.codec_name, DefaultCodec().name); 6039 EXPECT_EQ(sender.codec_payload_type, DefaultCodec().id); 6040 EXPECT_EQ(sender.local_stats.size(), 1u); 6041 EXPECT_EQ(sender.local_stats[0].ssrc, last_ssrc_); 6042 EXPECT_EQ(sender.local_stats[0].timestamp, 0.0f); 6043 EXPECT_EQ(sender.remote_stats.size(), 0u); 6044 EXPECT_EQ(sender.report_block_datas.size(), 0u); 6045 6046 // VideoSenderInfo 6047 6048 EXPECT_EQ(sender.ssrc_groups.size(), 0u); 6049 EXPECT_EQ(sender.encoder_implementation_name, 6050 stats.encoder_implementation_name); 6051 // Comes from substream only. 6052 EXPECT_EQ(sender.firs_received, 0); 6053 EXPECT_EQ(sender.plis_received, 0); 6054 EXPECT_EQ(sender.nacks_received, 0u); 6055 EXPECT_EQ(sender.send_frame_width, 0); 6056 EXPECT_EQ(sender.send_frame_height, 0); 6057 EXPECT_EQ(sender.framerate_sent, 0); 6058 EXPECT_EQ(sender.frames_encoded, 0u); 6059 6060 EXPECT_EQ(sender.framerate_input, stats.input_frame_rate); 6061 EXPECT_EQ(sender.nominal_bitrate, stats.media_bitrate_bps); 6062 EXPECT_NE(sender.adapt_reason & WebRtcVideoChannel::ADAPTREASON_CPU, 0); 6063 EXPECT_NE(sender.adapt_reason & WebRtcVideoChannel::ADAPTREASON_BANDWIDTH, 0); 6064 EXPECT_EQ(sender.adapt_changes, stats.number_of_cpu_adapt_changes); 6065 EXPECT_EQ(sender.quality_limitation_reason, stats.quality_limitation_reason); 6066 EXPECT_EQ(sender.quality_limitation_durations_ms, 6067 stats.quality_limitation_durations_ms); 6068 EXPECT_EQ(sender.quality_limitation_resolution_changes, 6069 stats.quality_limitation_resolution_changes); 6070 EXPECT_EQ(sender.avg_encode_ms, stats.avg_encode_time_ms); 6071 EXPECT_EQ(sender.encode_usage_percent, stats.encode_usage_percent); 6072 // Comes from substream only. 6073 EXPECT_EQ(sender.key_frames_encoded, 0u); 6074 EXPECT_EQ(sender.total_encode_time_ms, 0u); 6075 6076 EXPECT_EQ(sender.total_encoded_bytes_target, 6077 stats.total_encoded_bytes_target); 6078 // Comes from substream only. 6079 EXPECT_EQ(sender.total_packet_send_delay, TimeDelta::Zero()); 6080 EXPECT_EQ(sender.qp_sum, std::nullopt); 6081 EXPECT_EQ(sender.frames_sent, 0u); 6082 EXPECT_EQ(sender.huge_frames_sent, 0u); 6083 6084 EXPECT_EQ(sender.has_entered_low_resolution, 6085 stats.has_entered_low_resolution); 6086 EXPECT_EQ(sender.content_type, VideoContentType::SCREENSHARE); 6087 EXPECT_EQ(sender.rid, std::nullopt); 6088 } 6089 6090 TEST_F(WebRtcVideoChannelTest, GetAggregatedStatsReportForSubStreams) { 6091 FakeVideoSendStream* stream = AddSendStream(); 6092 auto stats = GetInitialisedStats(); 6093 6094 const uint32_t ssrc_1 = 123u; 6095 const uint32_t ssrc_2 = 456u; 6096 6097 auto& substream = stats.substreams[ssrc_1]; 6098 substream.frame_counts.key_frames = 1; 6099 substream.frame_counts.delta_frames = 2; 6100 substream.width = 3; 6101 substream.height = 4; 6102 substream.total_bitrate_bps = 5; 6103 substream.retransmit_bitrate_bps = 6; 6104 substream.avg_delay_ms = 7; 6105 substream.max_delay_ms = 8; 6106 substream.rtp_stats.transmitted.total_packet_delay = TimeDelta::Millis(9); 6107 substream.rtp_stats.transmitted.header_bytes = 10; 6108 substream.rtp_stats.transmitted.padding_bytes = 11; 6109 substream.rtp_stats.retransmitted.payload_bytes = 12; 6110 substream.rtp_stats.retransmitted.packets = 13; 6111 substream.rtcp_packet_type_counts.fir_packets = 14; 6112 substream.rtcp_packet_type_counts.nack_packets = 15; 6113 substream.rtcp_packet_type_counts.pli_packets = 16; 6114 rtcp::ReportBlock report_block; 6115 report_block.SetCumulativeLost(17); 6116 report_block.SetFractionLost(18); 6117 ReportBlockData report_block_data; 6118 report_block_data.SetReportBlock(0, report_block, Timestamp::Zero(), 6119 Timestamp::Zero()); 6120 report_block_data.AddRoundTripTimeSample(TimeDelta::Millis(19)); 6121 substream.report_block_data = report_block_data; 6122 substream.encode_frame_rate = 20.0; 6123 substream.frames_encoded = 21; 6124 substream.qp_sum = 22; 6125 substream.total_encode_time_ms = 23; 6126 substream.total_encoded_bytes_target = 24; 6127 substream.huge_frames_sent = 25; 6128 6129 stats.substreams[ssrc_2] = substream; 6130 6131 stream->SetStats(stats); 6132 6133 VideoMediaSendInfo send_info; 6134 VideoMediaReceiveInfo receive_info; 6135 EXPECT_TRUE(send_channel_->GetStats(&send_info)); 6136 EXPECT_TRUE(receive_channel_->GetStats(&receive_info)); 6137 6138 EXPECT_EQ(send_info.aggregated_senders.size(), 1u); 6139 auto& sender = send_info.aggregated_senders[0]; 6140 6141 // MediaSenderInfo 6142 6143 EXPECT_EQ( 6144 sender.payload_bytes_sent, 6145 static_cast<int64_t>(2u * substream.rtp_stats.transmitted.payload_bytes)); 6146 EXPECT_EQ(sender.header_and_padding_bytes_sent, 6147 static_cast<int64_t>( 6148 2u * (substream.rtp_stats.transmitted.header_bytes + 6149 substream.rtp_stats.transmitted.padding_bytes))); 6150 EXPECT_EQ(sender.retransmitted_bytes_sent, 6151 2u * substream.rtp_stats.retransmitted.payload_bytes); 6152 EXPECT_EQ(sender.packets_sent, 6153 static_cast<int>(2 * substream.rtp_stats.transmitted.packets)); 6154 EXPECT_EQ(sender.retransmitted_packets_sent, 6155 2u * substream.rtp_stats.retransmitted.packets); 6156 EXPECT_EQ(sender.total_packet_send_delay, 6157 2 * substream.rtp_stats.transmitted.total_packet_delay); 6158 EXPECT_EQ(sender.packets_lost, 6159 2 * substream.report_block_data->cumulative_lost()); 6160 EXPECT_FLOAT_EQ(sender.fraction_lost, 6161 substream.report_block_data->fraction_lost()); 6162 EXPECT_EQ(sender.rtt_ms, 0); 6163 EXPECT_EQ(sender.codec_name, DefaultCodec().name); 6164 EXPECT_EQ(sender.codec_payload_type, DefaultCodec().id); 6165 EXPECT_EQ(sender.local_stats.size(), 1u); 6166 EXPECT_EQ(sender.local_stats[0].ssrc, last_ssrc_); 6167 EXPECT_EQ(sender.local_stats[0].timestamp, 0.0f); 6168 EXPECT_EQ(sender.remote_stats.size(), 0u); 6169 EXPECT_EQ(sender.report_block_datas.size(), 2u * 1); 6170 6171 // VideoSenderInfo 6172 6173 EXPECT_EQ(sender.ssrc_groups.size(), 0u); 6174 EXPECT_EQ(sender.encoder_implementation_name, 6175 stats.encoder_implementation_name); 6176 EXPECT_EQ( 6177 sender.firs_received, 6178 static_cast<int>(2 * substream.rtcp_packet_type_counts.fir_packets)); 6179 EXPECT_EQ( 6180 sender.plis_received, 6181 static_cast<int>(2 * substream.rtcp_packet_type_counts.pli_packets)); 6182 EXPECT_EQ(sender.nacks_received, 6183 2 * substream.rtcp_packet_type_counts.nack_packets); 6184 EXPECT_EQ(sender.send_frame_width, substream.width); 6185 EXPECT_EQ(sender.send_frame_height, substream.height); 6186 6187 EXPECT_EQ(sender.framerate_input, stats.input_frame_rate); 6188 EXPECT_EQ(sender.framerate_sent, stats.encode_frame_rate); 6189 EXPECT_EQ(sender.nominal_bitrate, stats.media_bitrate_bps); 6190 EXPECT_NE(sender.adapt_reason & WebRtcVideoChannel::ADAPTREASON_CPU, 0); 6191 EXPECT_NE(sender.adapt_reason & WebRtcVideoChannel::ADAPTREASON_BANDWIDTH, 0); 6192 EXPECT_EQ(sender.adapt_changes, stats.number_of_cpu_adapt_changes); 6193 EXPECT_EQ(sender.quality_limitation_reason, stats.quality_limitation_reason); 6194 EXPECT_EQ(sender.quality_limitation_durations_ms, 6195 stats.quality_limitation_durations_ms); 6196 EXPECT_EQ(sender.quality_limitation_resolution_changes, 6197 stats.quality_limitation_resolution_changes); 6198 EXPECT_EQ(sender.avg_encode_ms, stats.avg_encode_time_ms); 6199 EXPECT_EQ(sender.encode_usage_percent, stats.encode_usage_percent); 6200 EXPECT_EQ(sender.frames_encoded, 2u * substream.frames_encoded); 6201 EXPECT_EQ(sender.key_frames_encoded, 2u * substream.frame_counts.key_frames); 6202 EXPECT_EQ(sender.total_encode_time_ms, 2u * substream.total_encode_time_ms); 6203 EXPECT_EQ(sender.total_encoded_bytes_target, 6204 2u * substream.total_encoded_bytes_target); 6205 EXPECT_EQ(sender.has_entered_low_resolution, 6206 stats.has_entered_low_resolution); 6207 EXPECT_EQ(sender.qp_sum, 2u * *substream.qp_sum); 6208 EXPECT_EQ(sender.content_type, VideoContentType::SCREENSHARE); 6209 EXPECT_EQ(sender.frames_sent, 2u * substream.frames_encoded); 6210 EXPECT_EQ(sender.huge_frames_sent, stats.huge_frames_sent); 6211 EXPECT_EQ(sender.rid, std::nullopt); 6212 } 6213 6214 TEST_F(WebRtcVideoChannelTest, GetPerLayerStatsReportForSubStreams) { 6215 FakeVideoSendStream* stream = AddSendStream(); 6216 auto stats = GetInitialisedStats(); 6217 6218 const uint32_t ssrc_1 = 123u; 6219 const uint32_t ssrc_2 = 456u; 6220 6221 auto& substream = stats.substreams[ssrc_1]; 6222 substream.frame_counts.key_frames = 1; 6223 substream.frame_counts.delta_frames = 2; 6224 substream.width = 3; 6225 substream.height = 4; 6226 substream.total_bitrate_bps = 5; 6227 substream.retransmit_bitrate_bps = 6; 6228 substream.avg_delay_ms = 7; 6229 substream.max_delay_ms = 8; 6230 substream.rtp_stats.transmitted.total_packet_delay = TimeDelta::Millis(9); 6231 substream.rtp_stats.transmitted.header_bytes = 10; 6232 substream.rtp_stats.transmitted.padding_bytes = 11; 6233 substream.rtp_stats.retransmitted.payload_bytes = 12; 6234 substream.rtp_stats.retransmitted.packets = 13; 6235 substream.rtcp_packet_type_counts.fir_packets = 14; 6236 substream.rtcp_packet_type_counts.nack_packets = 15; 6237 substream.rtcp_packet_type_counts.pli_packets = 16; 6238 rtcp::ReportBlock report_block; 6239 report_block.SetCumulativeLost(17); 6240 report_block.SetFractionLost(18); 6241 ReportBlockData report_block_data; 6242 report_block_data.SetReportBlock(0, report_block, Timestamp::Zero(), 6243 Timestamp::Zero()); 6244 report_block_data.AddRoundTripTimeSample(TimeDelta::Millis(19)); 6245 substream.report_block_data = report_block_data; 6246 substream.encode_frame_rate = 20.0; 6247 substream.frames_encoded = 21; 6248 substream.qp_sum = 22; 6249 substream.total_encode_time_ms = 23; 6250 substream.total_encoded_bytes_target = 24; 6251 substream.huge_frames_sent = 25; 6252 6253 stats.substreams[ssrc_2] = substream; 6254 6255 stream->SetStats(stats); 6256 6257 VideoMediaSendInfo send_info; 6258 VideoMediaReceiveInfo receive_info; 6259 EXPECT_TRUE(send_channel_->GetStats(&send_info)); 6260 EXPECT_TRUE(receive_channel_->GetStats(&receive_info)); 6261 6262 EXPECT_EQ(send_info.senders.size(), 2u); 6263 auto& sender = send_info.senders[0]; 6264 6265 // MediaSenderInfo 6266 6267 EXPECT_EQ( 6268 sender.payload_bytes_sent, 6269 static_cast<int64_t>(substream.rtp_stats.transmitted.payload_bytes)); 6270 EXPECT_EQ( 6271 sender.header_and_padding_bytes_sent, 6272 static_cast<int64_t>(substream.rtp_stats.transmitted.header_bytes + 6273 substream.rtp_stats.transmitted.padding_bytes)); 6274 EXPECT_EQ(sender.retransmitted_bytes_sent, 6275 substream.rtp_stats.retransmitted.payload_bytes); 6276 EXPECT_EQ(sender.packets_sent, 6277 static_cast<int>(substream.rtp_stats.transmitted.packets)); 6278 EXPECT_EQ(sender.total_packet_send_delay, 6279 substream.rtp_stats.transmitted.total_packet_delay); 6280 EXPECT_EQ(sender.retransmitted_packets_sent, 6281 substream.rtp_stats.retransmitted.packets); 6282 EXPECT_EQ(sender.packets_lost, 6283 substream.report_block_data->cumulative_lost()); 6284 EXPECT_FLOAT_EQ(sender.fraction_lost, 6285 substream.report_block_data->fraction_lost()); 6286 EXPECT_EQ(sender.rtt_ms, 0); 6287 EXPECT_EQ(sender.codec_name, DefaultCodec().name); 6288 EXPECT_EQ(sender.codec_payload_type, DefaultCodec().id); 6289 EXPECT_EQ(sender.local_stats.size(), 1u); 6290 EXPECT_EQ(sender.local_stats[0].ssrc, ssrc_1); 6291 EXPECT_EQ(sender.local_stats[0].timestamp, 0.0f); 6292 EXPECT_EQ(sender.remote_stats.size(), 0u); 6293 EXPECT_EQ(sender.report_block_datas.size(), 1u); 6294 6295 // VideoSenderInfo 6296 6297 EXPECT_EQ(sender.ssrc_groups.size(), 0u); 6298 EXPECT_EQ(sender.encoder_implementation_name, 6299 stats.encoder_implementation_name); 6300 EXPECT_EQ(sender.firs_received, 6301 static_cast<int>(substream.rtcp_packet_type_counts.fir_packets)); 6302 EXPECT_EQ(sender.plis_received, 6303 static_cast<int>(substream.rtcp_packet_type_counts.pli_packets)); 6304 EXPECT_EQ(sender.nacks_received, 6305 substream.rtcp_packet_type_counts.nack_packets); 6306 EXPECT_EQ(sender.send_frame_width, substream.width); 6307 EXPECT_EQ(sender.send_frame_height, substream.height); 6308 6309 EXPECT_EQ(sender.framerate_input, stats.input_frame_rate); 6310 EXPECT_EQ(sender.framerate_sent, substream.encode_frame_rate); 6311 EXPECT_EQ(sender.nominal_bitrate, stats.media_bitrate_bps); 6312 EXPECT_NE(sender.adapt_reason & WebRtcVideoChannel::ADAPTREASON_CPU, 0); 6313 EXPECT_NE(sender.adapt_reason & WebRtcVideoChannel::ADAPTREASON_BANDWIDTH, 0); 6314 EXPECT_EQ(sender.adapt_changes, stats.number_of_cpu_adapt_changes); 6315 EXPECT_EQ(sender.quality_limitation_reason, stats.quality_limitation_reason); 6316 EXPECT_EQ(sender.quality_limitation_durations_ms, 6317 stats.quality_limitation_durations_ms); 6318 EXPECT_EQ(sender.quality_limitation_resolution_changes, 6319 stats.quality_limitation_resolution_changes); 6320 EXPECT_EQ(sender.avg_encode_ms, stats.avg_encode_time_ms); 6321 EXPECT_EQ(sender.encode_usage_percent, stats.encode_usage_percent); 6322 EXPECT_EQ(sender.frames_encoded, 6323 static_cast<uint32_t>(substream.frames_encoded)); 6324 EXPECT_EQ(sender.key_frames_encoded, 6325 static_cast<uint32_t>(substream.frame_counts.key_frames)); 6326 EXPECT_EQ(sender.total_encode_time_ms, substream.total_encode_time_ms); 6327 EXPECT_EQ(sender.total_encoded_bytes_target, 6328 substream.total_encoded_bytes_target); 6329 EXPECT_EQ(sender.has_entered_low_resolution, 6330 stats.has_entered_low_resolution); 6331 EXPECT_EQ(sender.qp_sum, *substream.qp_sum); 6332 EXPECT_EQ(sender.content_type, VideoContentType::SCREENSHARE); 6333 EXPECT_EQ(sender.frames_sent, 6334 static_cast<uint32_t>(substream.frames_encoded)); 6335 EXPECT_EQ(sender.huge_frames_sent, substream.huge_frames_sent); 6336 EXPECT_EQ(sender.rid, std::nullopt); 6337 } 6338 6339 TEST_F(WebRtcVideoChannelTest, 6340 OutboundRtpIsActiveComesFromMatchingEncodingInSimulcast) { 6341 constexpr uint32_t kSsrc1 = 123u; 6342 constexpr uint32_t kSsrc2 = 456u; 6343 6344 // Create simulcast stream from both SSRCs. 6345 // `kSsrc1` is the "main" ssrc used for getting parameters. 6346 FakeVideoSendStream* stream = 6347 AddSendStream(CreateSimStreamParams("cname", {kSsrc1, kSsrc2})); 6348 6349 RtpParameters parameters = send_channel_->GetRtpSendParameters(kSsrc1); 6350 ASSERT_EQ(2u, parameters.encodings.size()); 6351 parameters.encodings[0].active = false; 6352 parameters.encodings[1].active = true; 6353 send_channel_->SetRtpSendParameters(kSsrc1, parameters); 6354 6355 // Fill in dummy stats. 6356 auto stats = GetInitialisedStats(); 6357 stats.substreams[kSsrc1]; 6358 stats.substreams[kSsrc2]; 6359 stream->SetStats(stats); 6360 6361 // GetStats() and ensure `active` matches `encodings` for each SSRC. 6362 VideoMediaSendInfo send_info; 6363 VideoMediaReceiveInfo receive_info; 6364 EXPECT_TRUE(send_channel_->GetStats(&send_info)); 6365 EXPECT_TRUE(receive_channel_->GetStats(&receive_info)); 6366 6367 ASSERT_EQ(send_info.senders.size(), 2u); 6368 ASSERT_TRUE(send_info.senders[0].active.has_value()); 6369 EXPECT_FALSE(send_info.senders[0].active.value()); 6370 ASSERT_TRUE(send_info.senders[1].active.has_value()); 6371 EXPECT_TRUE(send_info.senders[1].active.value()); 6372 } 6373 6374 TEST_F(WebRtcVideoChannelTest, OutboundRtpIsActiveComesFromAnyEncodingInSvc) { 6375 VideoSenderParameters send_parameters; 6376 send_parameters.codecs.push_back(GetEngineCodec("VP9")); 6377 ASSERT_TRUE(send_channel_->SetSenderParameters(send_parameters)); 6378 6379 constexpr uint32_t kSsrc1 = 123u; 6380 constexpr uint32_t kSsrc2 = 456u; 6381 constexpr uint32_t kSsrc3 = 789u; 6382 6383 // Configuring SVC is done the same way that simulcast is configured, the only 6384 // difference is that the VP9 codec is used. This triggers special hacks that 6385 // we depend on because we don't have a proper SVC API yet. 6386 FakeVideoSendStream* stream = 6387 AddSendStream(CreateSimStreamParams("cname", {kSsrc1, kSsrc2, kSsrc3})); 6388 // Expect that we got SVC. 6389 EXPECT_EQ(stream->GetEncoderConfig().number_of_streams, 1u); 6390 VideoCodecVP9 vp9_settings; 6391 ASSERT_TRUE(stream->GetVp9Settings(&vp9_settings)); 6392 EXPECT_EQ(vp9_settings.numberOfSpatialLayers, 3u); 6393 6394 RtpParameters parameters = send_channel_->GetRtpSendParameters(kSsrc1); 6395 ASSERT_EQ(3u, parameters.encodings.size()); 6396 parameters.encodings[0].active = false; 6397 parameters.encodings[1].active = true; 6398 parameters.encodings[2].active = false; 6399 send_channel_->SetRtpSendParameters(kSsrc1, parameters); 6400 6401 // Fill in dummy stats. 6402 auto stats = GetInitialisedStats(); 6403 stats.substreams[kSsrc1]; 6404 stream->SetStats(stats); 6405 6406 // GetStats() and ensure `active` is true if ANY encoding is active. 6407 VideoMediaSendInfo send_info; 6408 VideoMediaReceiveInfo receive_info; 6409 EXPECT_TRUE(send_channel_->GetStats(&send_info)); 6410 EXPECT_TRUE(receive_channel_->GetStats(&receive_info)); 6411 6412 ASSERT_EQ(send_info.senders.size(), 1u); 6413 // Middle layer is active. 6414 ASSERT_TRUE(send_info.senders[0].active.has_value()); 6415 EXPECT_TRUE(send_info.senders[0].active.value()); 6416 6417 parameters = send_channel_->GetRtpSendParameters(kSsrc1); 6418 ASSERT_EQ(3u, parameters.encodings.size()); 6419 parameters.encodings[0].active = false; 6420 parameters.encodings[1].active = false; 6421 parameters.encodings[2].active = false; 6422 send_channel_->SetRtpSendParameters(kSsrc1, parameters); 6423 EXPECT_TRUE(send_channel_->GetStats(&send_info)); 6424 EXPECT_TRUE(receive_channel_->GetStats(&receive_info)); 6425 6426 ASSERT_EQ(send_info.senders.size(), 1u); 6427 // No layer is active. 6428 ASSERT_TRUE(send_info.senders[0].active.has_value()); 6429 EXPECT_FALSE(send_info.senders[0].active.value()); 6430 } 6431 6432 TEST_F(WebRtcVideoChannelTest, MediaSubstreamMissingProducesEmpyStats) { 6433 FakeVideoSendStream* stream = AddSendStream(); 6434 6435 const uint32_t kRtxSsrc = 123u; 6436 const uint32_t kMissingMediaSsrc = 124u; 6437 6438 // Set up a scenarios where we have a substream that is not kMedia (in this 6439 // case: kRtx) but its associated kMedia stream does not exist yet. This 6440 // results in zero GetPerLayerVideoSenderInfos despite non-empty substreams. 6441 // Covers https://crbug.com/1090712. 6442 auto stats = GetInitialisedStats(); 6443 auto& substream = stats.substreams[kRtxSsrc]; 6444 substream.type = VideoSendStream::StreamStats::StreamType::kRtx; 6445 substream.referenced_media_ssrc = kMissingMediaSsrc; 6446 stream->SetStats(stats); 6447 6448 VideoMediaSendInfo send_info; 6449 VideoMediaReceiveInfo receive_info; 6450 EXPECT_TRUE(send_channel_->GetStats(&send_info)); 6451 EXPECT_TRUE(receive_channel_->GetStats(&receive_info)); 6452 6453 EXPECT_TRUE(send_info.senders.empty()); 6454 } 6455 6456 TEST_F(WebRtcVideoChannelTest, GetStatsReportsUpperResolution) { 6457 FakeVideoSendStream* stream = AddSendStream(); 6458 VideoSendStream::Stats stats; 6459 stats.substreams[17].width = 123; 6460 stats.substreams[17].height = 40; 6461 stats.substreams[42].width = 80; 6462 stats.substreams[42].height = 31; 6463 stats.substreams[11].width = 20; 6464 stats.substreams[11].height = 90; 6465 stream->SetStats(stats); 6466 6467 VideoMediaSendInfo send_info; 6468 VideoMediaReceiveInfo receive_info; 6469 EXPECT_TRUE(send_channel_->GetStats(&send_info)); 6470 EXPECT_TRUE(receive_channel_->GetStats(&receive_info)); 6471 6472 ASSERT_EQ(1u, send_info.aggregated_senders.size()); 6473 ASSERT_EQ(3u, send_info.senders.size()); 6474 EXPECT_EQ(123, send_info.senders[1].send_frame_width); 6475 EXPECT_EQ(40, send_info.senders[1].send_frame_height); 6476 EXPECT_EQ(80, send_info.senders[2].send_frame_width); 6477 EXPECT_EQ(31, send_info.senders[2].send_frame_height); 6478 EXPECT_EQ(20, send_info.senders[0].send_frame_width); 6479 EXPECT_EQ(90, send_info.senders[0].send_frame_height); 6480 EXPECT_EQ(123, send_info.aggregated_senders[0].send_frame_width); 6481 EXPECT_EQ(90, send_info.aggregated_senders[0].send_frame_height); 6482 } 6483 6484 TEST_F(WebRtcVideoChannelTest, GetStatsReportsCpuAdaptationStats) { 6485 FakeVideoSendStream* stream = AddSendStream(); 6486 VideoSendStream::Stats stats; 6487 stats.number_of_cpu_adapt_changes = 2; 6488 stats.cpu_limited_resolution = true; 6489 stream->SetStats(stats); 6490 6491 VideoMediaSendInfo send_info; 6492 VideoMediaReceiveInfo receive_info; 6493 EXPECT_TRUE(send_channel_->GetStats(&send_info)); 6494 EXPECT_TRUE(receive_channel_->GetStats(&receive_info)); 6495 6496 ASSERT_EQ(1U, send_info.senders.size()); 6497 EXPECT_EQ(WebRtcVideoChannel::ADAPTREASON_CPU, 6498 send_info.senders[0].adapt_reason); 6499 EXPECT_EQ(stats.number_of_cpu_adapt_changes, 6500 send_info.senders[0].adapt_changes); 6501 } 6502 6503 TEST_F(WebRtcVideoChannelTest, GetStatsReportsAdaptationAndBandwidthStats) { 6504 FakeVideoSendStream* stream = AddSendStream(); 6505 VideoSendStream::Stats stats; 6506 stats.number_of_cpu_adapt_changes = 2; 6507 stats.cpu_limited_resolution = true; 6508 stats.bw_limited_resolution = true; 6509 stream->SetStats(stats); 6510 6511 VideoMediaSendInfo send_info; 6512 VideoMediaReceiveInfo receive_info; 6513 EXPECT_TRUE(send_channel_->GetStats(&send_info)); 6514 EXPECT_TRUE(receive_channel_->GetStats(&receive_info)); 6515 6516 ASSERT_EQ(1U, send_info.senders.size()); 6517 EXPECT_EQ(WebRtcVideoChannel::ADAPTREASON_CPU | 6518 WebRtcVideoChannel::ADAPTREASON_BANDWIDTH, 6519 send_info.senders[0].adapt_reason); 6520 EXPECT_EQ(stats.number_of_cpu_adapt_changes, 6521 send_info.senders[0].adapt_changes); 6522 } 6523 6524 TEST(WebRtcVideoChannelHelperTest, MergeInfoAboutOutboundRtpSubstreams) { 6525 const uint32_t kFirstMediaStreamSsrc = 10; 6526 const uint32_t kSecondMediaStreamSsrc = 20; 6527 const uint32_t kRtxSsrc = 30; 6528 std::map<uint32_t, VideoSendStream::StreamStats> substreams; 6529 // First kMedia stream. 6530 substreams[kFirstMediaStreamSsrc].type = 6531 VideoSendStream::StreamStats::StreamType::kMedia; 6532 substreams[kFirstMediaStreamSsrc].rtp_stats.transmitted.header_bytes = 1; 6533 substreams[kFirstMediaStreamSsrc].rtp_stats.transmitted.padding_bytes = 2; 6534 substreams[kFirstMediaStreamSsrc].rtp_stats.transmitted.payload_bytes = 3; 6535 substreams[kFirstMediaStreamSsrc].rtp_stats.transmitted.packets = 4; 6536 substreams[kFirstMediaStreamSsrc].rtp_stats.retransmitted.header_bytes = 5; 6537 substreams[kFirstMediaStreamSsrc].rtp_stats.retransmitted.padding_bytes = 6; 6538 substreams[kFirstMediaStreamSsrc].rtp_stats.retransmitted.payload_bytes = 7; 6539 substreams[kFirstMediaStreamSsrc].rtp_stats.retransmitted.packets = 8; 6540 substreams[kFirstMediaStreamSsrc].referenced_media_ssrc = std::nullopt; 6541 substreams[kFirstMediaStreamSsrc].width = 1280; 6542 substreams[kFirstMediaStreamSsrc].height = 720; 6543 // Second kMedia stream. 6544 substreams[kSecondMediaStreamSsrc].type = 6545 VideoSendStream::StreamStats::StreamType::kMedia; 6546 substreams[kSecondMediaStreamSsrc].rtp_stats.transmitted.header_bytes = 10; 6547 substreams[kSecondMediaStreamSsrc].rtp_stats.transmitted.padding_bytes = 11; 6548 substreams[kSecondMediaStreamSsrc].rtp_stats.transmitted.payload_bytes = 12; 6549 substreams[kSecondMediaStreamSsrc].rtp_stats.transmitted.packets = 13; 6550 substreams[kSecondMediaStreamSsrc].rtp_stats.retransmitted.header_bytes = 14; 6551 substreams[kSecondMediaStreamSsrc].rtp_stats.retransmitted.padding_bytes = 15; 6552 substreams[kSecondMediaStreamSsrc].rtp_stats.retransmitted.payload_bytes = 16; 6553 substreams[kSecondMediaStreamSsrc].rtp_stats.retransmitted.packets = 17; 6554 substreams[kSecondMediaStreamSsrc].referenced_media_ssrc = std::nullopt; 6555 substreams[kSecondMediaStreamSsrc].width = 640; 6556 substreams[kSecondMediaStreamSsrc].height = 480; 6557 // kRtx stream referencing the first kMedia stream. 6558 substreams[kRtxSsrc].type = VideoSendStream::StreamStats::StreamType::kRtx; 6559 substreams[kRtxSsrc].rtp_stats.transmitted.header_bytes = 19; 6560 substreams[kRtxSsrc].rtp_stats.transmitted.padding_bytes = 20; 6561 substreams[kRtxSsrc].rtp_stats.transmitted.payload_bytes = 21; 6562 substreams[kRtxSsrc].rtp_stats.transmitted.packets = 22; 6563 substreams[kRtxSsrc].rtp_stats.retransmitted.header_bytes = 23; 6564 substreams[kRtxSsrc].rtp_stats.retransmitted.padding_bytes = 24; 6565 substreams[kRtxSsrc].rtp_stats.retransmitted.payload_bytes = 25; 6566 substreams[kRtxSsrc].rtp_stats.retransmitted.packets = 26; 6567 substreams[kRtxSsrc].referenced_media_ssrc = kFirstMediaStreamSsrc; 6568 // kFlexfec stream referencing the second kMedia stream. 6569 substreams[kFlexfecSsrc].type = 6570 VideoSendStream::StreamStats::StreamType::kFlexfec; 6571 substreams[kFlexfecSsrc].rtp_stats.transmitted.header_bytes = 19; 6572 substreams[kFlexfecSsrc].rtp_stats.transmitted.padding_bytes = 20; 6573 substreams[kFlexfecSsrc].rtp_stats.transmitted.payload_bytes = 21; 6574 substreams[kFlexfecSsrc].rtp_stats.transmitted.packets = 22; 6575 substreams[kFlexfecSsrc].rtp_stats.retransmitted.header_bytes = 23; 6576 substreams[kFlexfecSsrc].rtp_stats.retransmitted.padding_bytes = 24; 6577 substreams[kFlexfecSsrc].rtp_stats.retransmitted.payload_bytes = 25; 6578 substreams[kFlexfecSsrc].rtp_stats.retransmitted.packets = 26; 6579 substreams[kFlexfecSsrc].referenced_media_ssrc = kSecondMediaStreamSsrc; 6580 6581 auto merged_substreams = 6582 MergeInfoAboutOutboundRtpSubstreamsForTesting(substreams); 6583 // Only kMedia substreams remain. 6584 EXPECT_TRUE(merged_substreams.find(kFirstMediaStreamSsrc) != 6585 merged_substreams.end()); 6586 EXPECT_EQ(merged_substreams[kFirstMediaStreamSsrc].type, 6587 VideoSendStream::StreamStats::StreamType::kMedia); 6588 EXPECT_TRUE(merged_substreams.find(kSecondMediaStreamSsrc) != 6589 merged_substreams.end()); 6590 EXPECT_EQ(merged_substreams[kSecondMediaStreamSsrc].type, 6591 VideoSendStream::StreamStats::StreamType::kMedia); 6592 EXPECT_FALSE(merged_substreams.find(kRtxSsrc) != merged_substreams.end()); 6593 EXPECT_FALSE(merged_substreams.find(kFlexfecSsrc) != merged_substreams.end()); 6594 // Expect kFirstMediaStreamSsrc's rtp_stats to be merged with kRtxSsrc. 6595 StreamDataCounters first_media_expected_rtp_stats = 6596 substreams[kFirstMediaStreamSsrc].rtp_stats; 6597 first_media_expected_rtp_stats.Add(substreams[kRtxSsrc].rtp_stats); 6598 EXPECT_EQ(merged_substreams[kFirstMediaStreamSsrc].rtp_stats.transmitted, 6599 first_media_expected_rtp_stats.transmitted); 6600 EXPECT_EQ(merged_substreams[kFirstMediaStreamSsrc].rtp_stats.retransmitted, 6601 first_media_expected_rtp_stats.retransmitted); 6602 // Expect kSecondMediaStreamSsrc' rtp_stats to be merged with kFlexfecSsrc. 6603 StreamDataCounters second_media_expected_rtp_stats = 6604 substreams[kSecondMediaStreamSsrc].rtp_stats; 6605 second_media_expected_rtp_stats.Add(substreams[kFlexfecSsrc].rtp_stats); 6606 EXPECT_EQ(merged_substreams[kSecondMediaStreamSsrc].rtp_stats.transmitted, 6607 second_media_expected_rtp_stats.transmitted); 6608 EXPECT_EQ(merged_substreams[kSecondMediaStreamSsrc].rtp_stats.retransmitted, 6609 second_media_expected_rtp_stats.retransmitted); 6610 // Expect other metrics to come from the original kMedia stats. 6611 EXPECT_EQ(merged_substreams[kFirstMediaStreamSsrc].width, 6612 substreams[kFirstMediaStreamSsrc].width); 6613 EXPECT_EQ(merged_substreams[kFirstMediaStreamSsrc].height, 6614 substreams[kFirstMediaStreamSsrc].height); 6615 EXPECT_EQ(merged_substreams[kSecondMediaStreamSsrc].width, 6616 substreams[kSecondMediaStreamSsrc].width); 6617 EXPECT_EQ(merged_substreams[kSecondMediaStreamSsrc].height, 6618 substreams[kSecondMediaStreamSsrc].height); 6619 } 6620 6621 TEST_F(WebRtcVideoChannelTest, 6622 GetStatsReportsTransmittedAndRetransmittedBytesAndPacketsCorrectly) { 6623 FakeVideoSendStream* stream = AddSendStream(); 6624 VideoSendStream::Stats stats; 6625 // Simulcast layer 1, RTP stream. header+padding=10, payload=20, packets=3. 6626 stats.substreams[101].type = VideoSendStream::StreamStats::StreamType::kMedia; 6627 stats.substreams[101].rtp_stats.transmitted.header_bytes = 5; 6628 stats.substreams[101].rtp_stats.transmitted.padding_bytes = 5; 6629 stats.substreams[101].rtp_stats.transmitted.payload_bytes = 20; 6630 stats.substreams[101].rtp_stats.transmitted.packets = 3; 6631 stats.substreams[101].rtp_stats.retransmitted.header_bytes = 0; 6632 stats.substreams[101].rtp_stats.retransmitted.padding_bytes = 0; 6633 stats.substreams[101].rtp_stats.retransmitted.payload_bytes = 0; 6634 stats.substreams[101].rtp_stats.retransmitted.packets = 0; 6635 stats.substreams[101].referenced_media_ssrc = std::nullopt; 6636 // Simulcast layer 1, RTX stream. header+padding=5, payload=10, packets=1. 6637 stats.substreams[102].type = VideoSendStream::StreamStats::StreamType::kRtx; 6638 stats.substreams[102].rtp_stats.retransmitted.header_bytes = 3; 6639 stats.substreams[102].rtp_stats.retransmitted.padding_bytes = 2; 6640 stats.substreams[102].rtp_stats.retransmitted.payload_bytes = 10; 6641 stats.substreams[102].rtp_stats.retransmitted.packets = 1; 6642 stats.substreams[102].rtp_stats.transmitted = 6643 stats.substreams[102].rtp_stats.retransmitted; 6644 stats.substreams[102].referenced_media_ssrc = 101; 6645 // Simulcast layer 2, RTP stream. header+padding=20, payload=40, packets=7. 6646 stats.substreams[201].type = VideoSendStream::StreamStats::StreamType::kMedia; 6647 stats.substreams[201].rtp_stats.transmitted.header_bytes = 10; 6648 stats.substreams[201].rtp_stats.transmitted.padding_bytes = 10; 6649 stats.substreams[201].rtp_stats.transmitted.payload_bytes = 40; 6650 stats.substreams[201].rtp_stats.transmitted.packets = 7; 6651 stats.substreams[201].rtp_stats.retransmitted.header_bytes = 0; 6652 stats.substreams[201].rtp_stats.retransmitted.padding_bytes = 0; 6653 stats.substreams[201].rtp_stats.retransmitted.payload_bytes = 0; 6654 stats.substreams[201].rtp_stats.retransmitted.packets = 0; 6655 stats.substreams[201].referenced_media_ssrc = std::nullopt; 6656 // Simulcast layer 2, RTX stream. header+padding=10, payload=20, packets=4. 6657 stats.substreams[202].type = VideoSendStream::StreamStats::StreamType::kRtx; 6658 stats.substreams[202].rtp_stats.retransmitted.header_bytes = 6; 6659 stats.substreams[202].rtp_stats.retransmitted.padding_bytes = 4; 6660 stats.substreams[202].rtp_stats.retransmitted.payload_bytes = 20; 6661 stats.substreams[202].rtp_stats.retransmitted.packets = 4; 6662 stats.substreams[202].rtp_stats.transmitted = 6663 stats.substreams[202].rtp_stats.retransmitted; 6664 stats.substreams[202].referenced_media_ssrc = 201; 6665 // FlexFEC stream associated with the Simulcast layer 2. 6666 // header+padding=15, payload=17, packets=5. 6667 stats.substreams[301].type = 6668 VideoSendStream::StreamStats::StreamType::kFlexfec; 6669 stats.substreams[301].rtp_stats.transmitted.header_bytes = 13; 6670 stats.substreams[301].rtp_stats.transmitted.padding_bytes = 2; 6671 stats.substreams[301].rtp_stats.transmitted.payload_bytes = 17; 6672 stats.substreams[301].rtp_stats.transmitted.packets = 5; 6673 stats.substreams[301].rtp_stats.retransmitted.header_bytes = 0; 6674 stats.substreams[301].rtp_stats.retransmitted.padding_bytes = 0; 6675 stats.substreams[301].rtp_stats.retransmitted.payload_bytes = 0; 6676 stats.substreams[301].rtp_stats.retransmitted.packets = 0; 6677 stats.substreams[301].referenced_media_ssrc = 201; 6678 stream->SetStats(stats); 6679 6680 VideoMediaSendInfo send_info; 6681 VideoMediaReceiveInfo receive_info; 6682 EXPECT_TRUE(send_channel_->GetStats(&send_info)); 6683 EXPECT_TRUE(receive_channel_->GetStats(&receive_info)); 6684 6685 EXPECT_EQ(send_info.senders.size(), 2u); 6686 EXPECT_EQ(15u, send_info.senders[0].header_and_padding_bytes_sent); 6687 EXPECT_EQ(30u, send_info.senders[0].payload_bytes_sent); 6688 EXPECT_EQ(4, send_info.senders[0].packets_sent); 6689 EXPECT_EQ(10u, send_info.senders[0].retransmitted_bytes_sent); 6690 EXPECT_EQ(1u, send_info.senders[0].retransmitted_packets_sent); 6691 6692 EXPECT_EQ(45u, send_info.senders[1].header_and_padding_bytes_sent); 6693 EXPECT_EQ(77u, send_info.senders[1].payload_bytes_sent); 6694 EXPECT_EQ(16, send_info.senders[1].packets_sent); 6695 EXPECT_EQ(20u, send_info.senders[1].retransmitted_bytes_sent); 6696 EXPECT_EQ(4u, send_info.senders[1].retransmitted_packets_sent); 6697 } 6698 6699 TEST_F(WebRtcVideoChannelTest, 6700 GetStatsTranslatesBandwidthLimitedResolutionCorrectly) { 6701 FakeVideoSendStream* stream = AddSendStream(); 6702 VideoSendStream::Stats stats; 6703 stats.bw_limited_resolution = true; 6704 stream->SetStats(stats); 6705 6706 VideoMediaSendInfo send_info; 6707 VideoMediaReceiveInfo receive_info; 6708 EXPECT_TRUE(send_channel_->GetStats(&send_info)); 6709 EXPECT_TRUE(receive_channel_->GetStats(&receive_info)); 6710 6711 ASSERT_EQ(1U, send_info.senders.size()); 6712 EXPECT_EQ(WebRtcVideoChannel::ADAPTREASON_BANDWIDTH, 6713 send_info.senders[0].adapt_reason); 6714 } 6715 6716 TEST_F(WebRtcVideoChannelTest, GetStatsTranslatesSendRtcpPacketTypesCorrectly) { 6717 FakeVideoSendStream* stream = AddSendStream(); 6718 VideoSendStream::Stats stats; 6719 stats.substreams[17].rtcp_packet_type_counts.fir_packets = 2; 6720 stats.substreams[17].rtcp_packet_type_counts.nack_packets = 3; 6721 stats.substreams[17].rtcp_packet_type_counts.pli_packets = 4; 6722 6723 stats.substreams[42].rtcp_packet_type_counts.fir_packets = 5; 6724 stats.substreams[42].rtcp_packet_type_counts.nack_packets = 7; 6725 stats.substreams[42].rtcp_packet_type_counts.pli_packets = 9; 6726 6727 stream->SetStats(stats); 6728 6729 VideoMediaSendInfo send_info; 6730 VideoMediaReceiveInfo receive_info; 6731 EXPECT_TRUE(send_channel_->GetStats(&send_info)); 6732 EXPECT_TRUE(receive_channel_->GetStats(&receive_info)); 6733 6734 EXPECT_EQ(2, send_info.senders[0].firs_received); 6735 EXPECT_EQ(3u, send_info.senders[0].nacks_received); 6736 EXPECT_EQ(4, send_info.senders[0].plis_received); 6737 6738 EXPECT_EQ(5, send_info.senders[1].firs_received); 6739 EXPECT_EQ(7u, send_info.senders[1].nacks_received); 6740 EXPECT_EQ(9, send_info.senders[1].plis_received); 6741 6742 EXPECT_EQ(7, send_info.aggregated_senders[0].firs_received); 6743 EXPECT_EQ(10u, send_info.aggregated_senders[0].nacks_received); 6744 EXPECT_EQ(13, send_info.aggregated_senders[0].plis_received); 6745 } 6746 6747 TEST_F(WebRtcVideoChannelTest, 6748 GetStatsTranslatesReceiveRtcpPacketTypesCorrectly) { 6749 FakeVideoReceiveStream* stream = AddRecvStream(); 6750 VideoReceiveStreamInterface::Stats stats; 6751 stats.rtcp_packet_type_counts.fir_packets = 2; 6752 stats.rtcp_packet_type_counts.nack_packets = 3; 6753 stats.rtcp_packet_type_counts.pli_packets = 4; 6754 stream->SetStats(stats); 6755 6756 VideoMediaSendInfo send_info; 6757 VideoMediaReceiveInfo receive_info; 6758 EXPECT_TRUE(send_channel_->GetStats(&send_info)); 6759 EXPECT_TRUE(receive_channel_->GetStats(&receive_info)); 6760 6761 EXPECT_EQ(stats.rtcp_packet_type_counts.fir_packets, 6762 checked_cast<unsigned int>(receive_info.receivers[0].firs_sent)); 6763 EXPECT_EQ(stats.rtcp_packet_type_counts.nack_packets, 6764 receive_info.receivers[0].nacks_sent); 6765 EXPECT_EQ(stats.rtcp_packet_type_counts.pli_packets, 6766 checked_cast<unsigned int>(receive_info.receivers[0].plis_sent)); 6767 } 6768 6769 TEST_F(WebRtcVideoChannelTest, GetStatsTranslatesDecodeStatsCorrectly) { 6770 FakeVideoReceiveStream* stream = AddRecvStream(); 6771 VideoReceiveStreamInterface::Stats stats; 6772 stats.decoder_implementation_name = "decoder_implementation_name"; 6773 stats.decode_ms = 2; 6774 stats.max_decode_ms = 3; 6775 stats.current_delay_ms = 4; 6776 stats.target_delay_ms = 5; 6777 stats.jitter_buffer_ms = 6; 6778 stats.jitter_buffer_delay = TimeDelta::Seconds(60); 6779 stats.jitter_buffer_target_delay = TimeDelta::Seconds(55); 6780 stats.jitter_buffer_emitted_count = 6; 6781 stats.jitter_buffer_minimum_delay = TimeDelta::Seconds(50); 6782 stats.min_playout_delay_ms = 7; 6783 stats.render_delay_ms = 8; 6784 stats.width = 9; 6785 stats.height = 10; 6786 stats.frame_counts.key_frames = 11; 6787 stats.frame_counts.delta_frames = 12; 6788 stats.frames_rendered = 13; 6789 stats.frames_decoded = 14; 6790 stats.qp_sum = 15; 6791 stats.corruption_score_sum = 0.3; 6792 stats.corruption_score_squared_sum = 0.05; 6793 stats.corruption_score_count = 2; 6794 stats.total_decode_time = TimeDelta::Millis(16); 6795 stats.total_assembly_time = TimeDelta::Millis(4); 6796 stats.frames_assembled_from_multiple_packets = 2; 6797 stats.power_efficient_decoder = true; 6798 RtpReceiveStats rtx_stats; 6799 rtx_stats.packet_counter.packets = 5; 6800 rtx_stats.packet_counter.payload_bytes = 23; 6801 stats.rtx_rtp_stats = rtx_stats; 6802 stream->SetStats(stats); 6803 6804 VideoMediaSendInfo send_info; 6805 VideoMediaReceiveInfo receive_info; 6806 EXPECT_TRUE(send_channel_->GetStats(&send_info)); 6807 EXPECT_TRUE(receive_channel_->GetStats(&receive_info)); 6808 6809 EXPECT_EQ(stats.decoder_implementation_name, 6810 receive_info.receivers[0].decoder_implementation_name); 6811 EXPECT_EQ(stats.decode_ms, receive_info.receivers[0].decode_ms); 6812 EXPECT_EQ(stats.max_decode_ms, receive_info.receivers[0].max_decode_ms); 6813 EXPECT_EQ(stats.current_delay_ms, receive_info.receivers[0].current_delay_ms); 6814 EXPECT_EQ(stats.target_delay_ms, receive_info.receivers[0].target_delay_ms); 6815 EXPECT_EQ(stats.jitter_buffer_ms, receive_info.receivers[0].jitter_buffer_ms); 6816 EXPECT_EQ(stats.jitter_buffer_delay.seconds<double>(), 6817 receive_info.receivers[0].jitter_buffer_delay_seconds); 6818 EXPECT_EQ(stats.jitter_buffer_target_delay.seconds<double>(), 6819 receive_info.receivers[0].jitter_buffer_target_delay_seconds); 6820 EXPECT_EQ(stats.jitter_buffer_emitted_count, 6821 receive_info.receivers[0].jitter_buffer_emitted_count); 6822 EXPECT_EQ(stats.jitter_buffer_minimum_delay.seconds<double>(), 6823 receive_info.receivers[0].jitter_buffer_minimum_delay_seconds); 6824 EXPECT_EQ(stats.min_playout_delay_ms, 6825 receive_info.receivers[0].min_playout_delay_ms); 6826 EXPECT_EQ(stats.render_delay_ms, receive_info.receivers[0].render_delay_ms); 6827 EXPECT_EQ(stats.width, receive_info.receivers[0].frame_width); 6828 EXPECT_EQ(stats.height, receive_info.receivers[0].frame_height); 6829 EXPECT_EQ(checked_cast<unsigned int>(stats.frame_counts.key_frames + 6830 stats.frame_counts.delta_frames), 6831 receive_info.receivers[0].frames_received); 6832 EXPECT_EQ(stats.frames_rendered, receive_info.receivers[0].frames_rendered); 6833 EXPECT_EQ(stats.frames_decoded, receive_info.receivers[0].frames_decoded); 6834 EXPECT_EQ(checked_cast<unsigned int>(stats.frame_counts.key_frames), 6835 receive_info.receivers[0].key_frames_decoded); 6836 EXPECT_EQ(stats.qp_sum, receive_info.receivers[0].qp_sum); 6837 EXPECT_EQ(stats.corruption_score_sum, 6838 receive_info.receivers[0].corruption_score_sum); 6839 EXPECT_EQ(stats.corruption_score_squared_sum, 6840 receive_info.receivers[0].corruption_score_squared_sum); 6841 EXPECT_EQ(stats.corruption_score_count, 6842 receive_info.receivers[0].corruption_score_count); 6843 EXPECT_EQ(stats.total_decode_time, 6844 receive_info.receivers[0].total_decode_time); 6845 EXPECT_EQ(stats.total_assembly_time, 6846 receive_info.receivers[0].total_assembly_time); 6847 EXPECT_EQ(stats.frames_assembled_from_multiple_packets, 6848 receive_info.receivers[0].frames_assembled_from_multiple_packets); 6849 EXPECT_TRUE(receive_info.receivers[0].power_efficient_decoder); 6850 EXPECT_EQ(stats.rtx_rtp_stats->packet_counter.packets, 6851 receive_info.receivers[0].retransmitted_packets_received); 6852 EXPECT_EQ(stats.rtx_rtp_stats->packet_counter.payload_bytes, 6853 receive_info.receivers[0].retransmitted_bytes_received); 6854 } 6855 6856 TEST_F(WebRtcVideoChannelTest, 6857 GetStatsTranslatesInterFrameDelayStatsCorrectly) { 6858 FakeVideoReceiveStream* stream = AddRecvStream(); 6859 VideoReceiveStreamInterface::Stats stats; 6860 stats.total_inter_frame_delay = 0.123; 6861 stats.total_squared_inter_frame_delay = 0.00456; 6862 stream->SetStats(stats); 6863 6864 VideoMediaSendInfo send_info; 6865 VideoMediaReceiveInfo receive_info; 6866 EXPECT_TRUE(send_channel_->GetStats(&send_info)); 6867 EXPECT_TRUE(receive_channel_->GetStats(&receive_info)); 6868 6869 EXPECT_EQ(stats.total_inter_frame_delay, 6870 receive_info.receivers[0].total_inter_frame_delay); 6871 EXPECT_EQ(stats.total_squared_inter_frame_delay, 6872 receive_info.receivers[0].total_squared_inter_frame_delay); 6873 } 6874 6875 TEST_F(WebRtcVideoChannelTest, GetStatsTranslatesReceivePacketStatsCorrectly) { 6876 FakeVideoReceiveStream* stream = AddRecvStream(); 6877 VideoReceiveStreamInterface::Stats stats; 6878 stats.rtp_stats.packet_counter.payload_bytes = 2; 6879 stats.rtp_stats.packet_counter.header_bytes = 3; 6880 stats.rtp_stats.packet_counter.padding_bytes = 4; 6881 stats.rtp_stats.packet_counter.packets = 5; 6882 stats.rtp_stats.packets_lost = 6; 6883 stream->SetStats(stats); 6884 6885 VideoMediaSendInfo send_info; 6886 VideoMediaReceiveInfo receive_info; 6887 EXPECT_TRUE(send_channel_->GetStats(&send_info)); 6888 EXPECT_TRUE(receive_channel_->GetStats(&receive_info)); 6889 6890 EXPECT_EQ( 6891 stats.rtp_stats.packet_counter.payload_bytes, 6892 checked_cast<size_t>(receive_info.receivers[0].payload_bytes_received)); 6893 EXPECT_EQ( 6894 stats.rtp_stats.packet_counter.packets, 6895 checked_cast<unsigned int>(receive_info.receivers[0].packets_received)); 6896 EXPECT_EQ(stats.rtp_stats.packets_lost, 6897 receive_info.receivers[0].packets_lost); 6898 } 6899 6900 TEST_F(WebRtcVideoChannelTest, TranslatesCallStatsCorrectly) { 6901 AddSendStream(); 6902 AddSendStream(); 6903 Call::Stats stats; 6904 stats.rtt_ms = 123; 6905 fake_call_->SetStats(stats); 6906 6907 VideoMediaSendInfo send_info; 6908 VideoMediaReceiveInfo receive_info; 6909 EXPECT_TRUE(send_channel_->GetStats(&send_info)); 6910 EXPECT_TRUE(receive_channel_->GetStats(&receive_info)); 6911 6912 ASSERT_EQ(2u, send_info.senders.size()); 6913 EXPECT_EQ(stats.rtt_ms, send_info.senders[0].rtt_ms); 6914 EXPECT_EQ(stats.rtt_ms, send_info.senders[1].rtt_ms); 6915 } 6916 6917 TEST_F(WebRtcVideoChannelTest, TranslatesSenderBitrateStatsCorrectly) { 6918 FakeVideoSendStream* stream = AddSendStream(); 6919 VideoSendStream::Stats stats; 6920 stats.target_media_bitrate_bps = 156; 6921 stats.media_bitrate_bps = 123; 6922 stats.substreams[17].total_bitrate_bps = 1; 6923 stats.substreams[17].retransmit_bitrate_bps = 2; 6924 stats.substreams[42].total_bitrate_bps = 3; 6925 stats.substreams[42].retransmit_bitrate_bps = 4; 6926 stream->SetStats(stats); 6927 6928 FakeVideoSendStream* stream2 = AddSendStream(); 6929 VideoSendStream::Stats stats2; 6930 stats2.target_media_bitrate_bps = 200; 6931 stats2.media_bitrate_bps = 321; 6932 stats2.substreams[13].total_bitrate_bps = 5; 6933 stats2.substreams[13].retransmit_bitrate_bps = 6; 6934 stats2.substreams[21].total_bitrate_bps = 7; 6935 stats2.substreams[21].retransmit_bitrate_bps = 8; 6936 stream2->SetStats(stats2); 6937 6938 VideoMediaSendInfo send_info; 6939 VideoMediaReceiveInfo receive_info; 6940 EXPECT_TRUE(send_channel_->GetStats(&send_info)); 6941 EXPECT_TRUE(receive_channel_->GetStats(&receive_info)); 6942 6943 ASSERT_EQ(2u, send_info.aggregated_senders.size()); 6944 ASSERT_EQ(4u, send_info.senders.size()); 6945 BandwidthEstimationInfo bwe_info; 6946 send_channel_->FillBitrateInfo(&bwe_info); 6947 // Assuming stream and stream2 corresponds to senders[0] and [1] respectively 6948 // is OK as std::maps are sorted and AddSendStream() gives increasing SSRCs. 6949 EXPECT_EQ(stats.media_bitrate_bps, 6950 send_info.aggregated_senders[0].nominal_bitrate); 6951 EXPECT_EQ(stats2.media_bitrate_bps, 6952 send_info.aggregated_senders[1].nominal_bitrate); 6953 EXPECT_EQ(stats.target_media_bitrate_bps + stats2.target_media_bitrate_bps, 6954 bwe_info.target_enc_bitrate); 6955 EXPECT_EQ(stats.media_bitrate_bps + stats2.media_bitrate_bps, 6956 bwe_info.actual_enc_bitrate); 6957 EXPECT_EQ(1 + 3 + 5 + 7, bwe_info.transmit_bitrate) 6958 << "Bandwidth stats should take all streams into account."; 6959 EXPECT_EQ(2 + 4 + 6 + 8, bwe_info.retransmit_bitrate) 6960 << "Bandwidth stats should take all streams into account."; 6961 } 6962 6963 TEST_F(WebRtcVideoChannelTest, DefaultReceiveStreamReconfiguresToUseRtx) { 6964 EXPECT_TRUE(send_channel_->SetSenderParameters(send_parameters_)); 6965 6966 const std::vector<uint32_t> ssrcs = MAKE_VECTOR(kSsrcs1); 6967 const std::vector<uint32_t> rtx_ssrcs = MAKE_VECTOR(kRtxSsrcs1); 6968 6969 ASSERT_EQ(0u, fake_call_->GetVideoReceiveStreams().size()); 6970 RtpPacketReceived packet; 6971 packet.SetSsrc(ssrcs[0]); 6972 ReceivePacketAndAdvanceTime(packet); 6973 6974 ASSERT_EQ(1u, fake_call_->GetVideoReceiveStreams().size()) 6975 << "No default receive stream created."; 6976 FakeVideoReceiveStream* recv_stream = fake_call_->GetVideoReceiveStreams()[0]; 6977 EXPECT_EQ(0u, recv_stream->GetConfig().rtp.rtx_ssrc) 6978 << "Default receive stream should not have configured RTX"; 6979 6980 EXPECT_TRUE(receive_channel_->AddRecvStream( 6981 CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs))); 6982 ASSERT_EQ(1u, fake_call_->GetVideoReceiveStreams().size()) 6983 << "AddRecvStream should have reconfigured, not added a new receiver."; 6984 recv_stream = fake_call_->GetVideoReceiveStreams()[0]; 6985 EXPECT_FALSE( 6986 recv_stream->GetConfig().rtp.rtx_associated_payload_types.empty()); 6987 EXPECT_TRUE(VerifyRtxReceiveAssociations(recv_stream->GetConfig())) 6988 << "RTX should be mapped for all decoders/payload types."; 6989 EXPECT_TRUE(HasRtxReceiveAssociation(recv_stream->GetConfig(), 6990 GetEngineCodec("red").id)) 6991 << "RTX should be mapped also for the RED payload type"; 6992 EXPECT_EQ(rtx_ssrcs[0], recv_stream->GetConfig().rtp.rtx_ssrc); 6993 } 6994 6995 TEST_F(WebRtcVideoChannelTest, RejectsAddingStreamsWithMissingSsrcsForRtx) { 6996 EXPECT_TRUE(send_channel_->SetSenderParameters(send_parameters_)); 6997 6998 const std::vector<uint32_t> ssrcs = MAKE_VECTOR(kSsrcs1); 6999 const std::vector<uint32_t> rtx_ssrcs = MAKE_VECTOR(kRtxSsrcs1); 7000 7001 StreamParams sp = CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs); 7002 sp.ssrcs = ssrcs; // Without RTXs, this is the important part. 7003 7004 EXPECT_FALSE(send_channel_->AddSendStream(sp)); 7005 EXPECT_FALSE(receive_channel_->AddRecvStream(sp)); 7006 } 7007 7008 TEST_F(WebRtcVideoChannelTest, RejectsAddingStreamsWithOverlappingRtxSsrcs) { 7009 EXPECT_TRUE(send_channel_->SetSenderParameters(send_parameters_)); 7010 7011 const std::vector<uint32_t> ssrcs = MAKE_VECTOR(kSsrcs1); 7012 const std::vector<uint32_t> rtx_ssrcs = MAKE_VECTOR(kRtxSsrcs1); 7013 7014 StreamParams sp = CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs); 7015 7016 EXPECT_TRUE(send_channel_->AddSendStream(sp)); 7017 EXPECT_TRUE(receive_channel_->AddRecvStream(sp)); 7018 7019 // The RTX SSRC is already used in previous streams, using it should fail. 7020 sp = StreamParams::CreateLegacy(rtx_ssrcs[0]); 7021 EXPECT_FALSE(send_channel_->AddSendStream(sp)); 7022 EXPECT_FALSE(receive_channel_->AddRecvStream(sp)); 7023 7024 // After removing the original stream this should be fine to add (makes sure 7025 // that RTX ssrcs are not forever taken). 7026 EXPECT_TRUE(send_channel_->RemoveSendStream(ssrcs[0])); 7027 EXPECT_TRUE(receive_channel_->RemoveRecvStream(ssrcs[0])); 7028 EXPECT_TRUE(send_channel_->AddSendStream(sp)); 7029 EXPECT_TRUE(receive_channel_->AddRecvStream(sp)); 7030 } 7031 7032 TEST_F(WebRtcVideoChannelTest, 7033 RejectsAddingStreamsWithOverlappingSimulcastSsrcs) { 7034 static const uint32_t kFirstStreamSsrcs[] = {1, 2, 3}; 7035 static const uint32_t kOverlappingStreamSsrcs[] = {4, 3, 5}; 7036 EXPECT_TRUE(send_channel_->SetSenderParameters(send_parameters_)); 7037 7038 StreamParams sp = 7039 CreateSimStreamParams("cname", MAKE_VECTOR(kFirstStreamSsrcs)); 7040 7041 EXPECT_TRUE(send_channel_->AddSendStream(sp)); 7042 EXPECT_TRUE(receive_channel_->AddRecvStream(sp)); 7043 7044 // One of the SSRCs is already used in previous streams, using it should fail. 7045 sp = CreateSimStreamParams("cname", MAKE_VECTOR(kOverlappingStreamSsrcs)); 7046 EXPECT_FALSE(send_channel_->AddSendStream(sp)); 7047 EXPECT_FALSE(receive_channel_->AddRecvStream(sp)); 7048 7049 // After removing the original stream this should be fine to add (makes sure 7050 // that RTX ssrcs are not forever taken). 7051 EXPECT_TRUE(send_channel_->RemoveSendStream(kFirstStreamSsrcs[0])); 7052 EXPECT_TRUE(receive_channel_->RemoveRecvStream(kFirstStreamSsrcs[0])); 7053 EXPECT_TRUE(send_channel_->AddSendStream(sp)); 7054 EXPECT_TRUE(receive_channel_->AddRecvStream(sp)); 7055 } 7056 7057 TEST_F(WebRtcVideoChannelTest, ReportsSsrcGroupsInStats) { 7058 EXPECT_TRUE(send_channel_->SetSenderParameters(send_parameters_)); 7059 7060 static const uint32_t kSenderSsrcs[] = {4, 7, 10}; 7061 static const uint32_t kSenderRtxSsrcs[] = {5, 8, 11}; 7062 7063 StreamParams sender_sp = CreateSimWithRtxStreamParams( 7064 "cname", MAKE_VECTOR(kSenderSsrcs), MAKE_VECTOR(kSenderRtxSsrcs)); 7065 7066 EXPECT_TRUE(send_channel_->AddSendStream(sender_sp)); 7067 7068 static const uint32_t kReceiverSsrcs[] = {3}; 7069 static const uint32_t kReceiverRtxSsrcs[] = {2}; 7070 7071 StreamParams receiver_sp = CreateSimWithRtxStreamParams( 7072 "cname", MAKE_VECTOR(kReceiverSsrcs), MAKE_VECTOR(kReceiverRtxSsrcs)); 7073 EXPECT_TRUE(receive_channel_->AddRecvStream(receiver_sp)); 7074 7075 VideoMediaSendInfo send_info; 7076 VideoMediaReceiveInfo receive_info; 7077 EXPECT_TRUE(send_channel_->GetStats(&send_info)); 7078 EXPECT_TRUE(receive_channel_->GetStats(&receive_info)); 7079 7080 ASSERT_EQ(3u, send_info.senders.size()); 7081 ASSERT_EQ(1u, receive_info.receivers.size()); 7082 7083 EXPECT_NE(sender_sp.ssrc_groups, receiver_sp.ssrc_groups); 7084 EXPECT_EQ(sender_sp.ssrc_groups, send_info.senders[0].ssrc_groups); 7085 EXPECT_EQ(receiver_sp.ssrc_groups, receive_info.receivers[0].ssrc_groups); 7086 } 7087 7088 TEST_F(WebRtcVideoChannelTest, MapsReceivedPayloadTypeToCodecName) { 7089 FakeVideoReceiveStream* stream = AddRecvStream(); 7090 VideoReceiveStreamInterface::Stats stats; 7091 7092 // Report no codec name before receiving. 7093 stream->SetStats(stats); 7094 VideoMediaSendInfo send_info; 7095 VideoMediaReceiveInfo receive_info; 7096 EXPECT_TRUE(send_channel_->GetStats(&send_info)); 7097 EXPECT_TRUE(receive_channel_->GetStats(&receive_info)); 7098 7099 EXPECT_STREQ("", receive_info.receivers[0].codec_name.c_str()); 7100 7101 // Report VP8 if we're receiving it. 7102 stats.current_payload_type = GetEngineCodec("VP8").id; 7103 stream->SetStats(stats); 7104 EXPECT_TRUE(send_channel_->GetStats(&send_info)); 7105 EXPECT_TRUE(receive_channel_->GetStats(&receive_info)); 7106 7107 EXPECT_STREQ(kVp8CodecName, receive_info.receivers[0].codec_name.c_str()); 7108 7109 // Report no codec name for unknown playload types. 7110 stats.current_payload_type = 3; 7111 stream->SetStats(stats); 7112 EXPECT_TRUE(send_channel_->GetStats(&send_info)); 7113 EXPECT_TRUE(receive_channel_->GetStats(&receive_info)); 7114 7115 EXPECT_STREQ("", receive_info.receivers[0].codec_name.c_str()); 7116 } 7117 7118 // Tests that when we add a stream without SSRCs, but contains a stream_id 7119 // that it is stored and its stream id is later used when the first packet 7120 // arrives to properly create a receive stream with a sync label. 7121 TEST_F(WebRtcVideoChannelTest, RecvUnsignaledSsrcWithSignaledStreamId) { 7122 const char kSyncLabel[] = "sync_label"; 7123 StreamParams unsignaled_stream; 7124 unsignaled_stream.set_stream_ids({kSyncLabel}); 7125 ASSERT_TRUE(receive_channel_->AddRecvStream(unsignaled_stream)); 7126 receive_channel_->OnDemuxerCriteriaUpdatePending(); 7127 receive_channel_->OnDemuxerCriteriaUpdateComplete(); 7128 time_controller_.AdvanceTime(TimeDelta::Zero()); 7129 // The stream shouldn't have been created at this point because it doesn't 7130 // have any SSRCs. 7131 EXPECT_EQ(0u, fake_call_->GetVideoReceiveStreams().size()); 7132 7133 // Create and deliver packet. 7134 RtpPacketReceived packet; 7135 packet.SetSsrc(kIncomingUnsignalledSsrc); 7136 ReceivePacketAndAdvanceTime(packet); 7137 7138 // The stream should now be created with the appropriate sync label. 7139 EXPECT_EQ(1u, fake_call_->GetVideoReceiveStreams().size()); 7140 EXPECT_EQ(kSyncLabel, 7141 fake_call_->GetVideoReceiveStreams()[0]->GetConfig().sync_group); 7142 7143 // Reset the unsignaled stream to clear the cache. This deletes the receive 7144 // stream. 7145 receive_channel_->ResetUnsignaledRecvStream(); 7146 receive_channel_->OnDemuxerCriteriaUpdatePending(); 7147 EXPECT_EQ(0u, fake_call_->GetVideoReceiveStreams().size()); 7148 7149 // Until the demuxer criteria has been updated, we ignore in-flight ssrcs of 7150 // the recently removed unsignaled receive stream. 7151 ReceivePacketAndAdvanceTime(packet); 7152 EXPECT_EQ(0u, fake_call_->GetVideoReceiveStreams().size()); 7153 7154 // After the demuxer criteria has been updated, we should proceed to create 7155 // unsignalled receive streams. This time when a default video receive stream 7156 // is created it won't have a sync_group. 7157 receive_channel_->OnDemuxerCriteriaUpdateComplete(); 7158 ReceivePacketAndAdvanceTime(packet); 7159 EXPECT_EQ(1u, fake_call_->GetVideoReceiveStreams().size()); 7160 EXPECT_TRUE( 7161 fake_call_->GetVideoReceiveStreams()[0]->GetConfig().sync_group.empty()); 7162 } 7163 7164 TEST_F(WebRtcVideoChannelTest, 7165 ResetUnsignaledRecvStreamDeletesAllDefaultStreams) { 7166 // No receive streams to start with. 7167 EXPECT_TRUE(fake_call_->GetVideoReceiveStreams().empty()); 7168 7169 // Packet with unsignaled SSRC is received. 7170 RtpPacketReceived packet; 7171 packet.SetSsrc(kIncomingUnsignalledSsrc); 7172 ReceivePacketAndAdvanceTime(packet); 7173 7174 // Default receive stream created. 7175 const auto& receivers1 = fake_call_->GetVideoReceiveStreams(); 7176 ASSERT_EQ(receivers1.size(), 1u); 7177 EXPECT_EQ(receivers1[0]->GetConfig().rtp.remote_ssrc, 7178 kIncomingUnsignalledSsrc); 7179 7180 // Stream with another SSRC gets signaled. 7181 receive_channel_->ResetUnsignaledRecvStream(); 7182 constexpr uint32_t kIncomingSignalledSsrc = kIncomingUnsignalledSsrc + 1; 7183 ASSERT_TRUE(receive_channel_->AddRecvStream( 7184 StreamParams::CreateLegacy(kIncomingSignalledSsrc))); 7185 7186 // New receiver is for the signaled stream. 7187 const auto& receivers2 = fake_call_->GetVideoReceiveStreams(); 7188 ASSERT_EQ(receivers2.size(), 1u); 7189 EXPECT_EQ(receivers2[0]->GetConfig().rtp.remote_ssrc, kIncomingSignalledSsrc); 7190 } 7191 7192 TEST_F(WebRtcVideoChannelTest, 7193 RecentlyAddedSsrcsDoNotCreateUnsignalledRecvStreams) { 7194 const uint32_t kSsrc1 = 1; 7195 const uint32_t kSsrc2 = 2; 7196 7197 // Starting point: receiving kSsrc1. 7198 EXPECT_TRUE( 7199 receive_channel_->AddRecvStream(StreamParams::CreateLegacy(kSsrc1))); 7200 receive_channel_->OnDemuxerCriteriaUpdatePending(); 7201 receive_channel_->OnDemuxerCriteriaUpdateComplete(); 7202 time_controller_.AdvanceTime(TimeDelta::Zero()); 7203 EXPECT_EQ(fake_call_->GetVideoReceiveStreams().size(), 1u); 7204 7205 // If this is the only m= section the demuxer might be configure to forward 7206 // all packets, regardless of ssrc, to this channel. When we go to multiple m= 7207 // sections, there can thus be a window of time where packets that should 7208 // never have belonged to this channel arrive anyway. 7209 7210 // Emulate a second m= section being created by updating the demuxer criteria 7211 // without adding any streams. 7212 receive_channel_->OnDemuxerCriteriaUpdatePending(); 7213 7214 // Emulate there being in-flight packets for kSsrc1 and kSsrc2 arriving before 7215 // the demuxer is updated. 7216 { 7217 // Receive a packet for kSsrc1. 7218 RtpPacketReceived packet; 7219 packet.SetSsrc(kSsrc1); 7220 ReceivePacketAndAdvanceTime(packet); 7221 } 7222 { 7223 // Receive a packet for kSsrc2. 7224 RtpPacketReceived packet; 7225 packet.SetSsrc(kSsrc2); 7226 ReceivePacketAndAdvanceTime(packet); 7227 } 7228 7229 // No unsignaled ssrc for kSsrc2 should have been created, but kSsrc1 should 7230 // arrive since it already has a stream. 7231 EXPECT_EQ(fake_call_->GetVideoReceiveStreams().size(), 1u); 7232 EXPECT_EQ(fake_call_->GetDeliveredPacketsForSsrc(kSsrc1), 1u); 7233 EXPECT_EQ(fake_call_->GetDeliveredPacketsForSsrc(kSsrc2), 0u); 7234 7235 // Signal that the demuxer update is complete. Because there are no more 7236 // pending demuxer updates, receiving unknown ssrcs (kSsrc2) should again 7237 // result in unsignalled receive streams being created. 7238 receive_channel_->OnDemuxerCriteriaUpdateComplete(); 7239 time_controller_.AdvanceTime(TimeDelta::Zero()); 7240 7241 // Receive packets for kSsrc1 and kSsrc2 again. 7242 { 7243 // Receive a packet for kSsrc1. 7244 RtpPacketReceived packet; 7245 packet.SetSsrc(kSsrc1); 7246 ReceivePacketAndAdvanceTime(packet); 7247 } 7248 { 7249 // Receive a packet for kSsrc2. 7250 RtpPacketReceived packet; 7251 packet.SetSsrc(kSsrc2); 7252 ReceivePacketAndAdvanceTime(packet); 7253 } 7254 7255 // An unsignalled ssrc for kSsrc2 should be created and the packet counter 7256 // should increase for both ssrcs. 7257 EXPECT_EQ(fake_call_->GetVideoReceiveStreams().size(), 2u); 7258 EXPECT_EQ(fake_call_->GetDeliveredPacketsForSsrc(kSsrc1), 2u); 7259 EXPECT_EQ(fake_call_->GetDeliveredPacketsForSsrc(kSsrc2), 1u); 7260 } 7261 7262 TEST_F(WebRtcVideoChannelTest, 7263 RecentlyRemovedSsrcsDoNotCreateUnsignalledRecvStreams) { 7264 const uint32_t kSsrc1 = 1; 7265 const uint32_t kSsrc2 = 2; 7266 7267 // Starting point: receiving kSsrc1 and kSsrc2. 7268 EXPECT_TRUE( 7269 receive_channel_->AddRecvStream(StreamParams::CreateLegacy(kSsrc1))); 7270 EXPECT_TRUE( 7271 receive_channel_->AddRecvStream(StreamParams::CreateLegacy(kSsrc2))); 7272 receive_channel_->OnDemuxerCriteriaUpdatePending(); 7273 receive_channel_->OnDemuxerCriteriaUpdateComplete(); 7274 time_controller_.AdvanceTime(TimeDelta::Zero()); 7275 EXPECT_EQ(fake_call_->GetVideoReceiveStreams().size(), 2u); 7276 EXPECT_EQ(fake_call_->GetDeliveredPacketsForSsrc(kSsrc1), 0u); 7277 EXPECT_EQ(fake_call_->GetDeliveredPacketsForSsrc(kSsrc2), 0u); 7278 7279 // Remove kSsrc1, signal that a demuxer criteria update is pending, but not 7280 // completed yet. 7281 EXPECT_TRUE(receive_channel_->RemoveRecvStream(kSsrc1)); 7282 receive_channel_->OnDemuxerCriteriaUpdatePending(); 7283 7284 // We only have a receiver for kSsrc2 now. 7285 EXPECT_EQ(fake_call_->GetVideoReceiveStreams().size(), 1u); 7286 7287 // Emulate there being in-flight packets for kSsrc1 and kSsrc2 arriving before 7288 // the demuxer is updated. 7289 { 7290 // Receive a packet for kSsrc1. 7291 RtpPacketReceived packet; 7292 packet.SetSsrc(kSsrc1); 7293 ReceivePacketAndAdvanceTime(packet); 7294 } 7295 { 7296 // Receive a packet for kSsrc2. 7297 RtpPacketReceived packet; 7298 packet.SetSsrc(kSsrc2); 7299 ReceivePacketAndAdvanceTime(packet); 7300 } 7301 7302 // No unsignaled ssrc for kSsrc1 should have been created, but the packet 7303 // count for kSsrc2 should increase. 7304 EXPECT_EQ(fake_call_->GetVideoReceiveStreams().size(), 1u); 7305 EXPECT_EQ(fake_call_->GetDeliveredPacketsForSsrc(kSsrc1), 0u); 7306 EXPECT_EQ(fake_call_->GetDeliveredPacketsForSsrc(kSsrc2), 1u); 7307 7308 // Signal that the demuxer update is complete. This means we should stop 7309 // ignorning kSsrc1. 7310 receive_channel_->OnDemuxerCriteriaUpdateComplete(); 7311 time_controller_.AdvanceTime(TimeDelta::Zero()); 7312 7313 // Receive packets for kSsrc1 and kSsrc2 again. 7314 { 7315 // Receive a packet for kSsrc1. 7316 RtpPacketReceived packet; 7317 packet.SetSsrc(kSsrc1); 7318 ReceivePacketAndAdvanceTime(packet); 7319 } 7320 { 7321 // Receive a packet for kSsrc2. 7322 RtpPacketReceived packet; 7323 packet.SetSsrc(kSsrc2); 7324 ReceivePacketAndAdvanceTime(packet); 7325 } 7326 7327 // An unsignalled ssrc for kSsrc1 should be created and the packet counter 7328 // should increase for both ssrcs. 7329 EXPECT_EQ(fake_call_->GetVideoReceiveStreams().size(), 2u); 7330 EXPECT_EQ(fake_call_->GetDeliveredPacketsForSsrc(kSsrc1), 1u); 7331 EXPECT_EQ(fake_call_->GetDeliveredPacketsForSsrc(kSsrc2), 2u); 7332 } 7333 7334 TEST_F(WebRtcVideoChannelTest, MultiplePendingDemuxerCriteriaUpdates) { 7335 // Starting point: receiving kSsrc. 7336 EXPECT_TRUE( 7337 receive_channel_->AddRecvStream(StreamParams::CreateLegacy(kSsrc))); 7338 receive_channel_->OnDemuxerCriteriaUpdatePending(); 7339 receive_channel_->OnDemuxerCriteriaUpdateComplete(); 7340 time_controller_.AdvanceTime(TimeDelta::Zero()); 7341 ASSERT_EQ(fake_call_->GetVideoReceiveStreams().size(), 1u); 7342 7343 // Remove kSsrc... 7344 EXPECT_TRUE(receive_channel_->RemoveRecvStream(kSsrc)); 7345 receive_channel_->OnDemuxerCriteriaUpdatePending(); 7346 EXPECT_EQ(fake_call_->GetVideoReceiveStreams().size(), 0u); 7347 // And then add it back again, before the demuxer knows about the new 7348 // criteria! 7349 EXPECT_TRUE( 7350 receive_channel_->AddRecvStream(StreamParams::CreateLegacy(kSsrc))); 7351 receive_channel_->OnDemuxerCriteriaUpdatePending(); 7352 EXPECT_EQ(fake_call_->GetVideoReceiveStreams().size(), 1u); 7353 7354 // In-flight packets should arrive because the stream was recreated, even 7355 // though demuxer criteria updates are pending... 7356 { 7357 RtpPacketReceived packet; 7358 packet.SetSsrc(kSsrc); 7359 ReceivePacketAndAdvanceTime(packet); 7360 } 7361 EXPECT_EQ(fake_call_->GetDeliveredPacketsForSsrc(kSsrc), 1u); 7362 7363 // Signal that the demuxer knows about the first update: the removal. 7364 receive_channel_->OnDemuxerCriteriaUpdateComplete(); 7365 time_controller_.AdvanceTime(TimeDelta::Zero()); 7366 7367 // This still should not prevent in-flight packets from arriving because we 7368 // have a receive stream for it. 7369 { 7370 RtpPacketReceived packet; 7371 packet.SetSsrc(kSsrc); 7372 ReceivePacketAndAdvanceTime(packet); 7373 } 7374 EXPECT_EQ(fake_call_->GetDeliveredPacketsForSsrc(kSsrc), 2u); 7375 7376 // Remove the kSsrc again while previous demuxer updates are still pending. 7377 EXPECT_TRUE(receive_channel_->RemoveRecvStream(kSsrc)); 7378 receive_channel_->OnDemuxerCriteriaUpdatePending(); 7379 EXPECT_EQ(fake_call_->GetVideoReceiveStreams().size(), 0u); 7380 7381 // Now the packet should be dropped and not create an unsignalled receive 7382 // stream. 7383 { 7384 RtpPacketReceived packet; 7385 packet.SetSsrc(kSsrc); 7386 ReceivePacketAndAdvanceTime(packet); 7387 } 7388 EXPECT_EQ(fake_call_->GetVideoReceiveStreams().size(), 0u); 7389 EXPECT_EQ(fake_call_->GetDeliveredPacketsForSsrc(kSsrc), 2u); 7390 7391 // Signal that the demuxer knows about the second update: adding it back. 7392 receive_channel_->OnDemuxerCriteriaUpdateComplete(); 7393 time_controller_.AdvanceTime(TimeDelta::Zero()); 7394 7395 // The packets should continue to be dropped because removal happened after 7396 // the most recently completed demuxer update. 7397 { 7398 RtpPacketReceived packet; 7399 packet.SetSsrc(kSsrc); 7400 ReceivePacketAndAdvanceTime(packet); 7401 } 7402 EXPECT_EQ(fake_call_->GetVideoReceiveStreams().size(), 0u); 7403 EXPECT_EQ(fake_call_->GetDeliveredPacketsForSsrc(kSsrc), 2u); 7404 7405 // Signal that the demuxer knows about the last update: the second removal. 7406 receive_channel_->OnDemuxerCriteriaUpdateComplete(); 7407 time_controller_.AdvanceTime(TimeDelta::Zero()); 7408 7409 // If packets still arrive after the demuxer knows about the latest removal we 7410 // should finally create an unsignalled receive stream. 7411 { 7412 RtpPacketReceived packet; 7413 packet.SetSsrc(kSsrc); 7414 ReceivePacketAndAdvanceTime(packet); 7415 } 7416 EXPECT_EQ(fake_call_->GetVideoReceiveStreams().size(), 1u); 7417 EXPECT_EQ(fake_call_->GetDeliveredPacketsForSsrc(kSsrc), 3u); 7418 } 7419 7420 TEST_F(WebRtcVideoChannelTest, UnsignalledSsrcHasACooldown) { 7421 const uint32_t kSsrc1 = 1; 7422 const uint32_t kSsrc2 = 2; 7423 7424 // Send packets for kSsrc1, creating an unsignalled receive stream. 7425 { 7426 // Receive a packet for kSsrc1. 7427 RtpPacketReceived packet; 7428 packet.SetSsrc(kSsrc1); 7429 receive_channel_->OnPacketReceived(packet); 7430 } 7431 7432 time_controller_.AdvanceTime( 7433 TimeDelta::Millis(kUnsignalledReceiveStreamCooldownMs - 1)); 7434 7435 // We now have an unsignalled receive stream for kSsrc1. 7436 EXPECT_EQ(fake_call_->GetVideoReceiveStreams().size(), 1u); 7437 EXPECT_EQ(fake_call_->GetDeliveredPacketsForSsrc(kSsrc1), 1u); 7438 EXPECT_EQ(fake_call_->GetDeliveredPacketsForSsrc(kSsrc2), 0u); 7439 7440 { 7441 // Receive a packet for kSsrc2. 7442 RtpPacketReceived packet; 7443 packet.SetSsrc(kSsrc2); 7444 receive_channel_->OnPacketReceived(packet); 7445 } 7446 time_controller_.AdvanceTime(TimeDelta::Zero()); 7447 7448 // Not enough time has passed to replace the unsignalled receive stream, so 7449 // the kSsrc2 should be ignored. 7450 EXPECT_EQ(fake_call_->GetVideoReceiveStreams().size(), 1u); 7451 EXPECT_EQ(fake_call_->GetDeliveredPacketsForSsrc(kSsrc1), 1u); 7452 EXPECT_EQ(fake_call_->GetDeliveredPacketsForSsrc(kSsrc2), 0u); 7453 7454 // After 500 ms, kSsrc2 should trigger a new unsignalled receive stream that 7455 // replaces the old one. 7456 time_controller_.AdvanceTime(TimeDelta::Millis(1)); 7457 { 7458 // Receive a packet for kSsrc2. 7459 RtpPacketReceived packet; 7460 packet.SetSsrc(kSsrc2); 7461 receive_channel_->OnPacketReceived(packet); 7462 } 7463 time_controller_.AdvanceTime(TimeDelta::Zero()); 7464 7465 // The old unsignalled receive stream was destroyed and replaced, so we still 7466 // only have one unsignalled receive stream. But tha packet counter for kSsrc2 7467 // has now increased. 7468 EXPECT_EQ(fake_call_->GetVideoReceiveStreams().size(), 1u); 7469 EXPECT_EQ(fake_call_->GetDeliveredPacketsForSsrc(kSsrc1), 1u); 7470 EXPECT_EQ(fake_call_->GetDeliveredPacketsForSsrc(kSsrc2), 1u); 7471 } 7472 7473 // Test BaseMinimumPlayoutDelayMs on receive streams. 7474 TEST_F(WebRtcVideoChannelTest, BaseMinimumPlayoutDelayMs) { 7475 // Test that set won't work for non-existing receive streams. 7476 EXPECT_FALSE(receive_channel_->SetBaseMinimumPlayoutDelayMs(kSsrc + 2, 200)); 7477 // Test that get won't work for non-existing receive streams. 7478 EXPECT_FALSE(receive_channel_->GetBaseMinimumPlayoutDelayMs(kSsrc + 2)); 7479 7480 EXPECT_TRUE(AddRecvStream()); 7481 // Test that set works for the existing receive stream. 7482 EXPECT_TRUE(receive_channel_->SetBaseMinimumPlayoutDelayMs(last_ssrc_, 200)); 7483 auto* recv_stream = fake_call_->GetVideoReceiveStream(last_ssrc_); 7484 EXPECT_TRUE(recv_stream); 7485 EXPECT_EQ(recv_stream->base_mininum_playout_delay_ms(), 200); 7486 EXPECT_EQ( 7487 receive_channel_->GetBaseMinimumPlayoutDelayMs(last_ssrc_).value_or(0), 7488 200); 7489 } 7490 7491 // Test BaseMinimumPlayoutDelayMs on unsignaled receive streams. 7492 TEST_F(WebRtcVideoChannelTest, BaseMinimumPlayoutDelayMsUnsignaledRecvStream) { 7493 std::optional<int> delay_ms; 7494 const FakeVideoReceiveStream* recv_stream; 7495 7496 // Set default stream with SSRC 0 7497 EXPECT_TRUE(receive_channel_->SetBaseMinimumPlayoutDelayMs(0, 200)); 7498 EXPECT_EQ(200, receive_channel_->GetBaseMinimumPlayoutDelayMs(0).value_or(0)); 7499 7500 // Spawn an unsignaled stream by sending a packet, it should inherit 7501 // default delay 200. 7502 RtpPacketReceived packet; 7503 packet.SetSsrc(kIncomingUnsignalledSsrc); 7504 ReceivePacketAndAdvanceTime(packet); 7505 7506 recv_stream = fake_call_->GetVideoReceiveStream(kIncomingUnsignalledSsrc); 7507 EXPECT_EQ(recv_stream->base_mininum_playout_delay_ms(), 200); 7508 delay_ms = 7509 receive_channel_->GetBaseMinimumPlayoutDelayMs(kIncomingUnsignalledSsrc); 7510 EXPECT_EQ(200, delay_ms.value_or(0)); 7511 7512 // Check that now if we change delay for SSRC 0 it will change delay for the 7513 // default receiving stream as well. 7514 EXPECT_TRUE(receive_channel_->SetBaseMinimumPlayoutDelayMs(0, 300)); 7515 EXPECT_EQ(300, receive_channel_->GetBaseMinimumPlayoutDelayMs(0).value_or(0)); 7516 delay_ms = 7517 receive_channel_->GetBaseMinimumPlayoutDelayMs(kIncomingUnsignalledSsrc); 7518 EXPECT_EQ(300, delay_ms.value_or(0)); 7519 recv_stream = fake_call_->GetVideoReceiveStream(kIncomingUnsignalledSsrc); 7520 EXPECT_EQ(recv_stream->base_mininum_playout_delay_ms(), 300); 7521 } 7522 7523 void WebRtcVideoChannelTest::TestReceiveUnsignaledSsrcPacket( 7524 uint8_t payload_type, 7525 bool expect_created_receive_stream) { 7526 // kRedRtxPayloadType must currently be unused. 7527 EXPECT_FALSE(FindCodecById(engine_->LegacyRecvCodecs(), kRedRtxPayloadType)); 7528 7529 // Add a RED RTX codec. 7530 Codec red_rtx_codec = 7531 CreateVideoRtxCodec(kRedRtxPayloadType, GetEngineCodec("red").id); 7532 recv_parameters_.codecs.push_back(red_rtx_codec); 7533 EXPECT_TRUE(receive_channel_->SetReceiverParameters(recv_parameters_)); 7534 7535 ASSERT_EQ(0u, fake_call_->GetVideoReceiveStreams().size()); 7536 RtpPacketReceived packet; 7537 packet.SetPayloadType(payload_type); 7538 packet.SetSsrc(kIncomingUnsignalledSsrc); 7539 ReceivePacketAndAdvanceTime(packet); 7540 7541 if (expect_created_receive_stream) { 7542 EXPECT_EQ(1u, fake_call_->GetVideoReceiveStreams().size()) 7543 << "Should have created a receive stream for payload type: " 7544 << payload_type; 7545 } else { 7546 EXPECT_EQ(0u, fake_call_->GetVideoReceiveStreams().size()) 7547 << "Shouldn't have created a receive stream for payload type: " 7548 << payload_type; 7549 } 7550 } 7551 7552 class WebRtcVideoChannelDiscardUnknownSsrcTest : public WebRtcVideoChannelTest { 7553 public: 7554 WebRtcVideoChannelDiscardUnknownSsrcTest() 7555 : WebRtcVideoChannelTest( 7556 "WebRTC-Video-DiscardPacketsWithUnknownSsrc/Enabled/") {} 7557 }; 7558 7559 TEST_F(WebRtcVideoChannelDiscardUnknownSsrcTest, NoUnsignalledStreamCreated) { 7560 TestReceiveUnsignaledSsrcPacket(GetEngineCodec("VP8").id, 7561 false /* expect_created_receive_stream */); 7562 } 7563 7564 TEST_F(WebRtcVideoChannelTest, Vp8PacketCreatesUnsignalledStream) { 7565 TestReceiveUnsignaledSsrcPacket(GetEngineCodec("VP8").id, 7566 true /* expect_created_receive_stream */); 7567 } 7568 7569 TEST_F(WebRtcVideoChannelTest, Vp9PacketCreatesUnsignalledStream) { 7570 TestReceiveUnsignaledSsrcPacket(GetEngineCodec("VP9").id, 7571 true /* expect_created_receive_stream */); 7572 } 7573 7574 TEST_F(WebRtcVideoChannelTest, RtxPacketDoesntCreateUnsignalledStream) { 7575 AssignDefaultAptRtxTypes(); 7576 const Codec vp8 = GetEngineCodec("VP8"); 7577 const int rtx_vp8_payload_type = default_apt_rtx_types_[vp8.id]; 7578 TestReceiveUnsignaledSsrcPacket(rtx_vp8_payload_type, 7579 false /* expect_created_receive_stream */); 7580 } 7581 7582 TEST_F(WebRtcVideoChannelTest, UlpfecPacketDoesntCreateUnsignalledStream) { 7583 TestReceiveUnsignaledSsrcPacket(GetEngineCodec("ulpfec").id, 7584 false /* expect_created_receive_stream */); 7585 } 7586 7587 TEST_F(WebRtcVideoChannelFlexfecRecvTest, 7588 FlexfecPacketDoesntCreateUnsignalledStream) { 7589 TestReceiveUnsignaledSsrcPacket(GetEngineCodec("flexfec-03").id, 7590 false /* expect_created_receive_stream */); 7591 } 7592 7593 TEST_F(WebRtcVideoChannelTest, RedRtxPacketDoesntCreateUnsignalledStream) { 7594 TestReceiveUnsignaledSsrcPacket(kRedRtxPayloadType, 7595 false /* expect_created_receive_stream */); 7596 } 7597 7598 TEST_F(WebRtcVideoChannelTest, RtxAfterMediaPacketUpdatesUnsignalledRtxSsrc) { 7599 AssignDefaultAptRtxTypes(); 7600 const Codec vp8 = GetEngineCodec("VP8"); 7601 const int payload_type = vp8.id; 7602 const int rtx_vp8_payload_type = default_apt_rtx_types_[vp8.id]; 7603 const uint32_t ssrc = kIncomingUnsignalledSsrc; 7604 const uint32_t rtx_ssrc = ssrc + 1; 7605 7606 // Send media packet. 7607 RtpPacketReceived packet; 7608 packet.SetPayloadType(payload_type); 7609 packet.SetSsrc(ssrc); 7610 ReceivePacketAndAdvanceTime(packet); 7611 EXPECT_EQ(1u, fake_call_->GetVideoReceiveStreams().size()) 7612 << "Should have created a receive stream for payload type: " 7613 << payload_type; 7614 7615 // Send rtx packet. 7616 RtpPacketReceived rtx_packet; 7617 rtx_packet.SetPayloadType(rtx_vp8_payload_type); 7618 rtx_packet.SetSsrc(rtx_ssrc); 7619 ReceivePacketAndAdvanceTime(rtx_packet); 7620 EXPECT_EQ(1u, fake_call_->GetVideoReceiveStreams().size()) 7621 << "RTX packet should not have added or removed a receive stream"; 7622 7623 auto recv_stream = fake_call_->GetVideoReceiveStreams().front(); 7624 auto& config = recv_stream->GetConfig(); 7625 EXPECT_EQ(config.rtp.remote_ssrc, ssrc) 7626 << "Receive stream should have correct media ssrc"; 7627 EXPECT_EQ(config.rtp.rtx_ssrc, rtx_ssrc) 7628 << "Receive stream should have correct rtx ssrc"; 7629 EXPECT_EQ(fake_call_->GetDeliveredPacketsForSsrc(ssrc), 1u); 7630 EXPECT_EQ(fake_call_->GetDeliveredPacketsForSsrc(rtx_ssrc), 1u); 7631 } 7632 7633 TEST_F(WebRtcVideoChannelTest, UnsignaledStreamCreatedAfterMediaPacket) { 7634 AssignDefaultAptRtxTypes(); 7635 const Codec vp8 = GetEngineCodec("VP8"); 7636 const int payload_type = vp8.id; 7637 const int rtx_vp8_payload_type = default_apt_rtx_types_[vp8.id]; 7638 const uint32_t ssrc = kIncomingUnsignalledSsrc; 7639 const uint32_t rtx_ssrc = ssrc + 1; 7640 7641 // Receive rtx packet. 7642 RtpPacketReceived rtx_packet; 7643 rtx_packet.SetPayloadType(rtx_vp8_payload_type); 7644 rtx_packet.SetSsrc(rtx_ssrc); 7645 receive_channel_->OnPacketReceived(rtx_packet); 7646 time_controller_.AdvanceTime(TimeDelta::Zero()); 7647 EXPECT_EQ(0u, fake_call_->GetVideoReceiveStreams().size()); 7648 7649 // Receive media packet. 7650 RtpPacketReceived packet; 7651 packet.SetPayloadType(payload_type); 7652 packet.SetSsrc(ssrc); 7653 ReceivePacketAndAdvanceTime(packet); 7654 EXPECT_EQ(1u, fake_call_->GetVideoReceiveStreams().size()); 7655 7656 // Check receive stream has been recreated with correct ssrcs. 7657 auto recv_stream = fake_call_->GetVideoReceiveStreams().front(); 7658 auto& config = recv_stream->GetConfig(); 7659 EXPECT_EQ(config.rtp.remote_ssrc, ssrc) 7660 << "Receive stream should have correct media ssrc"; 7661 } 7662 7663 // Test that receiving any unsignalled SSRC works even if it changes. 7664 // The first unsignalled SSRC received will create a default receive stream. 7665 // Any different unsignalled SSRC received will replace the default. 7666 TEST_F(WebRtcVideoChannelTest, ReceiveDifferentUnsignaledSsrc) { 7667 // Allow receiving VP8, VP9, H264 (if enabled). 7668 VideoReceiverParameters parameters; 7669 parameters.codecs.push_back(GetEngineCodec("VP8")); 7670 parameters.codecs.push_back(GetEngineCodec("VP9")); 7671 7672 #if defined(WEBRTC_USE_H264) 7673 Codec H264codec = CreateVideoCodec(126, "H264"); 7674 parameters.codecs.push_back(H264codec); 7675 #endif 7676 7677 EXPECT_TRUE(receive_channel_->SetReceiverParameters(parameters)); 7678 // No receive streams yet. 7679 ASSERT_EQ(0u, fake_call_->GetVideoReceiveStreams().size()); 7680 FakeVideoRenderer renderer; 7681 receive_channel_->SetDefaultSink(&renderer); 7682 7683 // Receive VP8 packet on first SSRC. 7684 RtpPacketReceived rtp_packet; 7685 rtp_packet.SetPayloadType(GetEngineCodec("VP8").id); 7686 rtp_packet.SetSsrc(kIncomingUnsignalledSsrc + 1); 7687 ReceivePacketAndAdvanceTime(rtp_packet); 7688 // VP8 packet should create default receive stream. 7689 ASSERT_EQ(1u, fake_call_->GetVideoReceiveStreams().size()); 7690 FakeVideoReceiveStream* recv_stream = fake_call_->GetVideoReceiveStreams()[0]; 7691 EXPECT_EQ(rtp_packet.Ssrc(), recv_stream->GetConfig().rtp.remote_ssrc); 7692 // Verify that the receive stream sinks to a renderer. 7693 VideoFrame video_frame = 7694 VideoFrame::Builder() 7695 .set_video_frame_buffer(CreateBlackFrameBuffer(4, 4)) 7696 .set_rtp_timestamp(100) 7697 .set_timestamp_us(0) 7698 .set_rotation(kVideoRotation_0) 7699 .build(); 7700 recv_stream->InjectFrame(video_frame); 7701 EXPECT_EQ(1, renderer.num_rendered_frames()); 7702 7703 // Receive VP9 packet on second SSRC. 7704 rtp_packet.SetPayloadType(GetEngineCodec("VP9").id); 7705 rtp_packet.SetSsrc(kIncomingUnsignalledSsrc + 2); 7706 ReceivePacketAndAdvanceTime(rtp_packet); 7707 // VP9 packet should replace the default receive SSRC. 7708 ASSERT_EQ(1u, fake_call_->GetVideoReceiveStreams().size()); 7709 recv_stream = fake_call_->GetVideoReceiveStreams()[0]; 7710 EXPECT_EQ(rtp_packet.Ssrc(), recv_stream->GetConfig().rtp.remote_ssrc); 7711 // Verify that the receive stream sinks to a renderer. 7712 VideoFrame video_frame2 = 7713 VideoFrame::Builder() 7714 .set_video_frame_buffer(CreateBlackFrameBuffer(4, 4)) 7715 .set_rtp_timestamp(200) 7716 .set_timestamp_us(0) 7717 .set_rotation(kVideoRotation_0) 7718 .build(); 7719 recv_stream->InjectFrame(video_frame2); 7720 EXPECT_EQ(2, renderer.num_rendered_frames()); 7721 7722 #if defined(WEBRTC_USE_H264) 7723 // Receive H264 packet on third SSRC. 7724 rtp_packet.SetPayloadType(126); 7725 rtp_packet.SetSsrc(kIncomingUnsignalledSsrc + 3); 7726 ReceivePacketAndAdvanceTime(rtp_packet); 7727 // H264 packet should replace the default receive SSRC. 7728 ASSERT_EQ(1u, fake_call_->GetVideoReceiveStreams().size()); 7729 recv_stream = fake_call_->GetVideoReceiveStreams()[0]; 7730 EXPECT_EQ(rtp_packet.Ssrc(), recv_stream->GetConfig().rtp.remote_ssrc); 7731 // Verify that the receive stream sinks to a renderer. 7732 VideoFrame video_frame3 = 7733 VideoFrame::Builder() 7734 .set_video_frame_buffer(CreateBlackFrameBuffer(4, 4)) 7735 .set_rtp_timestamp(300) 7736 .set_timestamp_us(0) 7737 .set_rotation(kVideoRotation_0) 7738 .build(); 7739 recv_stream->InjectFrame(video_frame3); 7740 EXPECT_EQ(3, renderer.num_rendered_frames()); 7741 #endif 7742 } 7743 7744 // This test verifies that when a new default stream is created for a new 7745 // unsignaled SSRC, the new stream does not overwrite any old stream that had 7746 // been the default receive stream before being properly signaled. 7747 TEST_F(WebRtcVideoChannelTest, 7748 NewUnsignaledStreamDoesNotDestroyPreviouslyUnsignaledStream) { 7749 VideoReceiverParameters parameters; 7750 parameters.codecs.push_back(GetEngineCodec("VP8")); 7751 ASSERT_TRUE(receive_channel_->SetReceiverParameters(parameters)); 7752 7753 // No streams signaled and no packets received, so we should not have any 7754 // stream objects created yet. 7755 EXPECT_EQ(0u, fake_call_->GetVideoReceiveStreams().size()); 7756 7757 // Receive packet on an unsignaled SSRC. 7758 RtpPacketReceived rtp_packet; 7759 rtp_packet.SetPayloadType(GetEngineCodec("VP8").id); 7760 rtp_packet.SetSsrc(kSsrcs3[0]); 7761 ReceivePacketAndAdvanceTime(rtp_packet); 7762 // Default receive stream should be created. 7763 ASSERT_EQ(1u, fake_call_->GetVideoReceiveStreams().size()); 7764 FakeVideoReceiveStream* recv_stream0 = 7765 fake_call_->GetVideoReceiveStreams()[0]; 7766 EXPECT_EQ(kSsrcs3[0], recv_stream0->GetConfig().rtp.remote_ssrc); 7767 7768 // Signal the SSRC. 7769 EXPECT_TRUE( 7770 receive_channel_->AddRecvStream(StreamParams::CreateLegacy(kSsrcs3[0]))); 7771 ASSERT_EQ(1u, fake_call_->GetVideoReceiveStreams().size()); 7772 recv_stream0 = fake_call_->GetVideoReceiveStreams()[0]; 7773 EXPECT_EQ(kSsrcs3[0], recv_stream0->GetConfig().rtp.remote_ssrc); 7774 7775 // Receive packet on a different unsignaled SSRC. 7776 rtp_packet.SetSsrc(kSsrcs3[1]); 7777 ReceivePacketAndAdvanceTime(rtp_packet); 7778 // New default receive stream should be created, but old stream should remain. 7779 ASSERT_EQ(2u, fake_call_->GetVideoReceiveStreams().size()); 7780 EXPECT_EQ(recv_stream0, fake_call_->GetVideoReceiveStreams()[0]); 7781 FakeVideoReceiveStream* recv_stream1 = 7782 fake_call_->GetVideoReceiveStreams()[1]; 7783 EXPECT_EQ(kSsrcs3[1], recv_stream1->GetConfig().rtp.remote_ssrc); 7784 } 7785 7786 TEST_F(WebRtcVideoChannelTest, CanSetMaxBitrateForExistingStream) { 7787 AddSendStream(); 7788 7789 FrameForwarder frame_forwarder; 7790 EXPECT_TRUE( 7791 send_channel_->SetVideoSend(last_ssrc_, nullptr, &frame_forwarder)); 7792 EXPECT_TRUE(send_channel_->SetSend(true)); 7793 frame_forwarder.IncomingCapturedFrame(frame_source_.GetFrame()); 7794 7795 int default_encoder_bitrate = GetMaxEncoderBitrate(); 7796 EXPECT_GT(default_encoder_bitrate, 1000); 7797 7798 // TODO(skvlad): Resolve the inconsistency between the interpretation 7799 // of the global bitrate limit for audio and video: 7800 // - Audio: max_bandwidth_bps = 0 - fail the operation, 7801 // max_bandwidth_bps = -1 - remove the bandwidth limit 7802 // - Video: max_bandwidth_bps = 0 - remove the bandwidth limit, 7803 // max_bandwidth_bps = -1 - remove the bandwidth limit 7804 7805 SetAndExpectMaxBitrate(1000, 0, 1000); 7806 SetAndExpectMaxBitrate(1000, 800, 800); 7807 SetAndExpectMaxBitrate(600, 800, 600); 7808 SetAndExpectMaxBitrate(0, 800, 800); 7809 SetAndExpectMaxBitrate(0, 0, default_encoder_bitrate); 7810 7811 EXPECT_TRUE(send_channel_->SetVideoSend(last_ssrc_, nullptr, nullptr)); 7812 } 7813 7814 TEST_F(WebRtcVideoChannelTest, CannotSetMaxBitrateForNonexistentStream) { 7815 RtpParameters nonexistent_parameters = 7816 send_channel_->GetRtpSendParameters(last_ssrc_); 7817 EXPECT_EQ(0u, nonexistent_parameters.encodings.size()); 7818 7819 nonexistent_parameters.encodings.push_back(RtpEncodingParameters()); 7820 EXPECT_FALSE( 7821 send_channel_->SetRtpSendParameters(last_ssrc_, nonexistent_parameters) 7822 .ok()); 7823 } 7824 7825 TEST_F(WebRtcVideoChannelTest, 7826 SetLowMaxBitrateOverwritesVideoStreamMinBitrate) { 7827 FakeVideoSendStream* stream = AddSendStream(); 7828 7829 RtpParameters parameters = send_channel_->GetRtpSendParameters(last_ssrc_); 7830 EXPECT_EQ(1UL, parameters.encodings.size()); 7831 EXPECT_FALSE(parameters.encodings[0].max_bitrate_bps.has_value()); 7832 EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok()); 7833 7834 // Note that this is testing the behavior of the FakeVideoSendStream, which 7835 // also calls to CreateEncoderStreams to get the VideoStreams, so essentially 7836 // we are just testing the behavior of 7837 // EncoderStreamFactory::CreateEncoderStreams. 7838 ASSERT_EQ(1UL, stream->GetVideoStreams().size()); 7839 EXPECT_EQ(kDefaultMinVideoBitrateBps, 7840 stream->GetVideoStreams()[0].min_bitrate_bps); 7841 7842 // Set a low max bitrate & check that VideoStream.min_bitrate_bps is limited 7843 // by this amount. 7844 parameters = send_channel_->GetRtpSendParameters(last_ssrc_); 7845 int low_max_bitrate_bps = kDefaultMinVideoBitrateBps - 1000; 7846 parameters.encodings[0].max_bitrate_bps = low_max_bitrate_bps; 7847 EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok()); 7848 7849 ASSERT_EQ(1UL, stream->GetVideoStreams().size()); 7850 EXPECT_EQ(low_max_bitrate_bps, stream->GetVideoStreams()[0].min_bitrate_bps); 7851 EXPECT_EQ(low_max_bitrate_bps, stream->GetVideoStreams()[0].max_bitrate_bps); 7852 } 7853 7854 TEST_F(WebRtcVideoChannelTest, 7855 SetHighMinBitrateOverwritesVideoStreamMaxBitrate) { 7856 FakeVideoSendStream* stream = AddSendStream(); 7857 7858 // Note that this is testing the behavior of the FakeVideoSendStream, which 7859 // also calls to CreateEncoderStreams to get the VideoStreams, so essentially 7860 // we are just testing the behavior of 7861 // EncoderStreamFactory::CreateEncoderStreams. 7862 ASSERT_EQ(1UL, stream->GetVideoStreams().size()); 7863 int high_min_bitrate_bps = stream->GetVideoStreams()[0].max_bitrate_bps + 1; 7864 7865 // Set a high min bitrate and check that max_bitrate_bps is adjusted up. 7866 RtpParameters parameters = send_channel_->GetRtpSendParameters(last_ssrc_); 7867 EXPECT_EQ(1UL, parameters.encodings.size()); 7868 parameters.encodings[0].min_bitrate_bps = high_min_bitrate_bps; 7869 EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok()); 7870 7871 ASSERT_EQ(1UL, stream->GetVideoStreams().size()); 7872 EXPECT_EQ(high_min_bitrate_bps, stream->GetVideoStreams()[0].min_bitrate_bps); 7873 EXPECT_EQ(high_min_bitrate_bps, stream->GetVideoStreams()[0].max_bitrate_bps); 7874 } 7875 7876 TEST_F(WebRtcVideoChannelTest, 7877 SetMinBitrateAboveMaxBitrateLimitAdjustsMinBitrateDown) { 7878 send_parameters_.max_bandwidth_bps = 99999; 7879 FakeVideoSendStream* stream = AddSendStream(); 7880 ExpectSetMaxBitrate(send_parameters_.max_bandwidth_bps); 7881 ASSERT_TRUE(send_channel_->SetSenderParameters(send_parameters_)); 7882 ASSERT_EQ(1UL, stream->GetVideoStreams().size()); 7883 EXPECT_EQ(kDefaultMinVideoBitrateBps, 7884 stream->GetVideoStreams()[0].min_bitrate_bps); 7885 EXPECT_EQ(send_parameters_.max_bandwidth_bps, 7886 stream->GetVideoStreams()[0].max_bitrate_bps); 7887 7888 // Set min bitrate above global max bitrate and check that min_bitrate_bps is 7889 // adjusted down. 7890 RtpParameters parameters = send_channel_->GetRtpSendParameters(last_ssrc_); 7891 EXPECT_EQ(1UL, parameters.encodings.size()); 7892 parameters.encodings[0].min_bitrate_bps = 99999 + 1; 7893 EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok()); 7894 ASSERT_EQ(1UL, stream->GetVideoStreams().size()); 7895 EXPECT_EQ(send_parameters_.max_bandwidth_bps, 7896 stream->GetVideoStreams()[0].min_bitrate_bps); 7897 EXPECT_EQ(send_parameters_.max_bandwidth_bps, 7898 stream->GetVideoStreams()[0].max_bitrate_bps); 7899 } 7900 7901 TEST_F(WebRtcVideoChannelTest, SetMaxFramerateOneStream) { 7902 FakeVideoSendStream* stream = AddSendStream(); 7903 7904 RtpParameters parameters = send_channel_->GetRtpSendParameters(last_ssrc_); 7905 EXPECT_EQ(1UL, parameters.encodings.size()); 7906 EXPECT_FALSE(parameters.encodings[0].max_framerate.has_value()); 7907 EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok()); 7908 7909 // Note that this is testing the behavior of the FakeVideoSendStream, which 7910 // also calls to CreateEncoderStreams to get the VideoStreams, so essentially 7911 // we are just testing the behavior of 7912 // EncoderStreamFactory::CreateEncoderStreams. 7913 ASSERT_EQ(1UL, stream->GetVideoStreams().size()); 7914 EXPECT_EQ(kDefaultVideoMaxFramerate, 7915 stream->GetVideoStreams()[0].max_framerate); 7916 7917 // Set max framerate and check that VideoStream.max_framerate is set. 7918 const int kNewMaxFramerate = kDefaultVideoMaxFramerate - 1; 7919 parameters = send_channel_->GetRtpSendParameters(last_ssrc_); 7920 parameters.encodings[0].max_framerate = kNewMaxFramerate; 7921 EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok()); 7922 7923 ASSERT_EQ(1UL, stream->GetVideoStreams().size()); 7924 EXPECT_EQ(kNewMaxFramerate, stream->GetVideoStreams()[0].max_framerate); 7925 } 7926 7927 TEST_F(WebRtcVideoChannelTest, SetNumTemporalLayersForSingleStream) { 7928 FakeVideoSendStream* stream = AddSendStream(); 7929 7930 RtpParameters parameters = send_channel_->GetRtpSendParameters(last_ssrc_); 7931 EXPECT_EQ(1UL, parameters.encodings.size()); 7932 EXPECT_FALSE(parameters.encodings[0].num_temporal_layers.has_value()); 7933 EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok()); 7934 7935 // Note that this is testing the behavior of the FakeVideoSendStream, which 7936 // also calls to CreateEncoderStreams to get the VideoStreams, so essentially 7937 // we are just testing the behavior of 7938 // EncoderStreamFactory::CreateEncoderStreams. 7939 ASSERT_EQ(1UL, stream->GetVideoStreams().size()); 7940 EXPECT_FALSE(stream->GetVideoStreams()[0].num_temporal_layers.has_value()); 7941 7942 // Set temporal layers and check that VideoStream.num_temporal_layers is set. 7943 parameters = send_channel_->GetRtpSendParameters(last_ssrc_); 7944 parameters.encodings[0].num_temporal_layers = 2; 7945 EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok()); 7946 7947 ASSERT_EQ(1UL, stream->GetVideoStreams().size()); 7948 EXPECT_EQ(2UL, stream->GetVideoStreams()[0].num_temporal_layers); 7949 } 7950 7951 TEST_F(WebRtcVideoChannelTest, 7952 CannotSetRtpSendParametersWithIncorrectNumberOfEncodings) { 7953 AddSendStream(); 7954 RtpParameters parameters = send_channel_->GetRtpSendParameters(last_ssrc_); 7955 // Two or more encodings should result in failure. 7956 parameters.encodings.push_back(RtpEncodingParameters()); 7957 EXPECT_FALSE( 7958 send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok()); 7959 // Zero encodings should also fail. 7960 parameters.encodings.clear(); 7961 EXPECT_FALSE( 7962 send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok()); 7963 } 7964 7965 TEST_F(WebRtcVideoChannelTest, 7966 CannotSetSimulcastRtpSendParametersWithIncorrectNumberOfEncodings) { 7967 std::vector<uint32_t> ssrcs = MAKE_VECTOR(kSsrcs3); 7968 StreamParams sp = CreateSimStreamParams("cname", ssrcs); 7969 AddSendStream(sp); 7970 7971 RtpParameters parameters = send_channel_->GetRtpSendParameters(last_ssrc_); 7972 7973 // Additional encodings should result in failure. 7974 parameters.encodings.push_back(RtpEncodingParameters()); 7975 EXPECT_FALSE( 7976 send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok()); 7977 // Zero encodings should also fail. 7978 parameters.encodings.clear(); 7979 EXPECT_FALSE( 7980 send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok()); 7981 } 7982 7983 // Changing the SSRC through RtpParameters is not allowed. 7984 TEST_F(WebRtcVideoChannelTest, CannotSetSsrcInRtpSendParameters) { 7985 AddSendStream(); 7986 RtpParameters parameters = send_channel_->GetRtpSendParameters(last_ssrc_); 7987 parameters.encodings[0].ssrc = 0xdeadbeef; 7988 EXPECT_FALSE( 7989 send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok()); 7990 } 7991 7992 // Tests that when RTCRtpEncodingParameters.bitrate_priority gets set to 7993 // a value <= 0, setting the parameters returns false. 7994 TEST_F(WebRtcVideoChannelTest, SetRtpSendParametersInvalidBitratePriority) { 7995 AddSendStream(); 7996 RtpParameters parameters = send_channel_->GetRtpSendParameters(last_ssrc_); 7997 EXPECT_EQ(1UL, parameters.encodings.size()); 7998 EXPECT_EQ(kDefaultBitratePriority, parameters.encodings[0].bitrate_priority); 7999 8000 parameters.encodings[0].bitrate_priority = 0; 8001 EXPECT_FALSE( 8002 send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok()); 8003 parameters.encodings[0].bitrate_priority = -2; 8004 EXPECT_FALSE( 8005 send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok()); 8006 } 8007 8008 // Tests when the the RTCRtpEncodingParameters.bitrate_priority gets set 8009 // properly on the VideoChannel and propogates down to the video encoder. 8010 TEST_F(WebRtcVideoChannelTest, SetRtpSendParametersPriorityOneStream) { 8011 AddSendStream(); 8012 RtpParameters parameters = send_channel_->GetRtpSendParameters(last_ssrc_); 8013 EXPECT_EQ(1UL, parameters.encodings.size()); 8014 EXPECT_EQ(kDefaultBitratePriority, parameters.encodings[0].bitrate_priority); 8015 8016 // Change the value and set it on the VideoChannel. 8017 double new_bitrate_priority = 2.0; 8018 parameters.encodings[0].bitrate_priority = new_bitrate_priority; 8019 EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok()); 8020 8021 // Verify that the encoding parameters bitrate_priority is set for the 8022 // VideoChannel. 8023 parameters = send_channel_->GetRtpSendParameters(last_ssrc_); 8024 EXPECT_EQ(1UL, parameters.encodings.size()); 8025 EXPECT_EQ(new_bitrate_priority, parameters.encodings[0].bitrate_priority); 8026 8027 // Verify that the new value propagated down to the encoder. 8028 std::vector<FakeVideoSendStream*> video_send_streams = 8029 fake_call_->GetVideoSendStreams(); 8030 EXPECT_EQ(1UL, video_send_streams.size()); 8031 FakeVideoSendStream* video_send_stream = video_send_streams.front(); 8032 // Check that the WebRtcVideoSendStream updated the VideoEncoderConfig 8033 // appropriately. 8034 EXPECT_EQ(new_bitrate_priority, 8035 video_send_stream->GetEncoderConfig().bitrate_priority); 8036 // Check that the vector of VideoStreams also was propagated correctly. Note 8037 // that this is testing the behavior of the FakeVideoSendStream, which mimics 8038 // the calls to CreateEncoderStreams to get the VideoStreams. 8039 EXPECT_EQ(std::optional<double>(new_bitrate_priority), 8040 video_send_stream->GetVideoStreams()[0].bitrate_priority); 8041 } 8042 8043 // Tests that the RTCRtpEncodingParameters.bitrate_priority is set for the 8044 // VideoChannel and the value propogates to the video encoder with all simulcast 8045 // streams. 8046 TEST_F(WebRtcVideoChannelTest, SetRtpSendParametersPrioritySimulcastStreams) { 8047 // Create the stream params with multiple ssrcs for simulcast. 8048 std::vector<uint32_t> ssrcs = MAKE_VECTOR(kSsrcs3); 8049 StreamParams stream_params = CreateSimStreamParams("cname", ssrcs); 8050 AddSendStream(stream_params); 8051 uint32_t primary_ssrc = stream_params.first_ssrc(); 8052 8053 // Using the FrameForwarder, we manually send a full size 8054 // frame. This creates multiple VideoStreams for all simulcast layers when 8055 // reconfiguring, and allows us to test this behavior. 8056 FrameForwarder frame_forwarder; 8057 VideoOptions options; 8058 EXPECT_TRUE( 8059 send_channel_->SetVideoSend(primary_ssrc, &options, &frame_forwarder)); 8060 send_channel_->SetSend(true); 8061 frame_forwarder.IncomingCapturedFrame(frame_source_.GetFrame( 8062 1920, 1080, VideoRotation::kVideoRotation_0, kNumMicrosecsPerSec / 30)); 8063 8064 // Get and set the rtp encoding parameters. 8065 RtpParameters parameters = send_channel_->GetRtpSendParameters(primary_ssrc); 8066 EXPECT_EQ(kNumSimulcastStreams, parameters.encodings.size()); 8067 EXPECT_EQ(kDefaultBitratePriority, parameters.encodings[0].bitrate_priority); 8068 // Change the value and set it on the VideoChannel. 8069 double new_bitrate_priority = 2.0; 8070 parameters.encodings[0].bitrate_priority = new_bitrate_priority; 8071 EXPECT_TRUE( 8072 send_channel_->SetRtpSendParameters(primary_ssrc, parameters).ok()); 8073 8074 // Verify that the encoding parameters priority is set on the VideoChannel. 8075 parameters = send_channel_->GetRtpSendParameters(primary_ssrc); 8076 EXPECT_EQ(kNumSimulcastStreams, parameters.encodings.size()); 8077 EXPECT_EQ(new_bitrate_priority, parameters.encodings[0].bitrate_priority); 8078 8079 // Verify that the new value propagated down to the encoder. 8080 std::vector<FakeVideoSendStream*> video_send_streams = 8081 fake_call_->GetVideoSendStreams(); 8082 EXPECT_EQ(1UL, video_send_streams.size()); 8083 FakeVideoSendStream* video_send_stream = video_send_streams.front(); 8084 // Check that the WebRtcVideoSendStream updated the VideoEncoderConfig 8085 // appropriately. 8086 EXPECT_EQ(kNumSimulcastStreams, 8087 video_send_stream->GetEncoderConfig().number_of_streams); 8088 EXPECT_EQ(new_bitrate_priority, 8089 video_send_stream->GetEncoderConfig().bitrate_priority); 8090 // Check that the vector of VideoStreams also propagated correctly. The 8091 // FakeVideoSendStream calls CreateEncoderStreams, and we are testing that 8092 // these are created appropriately for the simulcast case. 8093 EXPECT_EQ(kNumSimulcastStreams, video_send_stream->GetVideoStreams().size()); 8094 EXPECT_EQ(std::optional<double>(new_bitrate_priority), 8095 video_send_stream->GetVideoStreams()[0].bitrate_priority); 8096 // Since we are only setting bitrate priority per-sender, the other 8097 // VideoStreams should have a bitrate priority of 0. 8098 EXPECT_EQ(std::nullopt, 8099 video_send_stream->GetVideoStreams()[1].bitrate_priority); 8100 EXPECT_EQ(std::nullopt, 8101 video_send_stream->GetVideoStreams()[2].bitrate_priority); 8102 EXPECT_TRUE(send_channel_->SetVideoSend(primary_ssrc, nullptr, nullptr)); 8103 } 8104 8105 struct ScaleResolutionDownByTestParameters { 8106 std::string field_trials; 8107 Resolution resolution; 8108 std::vector<std::optional<double>> scale_resolution_down_by; 8109 std::vector<Resolution> expected_resolutions; 8110 }; 8111 8112 class WebRtcVideoChannelScaleResolutionDownByTest 8113 : public WebRtcVideoChannelTest, 8114 public ::testing::WithParamInterface< 8115 std::tuple<ScaleResolutionDownByTestParameters, 8116 /*codec_name=*/std::string>> {}; 8117 8118 TEST_P(WebRtcVideoChannelScaleResolutionDownByTest, ScaleResolutionDownBy) { 8119 ScaleResolutionDownByTestParameters test_params = std::get<0>(GetParam()); 8120 std::string codec_name = std::get<1>(GetParam()); 8121 field_trials_.Merge(FieldTrials(test_params.field_trials)); 8122 ResetTest(); 8123 // Set up WebRtcVideoChannel for 3-layer simulcast. 8124 encoder_factory_->AddSupportedVideoCodecType(codec_name); 8125 VideoSenderParameters parameters; 8126 Codec codec = CreateVideoCodec(codec_name); 8127 // Codec ID does not matter, but must be valid. 8128 codec.id = 123; 8129 parameters.codecs.push_back(codec); 8130 ASSERT_TRUE(send_channel_->SetSenderParameters(parameters)); 8131 FakeVideoSendStream* stream = SetUpSimulcast(true, /*with_rtx=*/false); 8132 FrameForwarder frame_forwarder; 8133 EXPECT_TRUE(send_channel_->SetVideoSend(last_ssrc_, /*options=*/nullptr, 8134 &frame_forwarder)); 8135 send_channel_->SetSend(true); 8136 8137 // Set `scale_resolution_down_by`'s. 8138 auto rtp_parameters = send_channel_->GetRtpSendParameters(last_ssrc_); 8139 ASSERT_EQ(rtp_parameters.encodings.size(), 3u); 8140 rtp_parameters.encodings[0].scale_resolution_down_by = 8141 test_params.scale_resolution_down_by[0]; 8142 rtp_parameters.encodings[1].scale_resolution_down_by = 8143 test_params.scale_resolution_down_by[1]; 8144 rtp_parameters.encodings[2].scale_resolution_down_by = 8145 test_params.scale_resolution_down_by[2]; 8146 const auto result = 8147 send_channel_->SetRtpSendParameters(last_ssrc_, rtp_parameters); 8148 ASSERT_TRUE(result.ok()); 8149 8150 // Use a capture resolution whose width and height are not divisible by 2^3. 8151 // (See field trial set at the top of the test.) 8152 FakeFrameSource frame_source(test_params.resolution.width, 8153 test_params.resolution.height, 8154 kNumMicrosecsPerSec / 30); 8155 frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame()); 8156 8157 // Ensure the scaling is correct. 8158 const auto streams = stream->GetVideoStreams(); 8159 ASSERT_EQ(streams.size(), 3u); 8160 EXPECT_EQ(static_cast<int>(streams[0].width), 8161 test_params.expected_resolutions[0].width); 8162 EXPECT_EQ(static_cast<int>(streams[0].height), 8163 test_params.expected_resolutions[0].height); 8164 EXPECT_EQ(static_cast<int>(streams[1].width), 8165 test_params.expected_resolutions[1].width); 8166 EXPECT_EQ(static_cast<int>(streams[1].height), 8167 test_params.expected_resolutions[1].height); 8168 EXPECT_EQ(static_cast<int>(streams[2].width), 8169 test_params.expected_resolutions[2].width); 8170 EXPECT_EQ(static_cast<int>(streams[2].height), 8171 test_params.expected_resolutions[2].height); 8172 8173 // Tear down. 8174 EXPECT_TRUE(send_channel_->SetVideoSend(last_ssrc_, nullptr, nullptr)); 8175 } 8176 8177 INSTANTIATE_TEST_SUITE_P( 8178 All, 8179 WebRtcVideoChannelScaleResolutionDownByTest, 8180 Combine(Values( 8181 // Try layers in natural order (smallest to largest). 8182 ScaleResolutionDownByTestParameters{ 8183 .resolution = {.width = 1280, .height = 720}, 8184 .scale_resolution_down_by = {4, 2, 1}, 8185 .expected_resolutions = {{.width = 320, .height = 180}, 8186 {.width = 640, .height = 360}, 8187 {.width = 1280, .height = 720}}}, 8188 // Try layers in reverse natural order (largest to smallest). 8189 ScaleResolutionDownByTestParameters{ 8190 .resolution = {.width = 1280, .height = 720}, 8191 .scale_resolution_down_by = {1, 2, 4}, 8192 .expected_resolutions = {{.width = 1280, .height = 720}, 8193 {.width = 640, .height = 360}, 8194 {.width = 320, .height = 180}}}, 8195 // Try layers in mixed order. 8196 ScaleResolutionDownByTestParameters{ 8197 .resolution = {.width = 1280, .height = 720}, 8198 .scale_resolution_down_by = {10, 2, 4}, 8199 .expected_resolutions = {{.width = 128, .height = 72}, 8200 {.width = 640, .height = 360}, 8201 {.width = 320, .height = 180}}}, 8202 // Try with a missing scale setting, defaults to 1.0 if any 8203 // other is set. 8204 ScaleResolutionDownByTestParameters{ 8205 .resolution = {.width = 1280, .height = 720}, 8206 .scale_resolution_down_by = {1, std::nullopt, 4}, 8207 .expected_resolutions = {{.width = 1280, .height = 720}, 8208 {.width = 1280, .height = 720}, 8209 {.width = 320, .height = 180}}}, 8210 // Odd resolution. Request alignment by 8 to get the resolution 8211 // of the smallest layer multiple by 2. 8212 ScaleResolutionDownByTestParameters{ 8213 .field_trials = 8214 "WebRTC-NormalizeSimulcastResolution/Enabled-3/", 8215 .resolution = {.width = 2007, .height = 1207}, 8216 .scale_resolution_down_by = {1, 2, 4}, 8217 .expected_resolutions = {{.width = 2000, .height = 1200}, 8218 {.width = 1000, .height = 600}, 8219 {.width = 500, .height = 300}}}), 8220 Values(kVp8CodecName, kH264CodecName))); 8221 8222 TEST_F(WebRtcVideoChannelTest, GetAndSetRtpSendParametersMaxFramerate) { 8223 SetUpSimulcast(true, /*with_rtx=*/false); 8224 8225 // Get and set the rtp encoding parameters. 8226 RtpParameters parameters = send_channel_->GetRtpSendParameters(last_ssrc_); 8227 EXPECT_EQ(kNumSimulcastStreams, parameters.encodings.size()); 8228 for (const auto& encoding : parameters.encodings) { 8229 EXPECT_FALSE(encoding.max_framerate); 8230 } 8231 8232 // Change the value and set it on the VideoChannel. 8233 parameters.encodings[0].max_framerate = 10; 8234 parameters.encodings[1].max_framerate = 20; 8235 parameters.encodings[2].max_framerate = 25; 8236 EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok()); 8237 8238 // Verify that the bitrates are set on the VideoChannel. 8239 parameters = send_channel_->GetRtpSendParameters(last_ssrc_); 8240 EXPECT_EQ(kNumSimulcastStreams, parameters.encodings.size()); 8241 EXPECT_EQ(10, parameters.encodings[0].max_framerate); 8242 EXPECT_EQ(20, parameters.encodings[1].max_framerate); 8243 EXPECT_EQ(25, parameters.encodings[2].max_framerate); 8244 } 8245 8246 TEST_F(WebRtcVideoChannelTest, 8247 SetRtpSendParametersNumTemporalLayersFailsForInvalidRange) { 8248 SetUpSimulcast(true, /*with_rtx=*/false); 8249 8250 // Get and set the rtp encoding parameters. 8251 RtpParameters parameters = send_channel_->GetRtpSendParameters(last_ssrc_); 8252 EXPECT_EQ(kNumSimulcastStreams, parameters.encodings.size()); 8253 8254 // Num temporal layers should be in the range [1, kMaxTemporalStreams]. 8255 parameters.encodings[0].num_temporal_layers = 0; 8256 EXPECT_EQ(RTCErrorType::INVALID_RANGE, 8257 send_channel_->SetRtpSendParameters(last_ssrc_, parameters).type()); 8258 parameters.encodings[0].num_temporal_layers = kMaxTemporalStreams + 1; 8259 EXPECT_EQ(RTCErrorType::INVALID_RANGE, 8260 send_channel_->SetRtpSendParameters(last_ssrc_, parameters).type()); 8261 } 8262 8263 TEST_F(WebRtcVideoChannelTest, GetAndSetRtpSendParametersNumTemporalLayers) { 8264 SetUpSimulcast(true, /*with_rtx=*/false); 8265 8266 // Get and set the rtp encoding parameters. 8267 RtpParameters parameters = send_channel_->GetRtpSendParameters(last_ssrc_); 8268 EXPECT_EQ(kNumSimulcastStreams, parameters.encodings.size()); 8269 for (const auto& encoding : parameters.encodings) 8270 EXPECT_FALSE(encoding.num_temporal_layers); 8271 8272 // Change the value and set it on the VideoChannel. 8273 parameters.encodings[0].num_temporal_layers = 3; 8274 parameters.encodings[1].num_temporal_layers = 3; 8275 parameters.encodings[2].num_temporal_layers = 3; 8276 EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok()); 8277 8278 // Verify that the number of temporal layers are set on the VideoChannel. 8279 parameters = send_channel_->GetRtpSendParameters(last_ssrc_); 8280 EXPECT_EQ(kNumSimulcastStreams, parameters.encodings.size()); 8281 EXPECT_EQ(3, parameters.encodings[0].num_temporal_layers); 8282 EXPECT_EQ(3, parameters.encodings[1].num_temporal_layers); 8283 EXPECT_EQ(3, parameters.encodings[2].num_temporal_layers); 8284 } 8285 8286 TEST_F(WebRtcVideoChannelTest, NumTemporalLayersPropagatedToEncoder) { 8287 FakeVideoSendStream* stream = SetUpSimulcast(true, /*with_rtx=*/false); 8288 8289 // Send a full size frame so all simulcast layers are used when reconfiguring. 8290 FrameForwarder frame_forwarder; 8291 VideoOptions options; 8292 EXPECT_TRUE( 8293 send_channel_->SetVideoSend(last_ssrc_, &options, &frame_forwarder)); 8294 send_channel_->SetSend(true); 8295 frame_forwarder.IncomingCapturedFrame(frame_source_.GetFrame()); 8296 8297 // Get and set the rtp encoding parameters. 8298 // Change the value and set it on the VideoChannel. 8299 RtpParameters parameters = send_channel_->GetRtpSendParameters(last_ssrc_); 8300 EXPECT_EQ(kNumSimulcastStreams, parameters.encodings.size()); 8301 parameters.encodings[0].num_temporal_layers = 3; 8302 parameters.encodings[1].num_temporal_layers = 2; 8303 parameters.encodings[2].num_temporal_layers = 1; 8304 EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok()); 8305 8306 // Verify that the new value is propagated down to the encoder. 8307 // Check that WebRtcVideoSendStream updates VideoEncoderConfig correctly. 8308 EXPECT_EQ(2, stream->num_encoder_reconfigurations()); 8309 VideoEncoderConfig encoder_config = stream->GetEncoderConfig().Copy(); 8310 EXPECT_EQ(kNumSimulcastStreams, encoder_config.number_of_streams); 8311 EXPECT_EQ(kNumSimulcastStreams, encoder_config.simulcast_layers.size()); 8312 EXPECT_EQ(3UL, encoder_config.simulcast_layers[0].num_temporal_layers); 8313 EXPECT_EQ(2UL, encoder_config.simulcast_layers[1].num_temporal_layers); 8314 EXPECT_EQ(1UL, encoder_config.simulcast_layers[2].num_temporal_layers); 8315 8316 // FakeVideoSendStream calls CreateEncoderStreams, test that the vector of 8317 // VideoStreams are created appropriately for the simulcast case. 8318 EXPECT_EQ(kNumSimulcastStreams, stream->GetVideoStreams().size()); 8319 EXPECT_EQ(3UL, stream->GetVideoStreams()[0].num_temporal_layers); 8320 EXPECT_EQ(2UL, stream->GetVideoStreams()[1].num_temporal_layers); 8321 EXPECT_EQ(1UL, stream->GetVideoStreams()[2].num_temporal_layers); 8322 8323 // No parameter changed, encoder should not be reconfigured. 8324 EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok()); 8325 EXPECT_EQ(2, stream->num_encoder_reconfigurations()); 8326 8327 EXPECT_TRUE(send_channel_->SetVideoSend(last_ssrc_, nullptr, nullptr)); 8328 } 8329 8330 TEST_F(WebRtcVideoChannelTest, 8331 DefaultValuePropagatedToEncoderForUnsetNumTemporalLayers) { 8332 const size_t kDefaultNumTemporalLayers = 3; 8333 FakeVideoSendStream* stream = SetUpSimulcast(true, /*with_rtx=*/false); 8334 8335 // Send a full size frame so all simulcast layers are used when reconfiguring. 8336 FrameForwarder frame_forwarder; 8337 VideoOptions options; 8338 EXPECT_TRUE( 8339 send_channel_->SetVideoSend(last_ssrc_, &options, &frame_forwarder)); 8340 send_channel_->SetSend(true); 8341 frame_forwarder.IncomingCapturedFrame(frame_source_.GetFrame()); 8342 8343 // Change rtp encoding parameters. 8344 RtpParameters parameters = send_channel_->GetRtpSendParameters(last_ssrc_); 8345 EXPECT_EQ(kNumSimulcastStreams, parameters.encodings.size()); 8346 parameters.encodings[0].num_temporal_layers = 2; 8347 parameters.encodings[2].num_temporal_layers = 1; 8348 EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok()); 8349 8350 // Verify that no value is propagated down to the encoder. 8351 VideoEncoderConfig encoder_config = stream->GetEncoderConfig().Copy(); 8352 EXPECT_EQ(kNumSimulcastStreams, encoder_config.number_of_streams); 8353 EXPECT_EQ(kNumSimulcastStreams, encoder_config.simulcast_layers.size()); 8354 EXPECT_EQ(2UL, encoder_config.simulcast_layers[0].num_temporal_layers); 8355 EXPECT_FALSE(encoder_config.simulcast_layers[1].num_temporal_layers); 8356 EXPECT_EQ(1UL, encoder_config.simulcast_layers[2].num_temporal_layers); 8357 8358 // FakeVideoSendStream calls CreateEncoderStreams, test that the vector of 8359 // VideoStreams are created appropriately for the simulcast case. 8360 EXPECT_EQ(kNumSimulcastStreams, stream->GetVideoStreams().size()); 8361 EXPECT_EQ(2UL, stream->GetVideoStreams()[0].num_temporal_layers); 8362 EXPECT_EQ(kDefaultNumTemporalLayers, 8363 stream->GetVideoStreams()[1].num_temporal_layers); 8364 EXPECT_EQ(1UL, stream->GetVideoStreams()[2].num_temporal_layers); 8365 8366 EXPECT_TRUE(send_channel_->SetVideoSend(last_ssrc_, nullptr, nullptr)); 8367 } 8368 8369 TEST_F(WebRtcVideoChannelTest, 8370 DefaultValuePropagatedToEncoderForUnsetFramerate) { 8371 const std::vector<VideoStream> kDefault = GetSimulcastBitrates720p(); 8372 FakeVideoSendStream* stream = SetUpSimulcast(true, /*with_rtx=*/false); 8373 8374 // Send a full size frame so all simulcast layers are used when reconfiguring. 8375 FrameForwarder frame_forwarder; 8376 VideoOptions options; 8377 EXPECT_TRUE( 8378 send_channel_->SetVideoSend(last_ssrc_, &options, &frame_forwarder)); 8379 send_channel_->SetSend(true); 8380 frame_forwarder.IncomingCapturedFrame(frame_source_.GetFrame()); 8381 8382 // Get and set the rtp encoding parameters. 8383 // Change the value and set it on the VideoChannel. 8384 RtpParameters parameters = send_channel_->GetRtpSendParameters(last_ssrc_); 8385 EXPECT_EQ(kNumSimulcastStreams, parameters.encodings.size()); 8386 parameters.encodings[0].max_framerate = 15; 8387 parameters.encodings[2].max_framerate = 20; 8388 EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok()); 8389 8390 // Verify that the new value propagated down to the encoder. 8391 // Check that WebRtcVideoSendStream updates VideoEncoderConfig correctly. 8392 VideoEncoderConfig encoder_config = stream->GetEncoderConfig().Copy(); 8393 EXPECT_EQ(kNumSimulcastStreams, encoder_config.number_of_streams); 8394 EXPECT_EQ(kNumSimulcastStreams, encoder_config.simulcast_layers.size()); 8395 EXPECT_EQ(15, encoder_config.simulcast_layers[0].max_framerate); 8396 EXPECT_EQ(-1, encoder_config.simulcast_layers[1].max_framerate); 8397 EXPECT_EQ(20, encoder_config.simulcast_layers[2].max_framerate); 8398 8399 // FakeVideoSendStream calls CreateEncoderStreams, test that the vector of 8400 // VideoStreams are created appropriately for the simulcast case. 8401 // The maximum `max_framerate` is used, kDefaultVideoMaxFramerate: 60. 8402 EXPECT_EQ(kNumSimulcastStreams, stream->GetVideoStreams().size()); 8403 EXPECT_EQ(15, stream->GetVideoStreams()[0].max_framerate); 8404 EXPECT_EQ(kDefaultVideoMaxFramerate, 8405 stream->GetVideoStreams()[1].max_framerate); 8406 EXPECT_EQ(20, stream->GetVideoStreams()[2].max_framerate); 8407 8408 EXPECT_TRUE(send_channel_->SetVideoSend(last_ssrc_, nullptr, nullptr)); 8409 } 8410 8411 TEST_F(WebRtcVideoChannelTest, FallbackForUnsetOrUnsupportedScalabilityMode) { 8412 const absl::InlinedVector<ScalabilityMode, kScalabilityModeCount> 8413 kSupportedModes = {ScalabilityMode::kL1T1, ScalabilityMode::kL1T2, 8414 ScalabilityMode::kL1T3}; 8415 8416 encoder_factory_->AddSupportedVideoCodec( 8417 SdpVideoFormat("VP8", CodecParameterMap(), kSupportedModes)); 8418 8419 FakeVideoSendStream* stream = SetUpSimulcast(true, /*with_rtx=*/false); 8420 8421 // Send a full size frame so all simulcast layers are used when reconfiguring. 8422 FrameForwarder frame_forwarder; 8423 VideoOptions options; 8424 EXPECT_TRUE( 8425 send_channel_->SetVideoSend(last_ssrc_, &options, &frame_forwarder)); 8426 send_channel_->SetSend(true); 8427 frame_forwarder.IncomingCapturedFrame(frame_source_.GetFrame()); 8428 8429 // Set scalability mode. 8430 RtpParameters parameters = send_channel_->GetRtpSendParameters(last_ssrc_); 8431 EXPECT_EQ(kNumSimulcastStreams, parameters.encodings.size()); 8432 parameters.encodings[0].scalability_mode = std::nullopt; 8433 parameters.encodings[1].scalability_mode = "L1T3"; // Supported. 8434 parameters.encodings[2].scalability_mode = "L3T3"; // Unsupported. 8435 EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok()); 8436 8437 // Verify that the new value is propagated down to the encoder. 8438 // Check that WebRtcVideoSendStream updates VideoEncoderConfig correctly. 8439 const std::optional<ScalabilityMode> kDefaultScalabilityMode = 8440 ScalabilityModeFromString(kDefaultScalabilityModeStr); 8441 EXPECT_EQ(2, stream->num_encoder_reconfigurations()); 8442 VideoEncoderConfig encoder_config = stream->GetEncoderConfig().Copy(); 8443 EXPECT_EQ(kNumSimulcastStreams, encoder_config.number_of_streams); 8444 EXPECT_THAT( 8445 encoder_config.simulcast_layers, 8446 ElementsAre( 8447 Field(&VideoStream::scalability_mode, kDefaultScalabilityMode), 8448 Field(&VideoStream::scalability_mode, ScalabilityMode::kL1T3), 8449 Field(&VideoStream::scalability_mode, kDefaultScalabilityMode))); 8450 8451 // FakeVideoSendStream calls CreateEncoderStreams, test that the vector of 8452 // VideoStreams are created appropriately for the simulcast case. 8453 EXPECT_THAT( 8454 stream->GetVideoStreams(), 8455 ElementsAre( 8456 Field(&VideoStream::scalability_mode, kDefaultScalabilityMode), 8457 Field(&VideoStream::scalability_mode, ScalabilityMode::kL1T3), 8458 Field(&VideoStream::scalability_mode, kDefaultScalabilityMode))); 8459 8460 // GetParameters. 8461 parameters = send_channel_->GetRtpSendParameters(last_ssrc_); 8462 EXPECT_THAT( 8463 parameters.encodings, 8464 ElementsAre(Field(&RtpEncodingParameters::scalability_mode, 8465 kDefaultScalabilityModeStr), 8466 Field(&RtpEncodingParameters::scalability_mode, "L1T3"), 8467 Field(&RtpEncodingParameters::scalability_mode, 8468 kDefaultScalabilityModeStr))); 8469 8470 // No parameters changed, encoder should not be reconfigured. 8471 EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok()); 8472 EXPECT_EQ(2, stream->num_encoder_reconfigurations()); 8473 8474 EXPECT_TRUE(send_channel_->SetVideoSend(last_ssrc_, nullptr, nullptr)); 8475 } 8476 8477 #ifdef RTC_ENABLE_H265 8478 TEST_F( 8479 WebRtcVideoChannelTest, 8480 NoLayeringValueUsedIfModeIsUnsetOrUnsupportedByH265AndDefaultUnsupported) { 8481 const absl::InlinedVector<ScalabilityMode, kScalabilityModeCount> 8482 kSupportedModes = {ScalabilityMode::kL1T1, ScalabilityMode::kL1T3}; 8483 8484 encoder_factory_->AddSupportedVideoCodec( 8485 SdpVideoFormat("H265", CodecParameterMap(), kSupportedModes)); 8486 VideoSenderParameters send_parameters; 8487 send_parameters.codecs.push_back(GetEngineCodec("H265")); 8488 EXPECT_TRUE(send_channel_->SetSenderParameters(send_parameters)); 8489 8490 FakeVideoSendStream* stream = SetUpSimulcast(true, /*with_rtx=*/false); 8491 8492 // Send a full size frame so all simulcast layers are used when reconfiguring. 8493 FrameForwarder frame_forwarder; 8494 VideoOptions options; 8495 EXPECT_TRUE( 8496 send_channel_->SetVideoSend(last_ssrc_, &options, &frame_forwarder)); 8497 send_channel_->SetSend(true); 8498 frame_forwarder.IncomingCapturedFrame(frame_source_.GetFrame()); 8499 8500 // Set scalability mode. 8501 RtpParameters parameters = send_channel_->GetRtpSendParameters(last_ssrc_); 8502 EXPECT_EQ(kNumSimulcastStreams, parameters.encodings.size()); 8503 parameters.encodings[0].scalability_mode = std::nullopt; 8504 parameters.encodings[1].scalability_mode = "L1T3"; // Supported. 8505 parameters.encodings[2].scalability_mode = "L3T3"; // Unsupported. 8506 EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok()); 8507 8508 // Verify that the new value is propagated down to the encoder. 8509 // Check that WebRtcVideoSendStream updates VideoEncoderConfig correctly. 8510 const std::optional<ScalabilityMode> kDefaultScalabilityMode = 8511 ScalabilityModeFromString(kNoLayeringScalabilityModeStr); 8512 EXPECT_EQ(2, stream->num_encoder_reconfigurations()); 8513 VideoEncoderConfig encoder_config = stream->GetEncoderConfig().Copy(); 8514 EXPECT_EQ(kNumSimulcastStreams, encoder_config.number_of_streams); 8515 EXPECT_THAT( 8516 encoder_config.simulcast_layers, 8517 ElementsAre( 8518 Field(&VideoStream::scalability_mode, kDefaultScalabilityMode), 8519 Field(&VideoStream::scalability_mode, ScalabilityMode::kL1T3), 8520 Field(&VideoStream::scalability_mode, kDefaultScalabilityMode))); 8521 8522 // FakeVideoSendStream calls CreateEncoderStreams, test that the vector of 8523 // VideoStreams are created appropriately for the simulcast case. 8524 EXPECT_THAT( 8525 stream->GetVideoStreams(), 8526 ElementsAre( 8527 Field(&VideoStream::scalability_mode, kDefaultScalabilityMode), 8528 Field(&VideoStream::scalability_mode, ScalabilityMode::kL1T3), 8529 Field(&VideoStream::scalability_mode, kDefaultScalabilityMode))); 8530 8531 // GetParameters. 8532 parameters = send_channel_->GetRtpSendParameters(last_ssrc_); 8533 EXPECT_THAT( 8534 parameters.encodings, 8535 ElementsAre(Field(&RtpEncodingParameters::scalability_mode, 8536 kNoLayeringScalabilityModeStr), 8537 Field(&RtpEncodingParameters::scalability_mode, "L1T3"), 8538 Field(&RtpEncodingParameters::scalability_mode, 8539 kNoLayeringScalabilityModeStr))); 8540 8541 // No parameters changed, encoder should not be reconfigured. 8542 EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok()); 8543 EXPECT_EQ(2, stream->num_encoder_reconfigurations()); 8544 8545 EXPECT_TRUE(send_channel_->SetVideoSend(last_ssrc_, nullptr, nullptr)); 8546 } 8547 8548 TEST_F(WebRtcVideoChannelTest, 8549 SetRtpParametersForH265ShouldSucceedIgnoreLowerLevelId) { 8550 encoder_factory_->AddSupportedVideoCodec( 8551 SdpVideoFormat("H265", 8552 {{"profile-id", "1"}, 8553 {"tier-flag", "0"}, 8554 {"level-id", "156"}, 8555 {"tx-mode", "SRST"}}, 8556 {ScalabilityMode::kL1T1})); 8557 VideoSenderParameters send_parameters; 8558 send_parameters.codecs.push_back(GetEngineCodec("H265")); 8559 for (auto& codec : send_parameters.codecs) { 8560 if (absl::EqualsIgnoreCase(codec.name, "H265")) { 8561 codec.params["level-id"] = "156"; 8562 } 8563 } 8564 8565 EXPECT_TRUE(send_channel_->SetSenderParameters(send_parameters)); 8566 FakeVideoSendStream* stream = AddSendStream(); 8567 ASSERT_TRUE(stream); 8568 8569 FrameForwarder frame_forwarder; 8570 VideoOptions options; 8571 EXPECT_TRUE( 8572 send_channel_->SetVideoSend(last_ssrc_, &options, &frame_forwarder)); 8573 send_channel_->SetSend(true); 8574 frame_forwarder.IncomingCapturedFrame(frame_source_.GetFrame()); 8575 8576 RtpParameters parameters = send_channel_->GetRtpSendParameters(last_ssrc_); 8577 8578 RtpCodecParameters matched_codec; 8579 for (const auto& codec : parameters.codecs) { 8580 if (absl::EqualsIgnoreCase(codec.name, "H265")) { 8581 EXPECT_EQ(codec.parameters.at("level-id"), "156"); 8582 matched_codec = codec; 8583 } 8584 } 8585 8586 FakeVideoSendStream* send_stream = fake_call_->GetVideoSendStreams().front(); 8587 ASSERT_TRUE(send_stream); 8588 VideoEncoderConfig encoder_config = send_stream->GetEncoderConfig().Copy(); 8589 EXPECT_EQ(encoder_config.video_format.parameters.at("level-id"), "156"); 8590 8591 // Set the level-id parameter to lower than the negotiated codec level-id. 8592 EXPECT_EQ(1u, parameters.encodings.size()); 8593 matched_codec.parameters["level-id"] = "120"; 8594 parameters.encodings[0].codec = matched_codec; 8595 8596 EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok()); 8597 RtpParameters parameters2 = send_channel_->GetRtpSendParameters(last_ssrc_); 8598 8599 for (const auto& codec : parameters2.codecs) { 8600 if (absl::EqualsIgnoreCase(codec.name, "H265")) { 8601 EXPECT_EQ(codec.parameters.at("level-id"), "156"); 8602 } 8603 } 8604 8605 FakeVideoSendStream* send_stream2 = fake_call_->GetVideoSendStreams().front(); 8606 ASSERT_TRUE(send_stream2); 8607 VideoEncoderConfig encoder_config2 = send_stream2->GetEncoderConfig().Copy(); 8608 EXPECT_EQ(encoder_config2.video_format.parameters.at("level-id"), "156"); 8609 8610 EXPECT_TRUE(send_channel_->SetVideoSend(last_ssrc_, nullptr, nullptr)); 8611 } 8612 8613 TEST_F(WebRtcVideoChannelTest, 8614 SetRtpParametersForH265WithSameLevelIdShouldSucceed) { 8615 encoder_factory_->AddSupportedVideoCodec( 8616 SdpVideoFormat("H265", 8617 {{"profile-id", "1"}, 8618 {"tier-flag", "0"}, 8619 {"level-id", "156"}, 8620 {"tx-mode", "SRST"}}, 8621 {ScalabilityMode::kL1T1})); 8622 VideoSenderParameters send_parameters; 8623 send_parameters.codecs.push_back(GetEngineCodec("H265")); 8624 for (auto& codec : send_parameters.codecs) { 8625 if (absl::EqualsIgnoreCase(codec.name, "H265")) { 8626 codec.params["level-id"] = "156"; 8627 } 8628 } 8629 8630 EXPECT_TRUE(send_channel_->SetSenderParameters(send_parameters)); 8631 FakeVideoSendStream* stream = AddSendStream(); 8632 ASSERT_TRUE(stream); 8633 8634 FrameForwarder frame_forwarder; 8635 VideoOptions options; 8636 EXPECT_TRUE( 8637 send_channel_->SetVideoSend(last_ssrc_, &options, &frame_forwarder)); 8638 send_channel_->SetSend(true); 8639 frame_forwarder.IncomingCapturedFrame(frame_source_.GetFrame()); 8640 8641 RtpParameters parameters = send_channel_->GetRtpSendParameters(last_ssrc_); 8642 8643 RtpCodecParameters matched_codec; 8644 for (const auto& codec : parameters.codecs) { 8645 if (absl::EqualsIgnoreCase(codec.name, "H265")) { 8646 EXPECT_EQ(codec.parameters.at("level-id"), "156"); 8647 matched_codec = codec; 8648 } 8649 } 8650 8651 FakeVideoSendStream* send_stream = fake_call_->GetVideoSendStreams().front(); 8652 ASSERT_TRUE(send_stream); 8653 VideoEncoderConfig encoder_config = send_stream->GetEncoderConfig().Copy(); 8654 EXPECT_EQ(encoder_config.video_format.parameters.at("level-id"), "156"); 8655 8656 // Set the level-id parameter to the same as the negotiated codec level-id. 8657 EXPECT_EQ(1u, parameters.encodings.size()); 8658 matched_codec.parameters["level-id"] = "156"; 8659 parameters.encodings[0].codec = matched_codec; 8660 8661 EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok()); 8662 8663 RtpParameters parameters2 = send_channel_->GetRtpSendParameters(last_ssrc_); 8664 8665 for (const auto& codec : parameters2.codecs) { 8666 if (absl::EqualsIgnoreCase(codec.name, "H265")) { 8667 EXPECT_EQ(codec.parameters.at("level-id"), "156"); 8668 matched_codec = codec; 8669 } 8670 } 8671 8672 FakeVideoSendStream* send_stream2 = fake_call_->GetVideoSendStreams().front(); 8673 ASSERT_TRUE(send_stream2); 8674 VideoEncoderConfig encoder_config2 = send_stream2->GetEncoderConfig().Copy(); 8675 EXPECT_EQ(encoder_config2.video_format.parameters.at("level-id"), "156"); 8676 8677 EXPECT_TRUE(send_channel_->SetVideoSend(last_ssrc_, nullptr, nullptr)); 8678 } 8679 8680 TEST_F(WebRtcVideoChannelTest, 8681 SetRtpParametersForH265ShouldSucceedIgnoreHigherLevelId) { 8682 encoder_factory_->AddSupportedVideoCodec( 8683 SdpVideoFormat("H265", 8684 {{"profile-id", "1"}, 8685 {"tier-flag", "0"}, 8686 {"level-id", "156"}, 8687 {"tx-mode", "SRST"}}, 8688 {ScalabilityMode::kL1T1})); 8689 VideoSenderParameters send_parameters; 8690 send_parameters.codecs.push_back(GetEngineCodec("H265")); 8691 for (auto& codec : send_parameters.codecs) { 8692 if (absl::EqualsIgnoreCase(codec.name, "H265")) { 8693 codec.params["level-id"] = "156"; 8694 } 8695 } 8696 8697 EXPECT_TRUE(send_channel_->SetSenderParameters(send_parameters)); 8698 FakeVideoSendStream* stream = AddSendStream(); 8699 ASSERT_TRUE(stream); 8700 8701 FrameForwarder frame_forwarder; 8702 VideoOptions options; 8703 EXPECT_TRUE( 8704 send_channel_->SetVideoSend(last_ssrc_, &options, &frame_forwarder)); 8705 send_channel_->SetSend(true); 8706 frame_forwarder.IncomingCapturedFrame(frame_source_.GetFrame()); 8707 8708 RtpParameters parameters = send_channel_->GetRtpSendParameters(last_ssrc_); 8709 8710 RtpCodecParameters matched_codec; 8711 for (const auto& codec : parameters.codecs) { 8712 if (absl::EqualsIgnoreCase(codec.name, "H265")) { 8713 EXPECT_EQ(codec.parameters.at("level-id"), "156"); 8714 matched_codec = codec; 8715 } 8716 } 8717 8718 FakeVideoSendStream* send_stream = fake_call_->GetVideoSendStreams().front(); 8719 ASSERT_TRUE(send_stream); 8720 VideoEncoderConfig encoder_config = send_stream->GetEncoderConfig().Copy(); 8721 EXPECT_EQ(encoder_config.video_format.parameters.at("level-id"), "156"); 8722 8723 // Set the level-id parameter to higher than the negotiated codec level-id. 8724 EXPECT_EQ(1u, parameters.encodings.size()); 8725 matched_codec.parameters["level-id"] = "180"; 8726 parameters.encodings[0].codec = matched_codec; 8727 8728 EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok()); 8729 8730 RtpParameters parameters2 = send_channel_->GetRtpSendParameters(last_ssrc_); 8731 8732 for (const auto& codec : parameters2.codecs) { 8733 if (absl::EqualsIgnoreCase(codec.name, "H265")) { 8734 EXPECT_EQ(codec.parameters.at("level-id"), "156"); 8735 } 8736 } 8737 FakeVideoSendStream* send_stream2 = fake_call_->GetVideoSendStreams().front(); 8738 ASSERT_TRUE(send_stream2); 8739 VideoEncoderConfig encoder_config2 = send_stream2->GetEncoderConfig().Copy(); 8740 EXPECT_EQ(encoder_config2.video_format.parameters.at("level-id"), "156"); 8741 8742 EXPECT_TRUE(send_channel_->SetVideoSend(last_ssrc_, nullptr, nullptr)); 8743 } 8744 #endif 8745 8746 TEST_F(WebRtcVideoChannelTest, 8747 DefaultValueUsedIfScalabilityModeIsUnsupportedByCodec) { 8748 encoder_factory_->AddSupportedVideoCodec( 8749 SdpVideoFormat("VP8", CodecParameterMap(), 8750 {ScalabilityMode::kL1T1, ScalabilityMode::kL1T2})); 8751 encoder_factory_->AddSupportedVideoCodec( 8752 SdpVideoFormat("VP9", CodecParameterMap(), 8753 {ScalabilityMode::kL1T2, ScalabilityMode::kL3T3})); 8754 8755 VideoSenderParameters send_parameters; 8756 send_parameters.codecs.push_back(GetEngineCodec("VP9")); 8757 EXPECT_TRUE(send_channel_->SetSenderParameters(send_parameters)); 8758 8759 FakeVideoSendStream* stream = SetUpSimulcast(true, /*with_rtx=*/false); 8760 8761 // Send a full size frame so all simulcast layers are used when reconfiguring. 8762 FrameForwarder frame_forwarder; 8763 VideoOptions options; 8764 EXPECT_TRUE( 8765 send_channel_->SetVideoSend(last_ssrc_, &options, &frame_forwarder)); 8766 send_channel_->SetSend(true); 8767 frame_forwarder.IncomingCapturedFrame(frame_source_.GetFrame()); 8768 8769 // Set scalability mode. 8770 RtpParameters parameters = send_channel_->GetRtpSendParameters(last_ssrc_); 8771 EXPECT_EQ(kNumSimulcastStreams, parameters.encodings.size()); 8772 parameters.encodings[0].scalability_mode = "L3T3"; 8773 EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok()); 8774 8775 // Verify that the new value is propagated down to the encoder. 8776 // Check that WebRtcVideoSendStream updates VideoEncoderConfig correctly. 8777 const std::optional<ScalabilityMode> kDefaultScalabilityMode = 8778 ScalabilityModeFromString(kDefaultScalabilityModeStr); 8779 EXPECT_EQ(2, stream->num_encoder_reconfigurations()); 8780 VideoEncoderConfig encoder_config = stream->GetEncoderConfig().Copy(); 8781 EXPECT_EQ(1u, encoder_config.number_of_streams); 8782 EXPECT_THAT( 8783 encoder_config.simulcast_layers, 8784 ElementsAre( 8785 Field(&VideoStream::scalability_mode, ScalabilityMode::kL3T3), 8786 Field(&VideoStream::scalability_mode, kDefaultScalabilityMode), 8787 Field(&VideoStream::scalability_mode, kDefaultScalabilityMode))); 8788 8789 // FakeVideoSendStream calls CreateEncoderStreams, test that the vector of 8790 // VideoStreams are created appropriately for the simulcast case. 8791 EXPECT_THAT(stream->GetVideoStreams(), 8792 ElementsAre(Field(&VideoStream::scalability_mode, 8793 ScalabilityMode::kL3T3))); 8794 8795 // GetParameters. 8796 parameters = send_channel_->GetRtpSendParameters(last_ssrc_); 8797 EXPECT_THAT( 8798 parameters.encodings, 8799 ElementsAre(Field(&RtpEncodingParameters::scalability_mode, "L3T3"), 8800 Field(&RtpEncodingParameters::scalability_mode, 8801 kDefaultScalabilityModeStr), 8802 Field(&RtpEncodingParameters::scalability_mode, 8803 kDefaultScalabilityModeStr))); 8804 8805 // Change codec to VP8. 8806 VideoSenderParameters vp8_parameters; 8807 vp8_parameters.codecs.push_back(GetEngineCodec("VP8")); 8808 EXPECT_TRUE(send_channel_->SetSenderParameters(vp8_parameters)); 8809 frame_forwarder.IncomingCapturedFrame(frame_source_.GetFrame()); 8810 8811 // The stream should be recreated due to codec change. 8812 std::vector<FakeVideoSendStream*> new_streams = GetFakeSendStreams(); 8813 EXPECT_EQ(1u, new_streams.size()); 8814 EXPECT_EQ(2, fake_call_->GetNumCreatedSendStreams()); 8815 8816 // Verify fallback to default value triggered (L3T3 is not supported). 8817 EXPECT_THAT( 8818 new_streams[0]->GetVideoStreams(), 8819 ElementsAre( 8820 Field(&VideoStream::scalability_mode, kDefaultScalabilityMode), 8821 Field(&VideoStream::scalability_mode, kDefaultScalabilityMode), 8822 Field(&VideoStream::scalability_mode, kDefaultScalabilityMode))); 8823 8824 parameters = send_channel_->GetRtpSendParameters(last_ssrc_); 8825 EXPECT_THAT(parameters.encodings, 8826 ElementsAre(Field(&RtpEncodingParameters::scalability_mode, 8827 kDefaultScalabilityModeStr), 8828 Field(&RtpEncodingParameters::scalability_mode, 8829 kDefaultScalabilityModeStr), 8830 Field(&RtpEncodingParameters::scalability_mode, 8831 kDefaultScalabilityModeStr))); 8832 8833 EXPECT_TRUE(send_channel_->SetVideoSend(last_ssrc_, nullptr, nullptr)); 8834 } 8835 8836 TEST_F(WebRtcVideoChannelTest, GetAndSetRtpSendParametersMinAndMaxBitrate) { 8837 SetUpSimulcast(true, /*with_rtx=*/false); 8838 8839 // Get and set the rtp encoding parameters. 8840 RtpParameters parameters = send_channel_->GetRtpSendParameters(last_ssrc_); 8841 EXPECT_EQ(kNumSimulcastStreams, parameters.encodings.size()); 8842 for (const auto& encoding : parameters.encodings) { 8843 EXPECT_FALSE(encoding.min_bitrate_bps); 8844 EXPECT_FALSE(encoding.max_bitrate_bps); 8845 } 8846 8847 // Change the value and set it on the VideoChannel. 8848 parameters.encodings[0].min_bitrate_bps = 100000; 8849 parameters.encodings[0].max_bitrate_bps = 200000; 8850 parameters.encodings[1].min_bitrate_bps = 300000; 8851 parameters.encodings[1].max_bitrate_bps = 400000; 8852 parameters.encodings[2].min_bitrate_bps = 500000; 8853 parameters.encodings[2].max_bitrate_bps = 600000; 8854 EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok()); 8855 8856 // Verify that the bitrates are set on the VideoChannel. 8857 parameters = send_channel_->GetRtpSendParameters(last_ssrc_); 8858 EXPECT_EQ(kNumSimulcastStreams, parameters.encodings.size()); 8859 EXPECT_EQ(100000, parameters.encodings[0].min_bitrate_bps); 8860 EXPECT_EQ(200000, parameters.encodings[0].max_bitrate_bps); 8861 EXPECT_EQ(300000, parameters.encodings[1].min_bitrate_bps); 8862 EXPECT_EQ(400000, parameters.encodings[1].max_bitrate_bps); 8863 EXPECT_EQ(500000, parameters.encodings[2].min_bitrate_bps); 8864 EXPECT_EQ(600000, parameters.encodings[2].max_bitrate_bps); 8865 } 8866 8867 TEST_F(WebRtcVideoChannelTest, SetRtpSendParametersFailsWithIncorrectBitrate) { 8868 SetUpSimulcast(true, /*with_rtx=*/false); 8869 8870 // Get and set the rtp encoding parameters. 8871 RtpParameters parameters = send_channel_->GetRtpSendParameters(last_ssrc_); 8872 EXPECT_EQ(kNumSimulcastStreams, parameters.encodings.size()); 8873 8874 // Max bitrate lower than min bitrate should fail. 8875 parameters.encodings[2].min_bitrate_bps = 100000; 8876 parameters.encodings[2].max_bitrate_bps = 100000 - 1; 8877 EXPECT_EQ(RTCErrorType::INVALID_RANGE, 8878 send_channel_->SetRtpSendParameters(last_ssrc_, parameters).type()); 8879 } 8880 8881 // Test that min and max bitrate values set via RtpParameters are correctly 8882 // propagated to the underlying encoder, and that the target is set to 3/4 of 8883 // the maximum (3/4 was chosen because it's similar to the simulcast defaults 8884 // that are used if no min/max are specified). 8885 TEST_F(WebRtcVideoChannelTest, MinAndMaxSimulcastBitratePropagatedToEncoder) { 8886 FakeVideoSendStream* stream = SetUpSimulcast(true, /*with_rtx=*/false); 8887 8888 // Send a full size frame so all simulcast layers are used when reconfiguring. 8889 FrameForwarder frame_forwarder; 8890 VideoOptions options; 8891 EXPECT_TRUE( 8892 send_channel_->SetVideoSend(last_ssrc_, &options, &frame_forwarder)); 8893 send_channel_->SetSend(true); 8894 frame_forwarder.IncomingCapturedFrame(frame_source_.GetFrame()); 8895 8896 // Get and set the rtp encoding parameters. 8897 // Change the value and set it on the VideoChannel. 8898 RtpParameters parameters = send_channel_->GetRtpSendParameters(last_ssrc_); 8899 EXPECT_EQ(kNumSimulcastStreams, parameters.encodings.size()); 8900 parameters.encodings[0].min_bitrate_bps = 100000; 8901 parameters.encodings[0].max_bitrate_bps = 200000; 8902 parameters.encodings[1].min_bitrate_bps = 300000; 8903 parameters.encodings[1].max_bitrate_bps = 400000; 8904 parameters.encodings[2].min_bitrate_bps = 500000; 8905 parameters.encodings[2].max_bitrate_bps = 600000; 8906 EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok()); 8907 8908 // Verify that the new value propagated down to the encoder. 8909 // Check that WebRtcVideoSendStream updates VideoEncoderConfig correctly. 8910 EXPECT_EQ(2, stream->num_encoder_reconfigurations()); 8911 VideoEncoderConfig encoder_config = stream->GetEncoderConfig().Copy(); 8912 EXPECT_EQ(kNumSimulcastStreams, encoder_config.number_of_streams); 8913 EXPECT_EQ(kNumSimulcastStreams, encoder_config.simulcast_layers.size()); 8914 EXPECT_EQ(100000, encoder_config.simulcast_layers[0].min_bitrate_bps); 8915 EXPECT_EQ(200000, encoder_config.simulcast_layers[0].max_bitrate_bps); 8916 EXPECT_EQ(300000, encoder_config.simulcast_layers[1].min_bitrate_bps); 8917 EXPECT_EQ(400000, encoder_config.simulcast_layers[1].max_bitrate_bps); 8918 EXPECT_EQ(500000, encoder_config.simulcast_layers[2].min_bitrate_bps); 8919 EXPECT_EQ(600000, encoder_config.simulcast_layers[2].max_bitrate_bps); 8920 8921 // FakeVideoSendStream calls CreateEncoderStreams, test that the vector of 8922 // VideoStreams are created appropriately for the simulcast case. 8923 EXPECT_EQ(kNumSimulcastStreams, stream->GetVideoStreams().size()); 8924 // Target bitrate: 200000 * 3 / 4 = 150000. 8925 EXPECT_EQ(100000, stream->GetVideoStreams()[0].min_bitrate_bps); 8926 EXPECT_EQ(150000, stream->GetVideoStreams()[0].target_bitrate_bps); 8927 EXPECT_EQ(200000, stream->GetVideoStreams()[0].max_bitrate_bps); 8928 // Target bitrate: 400000 * 3 / 4 = 300000. 8929 EXPECT_EQ(300000, stream->GetVideoStreams()[1].min_bitrate_bps); 8930 EXPECT_EQ(300000, stream->GetVideoStreams()[1].target_bitrate_bps); 8931 EXPECT_EQ(400000, stream->GetVideoStreams()[1].max_bitrate_bps); 8932 // Target bitrate: 600000 * 3 / 4 = 450000, less than min -> max. 8933 EXPECT_EQ(500000, stream->GetVideoStreams()[2].min_bitrate_bps); 8934 EXPECT_EQ(600000, stream->GetVideoStreams()[2].target_bitrate_bps); 8935 EXPECT_EQ(600000, stream->GetVideoStreams()[2].max_bitrate_bps); 8936 8937 // No parameter changed, encoder should not be reconfigured. 8938 EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok()); 8939 EXPECT_EQ(2, stream->num_encoder_reconfigurations()); 8940 8941 EXPECT_TRUE(send_channel_->SetVideoSend(last_ssrc_, nullptr, nullptr)); 8942 } 8943 8944 // Test to only specify the min or max bitrate value for a layer via 8945 // RtpParameters. The unspecified min/max and target value should be set to the 8946 // simulcast default that is used if no min/max are specified. 8947 TEST_F(WebRtcVideoChannelTest, MinOrMaxSimulcastBitratePropagatedToEncoder) { 8948 const std::vector<VideoStream> kDefault = GetSimulcastBitrates720p(); 8949 FakeVideoSendStream* stream = SetUpSimulcast(true, /*with_rtx=*/false); 8950 8951 // Send a full size frame so all simulcast layers are used when reconfiguring. 8952 FrameForwarder frame_forwarder; 8953 VideoOptions options; 8954 EXPECT_TRUE( 8955 send_channel_->SetVideoSend(last_ssrc_, &options, &frame_forwarder)); 8956 send_channel_->SetSend(true); 8957 frame_forwarder.IncomingCapturedFrame(frame_source_.GetFrame()); 8958 8959 // Get and set the rtp encoding parameters. 8960 RtpParameters parameters = send_channel_->GetRtpSendParameters(last_ssrc_); 8961 EXPECT_EQ(kNumSimulcastStreams, parameters.encodings.size()); 8962 8963 // Change the value and set it on the VideoChannel. 8964 // Layer 0: only configure min bitrate. 8965 const int kMinBpsLayer0 = kDefault[0].min_bitrate_bps + 1; 8966 parameters.encodings[0].min_bitrate_bps = kMinBpsLayer0; 8967 // Layer 1: only configure max bitrate. 8968 const int kMaxBpsLayer1 = kDefault[1].max_bitrate_bps - 1; 8969 parameters.encodings[1].max_bitrate_bps = kMaxBpsLayer1; 8970 EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok()); 8971 8972 // Verify that the new value propagated down to the encoder. 8973 // Check that WebRtcVideoSendStream updates VideoEncoderConfig correctly. 8974 VideoEncoderConfig encoder_config = stream->GetEncoderConfig().Copy(); 8975 EXPECT_EQ(kNumSimulcastStreams, encoder_config.number_of_streams); 8976 EXPECT_EQ(kNumSimulcastStreams, encoder_config.simulcast_layers.size()); 8977 EXPECT_EQ(kMinBpsLayer0, encoder_config.simulcast_layers[0].min_bitrate_bps); 8978 EXPECT_EQ(-1, encoder_config.simulcast_layers[0].max_bitrate_bps); 8979 EXPECT_EQ(-1, encoder_config.simulcast_layers[1].min_bitrate_bps); 8980 EXPECT_EQ(kMaxBpsLayer1, encoder_config.simulcast_layers[1].max_bitrate_bps); 8981 EXPECT_EQ(-1, encoder_config.simulcast_layers[2].min_bitrate_bps); 8982 EXPECT_EQ(-1, encoder_config.simulcast_layers[2].max_bitrate_bps); 8983 8984 // FakeVideoSendStream calls CreateEncoderStreams, test that the vector of 8985 // VideoStreams are created appropriately for the simulcast case. 8986 EXPECT_EQ(kNumSimulcastStreams, stream->GetVideoStreams().size()); 8987 // Layer 0: min configured bitrate should overwrite min default. 8988 EXPECT_EQ(kMinBpsLayer0, stream->GetVideoStreams()[0].min_bitrate_bps); 8989 EXPECT_EQ(kDefault[0].target_bitrate_bps, 8990 stream->GetVideoStreams()[0].target_bitrate_bps); 8991 EXPECT_EQ(kDefault[0].max_bitrate_bps, 8992 stream->GetVideoStreams()[0].max_bitrate_bps); 8993 // Layer 1: max configured bitrate should overwrite max default. 8994 // And target bitrate should be 3/4 * max bitrate or default target 8995 // which is larger. 8996 EXPECT_EQ(kDefault[1].min_bitrate_bps, 8997 stream->GetVideoStreams()[1].min_bitrate_bps); 8998 const int kTargetBpsLayer1 = 8999 std::max(kDefault[1].target_bitrate_bps, kMaxBpsLayer1 * 3 / 4); 9000 EXPECT_EQ(kTargetBpsLayer1, stream->GetVideoStreams()[1].target_bitrate_bps); 9001 EXPECT_EQ(kMaxBpsLayer1, stream->GetVideoStreams()[1].max_bitrate_bps); 9002 // Layer 2: min and max bitrate not configured, default expected. 9003 EXPECT_EQ(kDefault[2].min_bitrate_bps, 9004 stream->GetVideoStreams()[2].min_bitrate_bps); 9005 EXPECT_EQ(kDefault[2].target_bitrate_bps, 9006 stream->GetVideoStreams()[2].target_bitrate_bps); 9007 EXPECT_EQ(kDefault[2].max_bitrate_bps, 9008 stream->GetVideoStreams()[2].max_bitrate_bps); 9009 9010 EXPECT_TRUE(send_channel_->SetVideoSend(last_ssrc_, nullptr, nullptr)); 9011 } 9012 9013 // Test that specifying the min (or max) bitrate value for a layer via 9014 // RtpParameters above (or below) the simulcast default max (or min) adjusts the 9015 // unspecified values accordingly. 9016 TEST_F(WebRtcVideoChannelTest, SetMinAndMaxSimulcastBitrateAboveBelowDefault) { 9017 const std::vector<VideoStream> kDefault = GetSimulcastBitrates720p(); 9018 FakeVideoSendStream* stream = SetUpSimulcast(true, /*with_rtx=*/false); 9019 9020 // Send a full size frame so all simulcast layers are used when reconfiguring. 9021 FrameForwarder frame_forwarder; 9022 VideoOptions options; 9023 EXPECT_TRUE( 9024 send_channel_->SetVideoSend(last_ssrc_, &options, &frame_forwarder)); 9025 send_channel_->SetSend(true); 9026 frame_forwarder.IncomingCapturedFrame(frame_source_.GetFrame()); 9027 9028 // Get and set the rtp encoding parameters. 9029 RtpParameters parameters = send_channel_->GetRtpSendParameters(last_ssrc_); 9030 EXPECT_EQ(kNumSimulcastStreams, parameters.encodings.size()); 9031 9032 // Change the value and set it on the VideoChannel. 9033 // For layer 0, set the min bitrate above the default max. 9034 const int kMinBpsLayer0 = kDefault[0].max_bitrate_bps + 1; 9035 parameters.encodings[0].min_bitrate_bps = kMinBpsLayer0; 9036 // For layer 1, set the max bitrate below the default min. 9037 const int kMaxBpsLayer1 = kDefault[1].min_bitrate_bps - 1; 9038 parameters.encodings[1].max_bitrate_bps = kMaxBpsLayer1; 9039 EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok()); 9040 9041 // Verify that the new value propagated down to the encoder. 9042 // FakeVideoSendStream calls CreateEncoderStreams, test that the vector of 9043 // VideoStreams are created appropriately for the simulcast case. 9044 EXPECT_EQ(kNumSimulcastStreams, stream->GetVideoStreams().size()); 9045 // Layer 0: Min bitrate above default max (target/max should be adjusted). 9046 EXPECT_EQ(kMinBpsLayer0, stream->GetVideoStreams()[0].min_bitrate_bps); 9047 EXPECT_EQ(kMinBpsLayer0, stream->GetVideoStreams()[0].target_bitrate_bps); 9048 EXPECT_EQ(kMinBpsLayer0, stream->GetVideoStreams()[0].max_bitrate_bps); 9049 // Layer 1: Max bitrate below default min (min/target should be adjusted). 9050 EXPECT_EQ(kMaxBpsLayer1, stream->GetVideoStreams()[1].min_bitrate_bps); 9051 EXPECT_EQ(kMaxBpsLayer1, stream->GetVideoStreams()[1].target_bitrate_bps); 9052 EXPECT_EQ(kMaxBpsLayer1, stream->GetVideoStreams()[1].max_bitrate_bps); 9053 // Layer 2: min and max bitrate not configured, default expected. 9054 EXPECT_EQ(kDefault[2].min_bitrate_bps, 9055 stream->GetVideoStreams()[2].min_bitrate_bps); 9056 EXPECT_EQ(kDefault[2].target_bitrate_bps, 9057 stream->GetVideoStreams()[2].target_bitrate_bps); 9058 EXPECT_EQ(kDefault[2].max_bitrate_bps, 9059 stream->GetVideoStreams()[2].max_bitrate_bps); 9060 9061 EXPECT_TRUE(send_channel_->SetVideoSend(last_ssrc_, nullptr, nullptr)); 9062 } 9063 9064 TEST_F(WebRtcVideoChannelTest, BandwidthAboveTotalMaxBitrateGivenToMaxLayer) { 9065 const std::vector<VideoStream> kDefault = GetSimulcastBitrates720p(); 9066 FakeVideoSendStream* stream = SetUpSimulcast(true, /*with_rtx=*/false); 9067 9068 // Send a full size frame so all simulcast layers are used when reconfiguring. 9069 FrameForwarder frame_forwarder; 9070 VideoOptions options; 9071 EXPECT_TRUE( 9072 send_channel_->SetVideoSend(last_ssrc_, &options, &frame_forwarder)); 9073 send_channel_->SetSend(true); 9074 frame_forwarder.IncomingCapturedFrame(frame_source_.GetFrame()); 9075 9076 // Set max bitrate for all but the highest layer. 9077 RtpParameters parameters = send_channel_->GetRtpSendParameters(last_ssrc_); 9078 EXPECT_EQ(kNumSimulcastStreams, parameters.encodings.size()); 9079 parameters.encodings[0].max_bitrate_bps = kDefault[0].max_bitrate_bps; 9080 parameters.encodings[1].max_bitrate_bps = kDefault[1].max_bitrate_bps; 9081 EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok()); 9082 9083 // Set max bandwidth equal to total max bitrate. 9084 send_parameters_.max_bandwidth_bps = 9085 GetTotalMaxBitrate(stream->GetVideoStreams()).bps(); 9086 ExpectSetMaxBitrate(send_parameters_.max_bandwidth_bps); 9087 ASSERT_TRUE(send_channel_->SetSenderParameters(send_parameters_)); 9088 9089 // No bitrate above the total max to give to the highest layer. 9090 EXPECT_EQ(kNumSimulcastStreams, stream->GetVideoStreams().size()); 9091 EXPECT_EQ(kDefault[2].max_bitrate_bps, 9092 stream->GetVideoStreams()[2].max_bitrate_bps); 9093 9094 // Set max bandwidth above the total max bitrate. 9095 send_parameters_.max_bandwidth_bps = 9096 GetTotalMaxBitrate(stream->GetVideoStreams()).bps() + 1; 9097 ExpectSetMaxBitrate(send_parameters_.max_bandwidth_bps); 9098 ASSERT_TRUE(send_channel_->SetSenderParameters(send_parameters_)); 9099 9100 // The highest layer has no max bitrate set -> the bitrate above the total 9101 // max should be given to the highest layer. 9102 EXPECT_EQ(kNumSimulcastStreams, stream->GetVideoStreams().size()); 9103 EXPECT_EQ(send_parameters_.max_bandwidth_bps, 9104 GetTotalMaxBitrate(stream->GetVideoStreams()).bps()); 9105 EXPECT_EQ(kDefault[2].max_bitrate_bps + 1, 9106 stream->GetVideoStreams()[2].max_bitrate_bps); 9107 9108 EXPECT_TRUE(send_channel_->SetVideoSend(last_ssrc_, nullptr, nullptr)); 9109 } 9110 9111 TEST_F(WebRtcVideoChannelTest, 9112 BandwidthAboveTotalMaxBitrateNotGivenToMaxLayerIfMaxBitrateSet) { 9113 const std::vector<VideoStream> kDefault = GetSimulcastBitrates720p(); 9114 EXPECT_EQ(kNumSimulcastStreams, kDefault.size()); 9115 FakeVideoSendStream* stream = SetUpSimulcast(true, /*with_rtx=*/false); 9116 9117 // Send a full size frame so all simulcast layers are used when reconfiguring. 9118 FrameForwarder frame_forwarder; 9119 VideoOptions options; 9120 EXPECT_TRUE( 9121 send_channel_->SetVideoSend(last_ssrc_, &options, &frame_forwarder)); 9122 send_channel_->SetSend(true); 9123 frame_forwarder.IncomingCapturedFrame(frame_source_.GetFrame()); 9124 9125 // Set max bitrate for the highest layer. 9126 RtpParameters parameters = send_channel_->GetRtpSendParameters(last_ssrc_); 9127 EXPECT_EQ(kNumSimulcastStreams, parameters.encodings.size()); 9128 parameters.encodings[2].max_bitrate_bps = kDefault[2].max_bitrate_bps; 9129 EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok()); 9130 9131 // Set max bandwidth above the total max bitrate. 9132 send_parameters_.max_bandwidth_bps = 9133 GetTotalMaxBitrate(stream->GetVideoStreams()).bps() + 1; 9134 ExpectSetMaxBitrate(send_parameters_.max_bandwidth_bps); 9135 ASSERT_TRUE(send_channel_->SetSenderParameters(send_parameters_)); 9136 9137 // The highest layer has the max bitrate set -> the bitrate above the total 9138 // max should not be given to the highest layer. 9139 EXPECT_EQ(kNumSimulcastStreams, stream->GetVideoStreams().size()); 9140 EXPECT_EQ(*parameters.encodings[2].max_bitrate_bps, 9141 stream->GetVideoStreams()[2].max_bitrate_bps); 9142 9143 EXPECT_TRUE(send_channel_->SetVideoSend(last_ssrc_, nullptr, nullptr)); 9144 } 9145 9146 class WebRtcVideoChannelWithMixedCodecSimulcastTest 9147 : public WebRtcVideoChannelTest { 9148 public: 9149 WebRtcVideoChannelWithMixedCodecSimulcastTest() 9150 : WebRtcVideoChannelTest("WebRTC-MixedCodecSimulcast/Enabled/") {} 9151 }; 9152 9153 TEST_F(WebRtcVideoChannelWithMixedCodecSimulcastTest, 9154 SetMixedCodecSimulcastStreamConfig) { 9155 StreamParams sp = CreateSimStreamParams("cname", {123, 456, 789}); 9156 9157 std::vector<RidDescription> rid_descriptions; 9158 rid_descriptions.emplace_back("f", RidDirection::kSend); 9159 rid_descriptions.emplace_back("h", RidDirection::kSend); 9160 rid_descriptions.emplace_back("q", RidDirection::kSend); 9161 sp.set_rids(rid_descriptions); 9162 9163 ASSERT_TRUE(send_channel_->AddSendStream(sp)); 9164 9165 RtpParameters rtp_parameters = 9166 send_channel_->GetRtpSendParameters(last_ssrc_); 9167 EXPECT_EQ(3UL, rtp_parameters.encodings.size()); 9168 Codec vp8 = GetEngineCodec("VP8"); 9169 Codec vp9 = GetEngineCodec("VP9"); 9170 rtp_parameters.encodings[0].codec = vp8.ToCodecParameters(); 9171 rtp_parameters.encodings[1].codec = vp8.ToCodecParameters(); 9172 rtp_parameters.encodings[2].codec = vp9.ToCodecParameters(); 9173 EXPECT_TRUE( 9174 send_channel_->SetRtpSendParameters(last_ssrc_, rtp_parameters).ok()); 9175 9176 VideoSenderParameters parameters; 9177 parameters.codecs.push_back(vp8); 9178 parameters.codecs.push_back(vp9); 9179 EXPECT_TRUE(send_channel_->SetSenderParameters(parameters)); 9180 9181 const auto& streams = fake_call_->GetVideoSendStreams(); 9182 ASSERT_EQ(1u, streams.size()); 9183 auto stream = streams[0]; 9184 ASSERT_NE(stream, nullptr); 9185 const auto& config = stream->GetConfig(); 9186 // RtpStreamConfig should have the correct codec name and payload type. 9187 ASSERT_THAT(config.rtp.stream_configs, SizeIs(3)); 9188 EXPECT_EQ(config.rtp.stream_configs[0].rid, "f"); 9189 EXPECT_EQ(config.rtp.stream_configs[1].rid, "h"); 9190 EXPECT_EQ(config.rtp.stream_configs[2].rid, "q"); 9191 EXPECT_EQ(config.rtp.stream_configs[0].payload_name, vp8.name); 9192 EXPECT_EQ(config.rtp.stream_configs[1].payload_name, vp8.name); 9193 EXPECT_EQ(config.rtp.stream_configs[2].payload_name, vp9.name); 9194 EXPECT_EQ(config.rtp.stream_configs[0].payload_type, vp8.id); 9195 EXPECT_EQ(config.rtp.stream_configs[1].payload_type, vp8.id); 9196 EXPECT_EQ(config.rtp.stream_configs[2].payload_type, vp9.id); 9197 } 9198 9199 #if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID) 9200 TEST_F(WebRtcVideoChannelWithMixedCodecSimulcastTest, 9201 SetMixedCodecSimulcastWithDifferentConfigSettingsSizes) { 9202 AddSendStream(); 9203 9204 VideoSenderParameters parameters; 9205 Codec vp8 = GetEngineCodec("VP8"); 9206 parameters.codecs.push_back(vp8); 9207 9208 // `codec_settings_list.size()` is 1 after this in the 9209 EXPECT_TRUE(send_channel_->SetSenderParameters(parameters)); 9210 9211 // It sets 2 sizes of config ssrc. 9212 StreamParams sp = CreateSimStreamParams("cname", {123, 456}); 9213 std::vector<RidDescription> rid_descriptions2; 9214 rid_descriptions2.emplace_back("f", RidDirection::kSend); 9215 rid_descriptions2.emplace_back("h", RidDirection::kSend); 9216 sp.set_rids(rid_descriptions2); 9217 9218 // `WebRtcVideoSendStream::SetCodec` test for different sizes 9219 // between parameters_.config.rtp.ssrcs.size() and codec_settings_list.size(). 9220 EXPECT_DEATH(send_channel_->AddSendStream(sp), ""); 9221 } 9222 #endif 9223 9224 // Test that min and max bitrate values set via RtpParameters are correctly 9225 // propagated to the underlying encoder for a single stream. 9226 TEST_F(WebRtcVideoChannelTest, MinAndMaxBitratePropagatedToEncoder) { 9227 FakeVideoSendStream* stream = AddSendStream(); 9228 EXPECT_TRUE(send_channel_->SetSend(true)); 9229 EXPECT_TRUE(stream->IsSending()); 9230 9231 // Set min and max bitrate. 9232 RtpParameters parameters = send_channel_->GetRtpSendParameters(last_ssrc_); 9233 EXPECT_EQ(1u, parameters.encodings.size()); 9234 parameters.encodings[0].min_bitrate_bps = 80000; 9235 parameters.encodings[0].max_bitrate_bps = 150000; 9236 EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok()); 9237 9238 // Check that WebRtcVideoSendStream updates VideoEncoderConfig correctly. 9239 VideoEncoderConfig encoder_config = stream->GetEncoderConfig().Copy(); 9240 EXPECT_EQ(1u, encoder_config.number_of_streams); 9241 EXPECT_EQ(1u, encoder_config.simulcast_layers.size()); 9242 EXPECT_EQ(80000, encoder_config.simulcast_layers[0].min_bitrate_bps); 9243 EXPECT_EQ(150000, encoder_config.simulcast_layers[0].max_bitrate_bps); 9244 9245 // FakeVideoSendStream calls CreateEncoderStreams, test that the vector of 9246 // VideoStreams are created appropriately. 9247 EXPECT_EQ(1u, stream->GetVideoStreams().size()); 9248 EXPECT_EQ(80000, stream->GetVideoStreams()[0].min_bitrate_bps); 9249 EXPECT_EQ(150000, stream->GetVideoStreams()[0].target_bitrate_bps); 9250 EXPECT_EQ(150000, stream->GetVideoStreams()[0].max_bitrate_bps); 9251 } 9252 9253 // Test the default min and max bitrate value are correctly propagated to the 9254 // underlying encoder for a single stream (when the values are not set via 9255 // RtpParameters). 9256 TEST_F(WebRtcVideoChannelTest, DefaultMinAndMaxBitratePropagatedToEncoder) { 9257 FakeVideoSendStream* stream = AddSendStream(); 9258 EXPECT_TRUE(send_channel_->SetSend(true)); 9259 EXPECT_TRUE(stream->IsSending()); 9260 9261 // Check that WebRtcVideoSendStream updates VideoEncoderConfig correctly. 9262 VideoEncoderConfig encoder_config = stream->GetEncoderConfig().Copy(); 9263 EXPECT_EQ(1u, encoder_config.number_of_streams); 9264 EXPECT_EQ(1u, encoder_config.simulcast_layers.size()); 9265 EXPECT_EQ(-1, encoder_config.simulcast_layers[0].min_bitrate_bps); 9266 EXPECT_EQ(-1, encoder_config.simulcast_layers[0].max_bitrate_bps); 9267 9268 // FakeVideoSendStream calls CreateEncoderStreams, test that the vector of 9269 // VideoStreams are created appropriately. 9270 EXPECT_EQ(1u, stream->GetVideoStreams().size()); 9271 EXPECT_EQ(kDefaultMinVideoBitrateBps, 9272 stream->GetVideoStreams()[0].min_bitrate_bps); 9273 EXPECT_GT(stream->GetVideoStreams()[0].max_bitrate_bps, 9274 stream->GetVideoStreams()[0].min_bitrate_bps); 9275 EXPECT_EQ(stream->GetVideoStreams()[0].max_bitrate_bps, 9276 stream->GetVideoStreams()[0].target_bitrate_bps); 9277 } 9278 9279 // Tests that when some streams are disactivated then the lowest 9280 // stream min_bitrate would be reused for the first active stream. 9281 TEST_F(WebRtcVideoChannelTest, 9282 SetRtpSendParametersSetsMinBitrateForFirstActiveStream) { 9283 // Create the stream params with multiple ssrcs for simulcast. 9284 std::vector<uint32_t> ssrcs = MAKE_VECTOR(kSsrcs3); 9285 StreamParams stream_params = CreateSimStreamParams("cname", ssrcs); 9286 FakeVideoSendStream* fake_video_send_stream = AddSendStream(stream_params); 9287 uint32_t primary_ssrc = stream_params.first_ssrc(); 9288 9289 // Using the FrameForwarder, we manually send a full size 9290 // frame. This allows us to test that ReconfigureEncoder is called 9291 // appropriately. 9292 FrameForwarder frame_forwarder; 9293 VideoOptions options; 9294 EXPECT_TRUE( 9295 send_channel_->SetVideoSend(primary_ssrc, &options, &frame_forwarder)); 9296 send_channel_->SetSend(true); 9297 frame_forwarder.IncomingCapturedFrame(frame_source_.GetFrame( 9298 1920, 1080, VideoRotation::kVideoRotation_0, kNumMicrosecsPerSec / 30)); 9299 9300 // Check that all encodings are initially active. 9301 RtpParameters parameters = send_channel_->GetRtpSendParameters(primary_ssrc); 9302 EXPECT_EQ(kNumSimulcastStreams, parameters.encodings.size()); 9303 EXPECT_TRUE(parameters.encodings[0].active); 9304 EXPECT_TRUE(parameters.encodings[1].active); 9305 EXPECT_TRUE(parameters.encodings[2].active); 9306 EXPECT_TRUE(fake_video_send_stream->IsSending()); 9307 9308 // Only turn on the highest stream. 9309 parameters.encodings[0].active = false; 9310 parameters.encodings[1].active = false; 9311 parameters.encodings[2].active = true; 9312 EXPECT_TRUE( 9313 send_channel_->SetRtpSendParameters(primary_ssrc, parameters).ok()); 9314 9315 // Check that the VideoSendStream is updated appropriately. This means its 9316 // send state was updated and it was reconfigured. 9317 EXPECT_TRUE(fake_video_send_stream->IsSending()); 9318 std::vector<VideoStream> simulcast_streams = 9319 fake_video_send_stream->GetVideoStreams(); 9320 EXPECT_EQ(kNumSimulcastStreams, simulcast_streams.size()); 9321 EXPECT_FALSE(simulcast_streams[0].active); 9322 EXPECT_FALSE(simulcast_streams[1].active); 9323 EXPECT_TRUE(simulcast_streams[2].active); 9324 9325 EXPECT_EQ(simulcast_streams[2].min_bitrate_bps, 9326 simulcast_streams[0].min_bitrate_bps); 9327 9328 EXPECT_TRUE(send_channel_->SetVideoSend(primary_ssrc, nullptr, nullptr)); 9329 } 9330 9331 // Test that GetRtpSendParameters returns the currently configured codecs. 9332 TEST_F(WebRtcVideoChannelTest, GetRtpSendParametersCodecs) { 9333 AddSendStream(); 9334 VideoSenderParameters parameters; 9335 parameters.codecs.push_back(GetEngineCodec("VP8")); 9336 parameters.codecs.push_back(GetEngineCodec("VP9")); 9337 EXPECT_TRUE(send_channel_->SetSenderParameters(parameters)); 9338 9339 RtpParameters rtp_parameters = 9340 send_channel_->GetRtpSendParameters(last_ssrc_); 9341 ASSERT_EQ(2u, rtp_parameters.codecs.size()); 9342 EXPECT_EQ(GetEngineCodec("VP8").ToCodecParameters(), 9343 rtp_parameters.codecs[0]); 9344 EXPECT_EQ(GetEngineCodec("VP9").ToCodecParameters(), 9345 rtp_parameters.codecs[1]); 9346 } 9347 9348 // Test that GetRtpSendParameters returns the currently configured RTCP CNAME. 9349 TEST_F(WebRtcVideoChannelTest, GetRtpSendParametersRtcpCname) { 9350 StreamParams params = StreamParams::CreateLegacy(kSsrc); 9351 params.cname = "rtcpcname"; 9352 AddSendStream(params); 9353 9354 RtpParameters rtp_parameters = send_channel_->GetRtpSendParameters(kSsrc); 9355 EXPECT_STREQ("rtcpcname", rtp_parameters.rtcp.cname.c_str()); 9356 } 9357 9358 // Test that RtpParameters for send stream has one encoding and it has 9359 // the correct SSRC. 9360 TEST_F(WebRtcVideoChannelTest, GetRtpSendParametersSsrc) { 9361 AddSendStream(); 9362 9363 RtpParameters rtp_parameters = 9364 send_channel_->GetRtpSendParameters(last_ssrc_); 9365 ASSERT_EQ(1u, rtp_parameters.encodings.size()); 9366 EXPECT_EQ(last_ssrc_, rtp_parameters.encodings[0].ssrc); 9367 } 9368 9369 TEST_F(WebRtcVideoChannelTest, DetectRtpSendParameterHeaderExtensionsChange) { 9370 AddSendStream(); 9371 9372 RtpParameters rtp_parameters = 9373 send_channel_->GetRtpSendParameters(last_ssrc_); 9374 rtp_parameters.header_extensions.emplace_back(); 9375 9376 EXPECT_NE(0u, rtp_parameters.header_extensions.size()); 9377 9378 RTCError result = 9379 send_channel_->SetRtpSendParameters(last_ssrc_, rtp_parameters); 9380 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type()); 9381 } 9382 9383 TEST_F(WebRtcVideoChannelTest, GetRtpSendParametersDegradationPreference) { 9384 AddSendStream(); 9385 9386 FrameForwarder frame_forwarder; 9387 EXPECT_TRUE( 9388 send_channel_->SetVideoSend(last_ssrc_, nullptr, &frame_forwarder)); 9389 9390 RtpParameters rtp_parameters = 9391 send_channel_->GetRtpSendParameters(last_ssrc_); 9392 EXPECT_FALSE(rtp_parameters.degradation_preference.has_value()); 9393 rtp_parameters.degradation_preference = 9394 DegradationPreference::MAINTAIN_FRAMERATE; 9395 9396 EXPECT_TRUE( 9397 send_channel_->SetRtpSendParameters(last_ssrc_, rtp_parameters).ok()); 9398 9399 RtpParameters updated_rtp_parameters = 9400 send_channel_->GetRtpSendParameters(last_ssrc_); 9401 EXPECT_EQ(updated_rtp_parameters.degradation_preference, 9402 DegradationPreference::MAINTAIN_FRAMERATE); 9403 9404 // Remove the source since it will be destroyed before the channel 9405 EXPECT_TRUE(send_channel_->SetVideoSend(last_ssrc_, nullptr, nullptr)); 9406 } 9407 9408 // Test that if we set/get parameters multiple times, we get the same results. 9409 TEST_F(WebRtcVideoChannelTest, SetAndGetRtpSendParameters) { 9410 AddSendStream(); 9411 VideoSenderParameters parameters; 9412 parameters.codecs.push_back(GetEngineCodec("VP8")); 9413 parameters.codecs.push_back(GetEngineCodec("VP9")); 9414 EXPECT_TRUE(send_channel_->SetSenderParameters(parameters)); 9415 9416 RtpParameters initial_params = 9417 send_channel_->GetRtpSendParameters(last_ssrc_); 9418 9419 // We should be able to set the params we just got. 9420 EXPECT_TRUE( 9421 send_channel_->SetRtpSendParameters(last_ssrc_, initial_params).ok()); 9422 9423 // ... And this shouldn't change the params returned by GetRtpSendParameters. 9424 EXPECT_EQ(initial_params, send_channel_->GetRtpSendParameters(last_ssrc_)); 9425 } 9426 9427 // Test that GetRtpReceiverParameters returns the currently configured codecs. 9428 TEST_F(WebRtcVideoChannelTest, GetRtpReceiveParametersCodecs) { 9429 AddRecvStream(); 9430 VideoReceiverParameters parameters; 9431 parameters.codecs.push_back(GetEngineCodec("VP8")); 9432 parameters.codecs.push_back(GetEngineCodec("VP9")); 9433 EXPECT_TRUE(receive_channel_->SetReceiverParameters(parameters)); 9434 9435 RtpParameters rtp_parameters = 9436 receive_channel_->GetRtpReceiverParameters(last_ssrc_); 9437 ASSERT_EQ(2u, rtp_parameters.codecs.size()); 9438 EXPECT_EQ(GetEngineCodec("VP8").ToCodecParameters(), 9439 rtp_parameters.codecs[0]); 9440 EXPECT_EQ(GetEngineCodec("VP9").ToCodecParameters(), 9441 rtp_parameters.codecs[1]); 9442 } 9443 9444 #if defined(WEBRTC_USE_H264) 9445 TEST_F(WebRtcVideoChannelTest, GetRtpReceiveFmtpSprop) { 9446 #else 9447 TEST_F(WebRtcVideoChannelTest, DISABLED_GetRtpReceiveFmtpSprop) { 9448 #endif 9449 VideoReceiverParameters parameters; 9450 Codec kH264sprop1 = CreateVideoCodec(101, "H264"); 9451 kH264sprop1.SetParam(kH264FmtpSpropParameterSets, "uvw"); 9452 parameters.codecs.push_back(kH264sprop1); 9453 Codec kH264sprop2 = CreateVideoCodec(102, "H264"); 9454 kH264sprop2.SetParam(kH264FmtpSpropParameterSets, "xyz"); 9455 parameters.codecs.push_back(kH264sprop2); 9456 EXPECT_TRUE(receive_channel_->SetReceiverParameters(parameters)); 9457 9458 FakeVideoReceiveStream* recv_stream = AddRecvStream(); 9459 const VideoReceiveStreamInterface::Config& cfg = recv_stream->GetConfig(); 9460 RtpParameters rtp_parameters = 9461 receive_channel_->GetRtpReceiverParameters(last_ssrc_); 9462 ASSERT_EQ(2u, rtp_parameters.codecs.size()); 9463 EXPECT_EQ(kH264sprop1.ToCodecParameters(), rtp_parameters.codecs[0]); 9464 ASSERT_EQ(2u, cfg.decoders.size()); 9465 EXPECT_EQ(101, cfg.decoders[0].payload_type); 9466 EXPECT_EQ("H264", cfg.decoders[0].video_format.name); 9467 const auto it0 = 9468 cfg.decoders[0].video_format.parameters.find(kH264FmtpSpropParameterSets); 9469 ASSERT_TRUE(it0 != cfg.decoders[0].video_format.parameters.end()); 9470 EXPECT_EQ("uvw", it0->second); 9471 9472 EXPECT_EQ(102, cfg.decoders[1].payload_type); 9473 EXPECT_EQ("H264", cfg.decoders[1].video_format.name); 9474 const auto it1 = 9475 cfg.decoders[1].video_format.parameters.find(kH264FmtpSpropParameterSets); 9476 ASSERT_TRUE(it1 != cfg.decoders[1].video_format.parameters.end()); 9477 EXPECT_EQ("xyz", it1->second); 9478 } 9479 9480 // Test that RtpParameters for receive stream has one encoding and it has 9481 // the correct SSRC. 9482 TEST_F(WebRtcVideoChannelTest, GetRtpReceiveParametersSsrc) { 9483 AddRecvStream(); 9484 9485 RtpParameters rtp_parameters = 9486 receive_channel_->GetRtpReceiverParameters(last_ssrc_); 9487 ASSERT_EQ(1u, rtp_parameters.encodings.size()); 9488 EXPECT_EQ(last_ssrc_, rtp_parameters.encodings[0].ssrc); 9489 } 9490 9491 // Test that if we set/get parameters multiple times, we get the same results. 9492 TEST_F(WebRtcVideoChannelTest, SetAndGetRtpReceiveParameters) { 9493 AddRecvStream(); 9494 VideoReceiverParameters parameters; 9495 parameters.codecs.push_back(GetEngineCodec("VP8")); 9496 parameters.codecs.push_back(GetEngineCodec("VP9")); 9497 EXPECT_TRUE(receive_channel_->SetReceiverParameters(parameters)); 9498 9499 RtpParameters initial_params = 9500 receive_channel_->GetRtpReceiverParameters(last_ssrc_); 9501 9502 // ... And this shouldn't change the params returned by 9503 // GetRtpReceiverParameters. 9504 EXPECT_EQ(initial_params, 9505 receive_channel_->GetRtpReceiverParameters(last_ssrc_)); 9506 } 9507 9508 // Test that GetDefaultRtpReceiveParameters returns parameters correctly when 9509 // SSRCs aren't signaled. It should always return an empty 9510 // "RtpEncodingParameters", even after a packet is received and the unsignaled 9511 // SSRC is known. 9512 TEST_F(WebRtcVideoChannelTest, 9513 GetDefaultRtpReceiveParametersWithUnsignaledSsrc) { 9514 // Call necessary methods to configure receiving a default stream as 9515 // soon as it arrives. 9516 VideoReceiverParameters parameters; 9517 parameters.codecs.push_back(GetEngineCodec("VP8")); 9518 parameters.codecs.push_back(GetEngineCodec("VP9")); 9519 EXPECT_TRUE(receive_channel_->SetReceiverParameters(parameters)); 9520 9521 // Call GetRtpReceiverParameters before configured to receive an unsignaled 9522 // stream. Should return nothing. 9523 EXPECT_EQ(RtpParameters(), 9524 receive_channel_->GetDefaultRtpReceiveParameters()); 9525 9526 // Set a sink for an unsignaled stream. 9527 FakeVideoRenderer renderer; 9528 receive_channel_->SetDefaultSink(&renderer); 9529 9530 // Call GetDefaultRtpReceiveParameters before the SSRC is known. 9531 RtpParameters rtp_parameters = 9532 receive_channel_->GetDefaultRtpReceiveParameters(); 9533 ASSERT_EQ(1u, rtp_parameters.encodings.size()); 9534 EXPECT_FALSE(rtp_parameters.encodings[0].ssrc); 9535 9536 // Receive VP8 packet. 9537 RtpPacketReceived rtp_packet; 9538 rtp_packet.SetPayloadType(GetEngineCodec("VP8").id); 9539 rtp_packet.SetSsrc(kIncomingUnsignalledSsrc); 9540 ReceivePacketAndAdvanceTime(rtp_packet); 9541 9542 // The `ssrc` member should still be unset. 9543 rtp_parameters = receive_channel_->GetDefaultRtpReceiveParameters(); 9544 ASSERT_EQ(1u, rtp_parameters.encodings.size()); 9545 EXPECT_FALSE(rtp_parameters.encodings[0].ssrc); 9546 } 9547 9548 // Test that if a default stream is created for a non-primary stream (for 9549 // example, RTX before we know it's RTX), we are still able to explicitly add 9550 // the stream later. 9551 TEST_F(WebRtcVideoChannelTest, 9552 AddReceiveStreamAfterReceivingNonPrimaryUnsignaledSsrc) { 9553 // Receive VP8 RTX packet. 9554 RtpPacketReceived rtp_packet; 9555 const Codec vp8 = GetEngineCodec("VP8"); 9556 rtp_packet.SetPayloadType(default_apt_rtx_types_[vp8.id]); 9557 rtp_packet.SetSsrc(2); 9558 ReceivePacketAndAdvanceTime(rtp_packet); 9559 EXPECT_EQ(1u, fake_call_->GetVideoReceiveStreams().size()); 9560 9561 StreamParams params = StreamParams::CreateLegacy(1); 9562 params.AddFidSsrc(1, 2); 9563 EXPECT_TRUE(receive_channel_->AddRecvStream(params)); 9564 } 9565 9566 void WebRtcVideoChannelTest::TestReceiverLocalSsrcConfiguration( 9567 bool receiver_first) { 9568 EXPECT_TRUE(send_channel_->SetSenderParameters(send_parameters_)); 9569 9570 const uint32_t kSenderSsrc = 0xC0FFEE; 9571 const uint32_t kSecondSenderSsrc = 0xBADCAFE; 9572 const uint32_t kReceiverSsrc = 0x4711; 9573 const uint32_t kExpectedDefaultReceiverSsrc = 1; 9574 9575 if (receiver_first) { 9576 AddRecvStream(StreamParams::CreateLegacy(kReceiverSsrc)); 9577 std::vector<FakeVideoReceiveStream*> receive_streams = 9578 fake_call_->GetVideoReceiveStreams(); 9579 ASSERT_EQ(1u, receive_streams.size()); 9580 // Default local SSRC when we have no sender. 9581 EXPECT_EQ(kExpectedDefaultReceiverSsrc, 9582 receive_streams[0]->GetConfig().rtp.local_ssrc); 9583 } 9584 AddSendStream(StreamParams::CreateLegacy(kSenderSsrc)); 9585 if (!receiver_first) 9586 AddRecvStream(StreamParams::CreateLegacy(kReceiverSsrc)); 9587 std::vector<FakeVideoReceiveStream*> receive_streams = 9588 fake_call_->GetVideoReceiveStreams(); 9589 ASSERT_EQ(1u, receive_streams.size()); 9590 EXPECT_EQ(kSenderSsrc, receive_streams[0]->GetConfig().rtp.local_ssrc); 9591 9592 // Removing first sender should fall back to another (in this case the second) 9593 // local send stream's SSRC. 9594 AddSendStream(StreamParams::CreateLegacy(kSecondSenderSsrc)); 9595 ASSERT_TRUE(send_channel_->RemoveSendStream(kSenderSsrc)); 9596 receive_streams = fake_call_->GetVideoReceiveStreams(); 9597 ASSERT_EQ(1u, receive_streams.size()); 9598 EXPECT_EQ(kSecondSenderSsrc, receive_streams[0]->GetConfig().rtp.local_ssrc); 9599 9600 // Removing the last sender should fall back to default local SSRC. 9601 ASSERT_TRUE(send_channel_->RemoveSendStream(kSecondSenderSsrc)); 9602 receive_streams = fake_call_->GetVideoReceiveStreams(); 9603 ASSERT_EQ(1u, receive_streams.size()); 9604 EXPECT_EQ(kExpectedDefaultReceiverSsrc, 9605 receive_streams[0]->GetConfig().rtp.local_ssrc); 9606 } 9607 9608 TEST_F(WebRtcVideoChannelTest, ConfiguresLocalSsrc) { 9609 TestReceiverLocalSsrcConfiguration(false); 9610 } 9611 9612 TEST_F(WebRtcVideoChannelTest, ConfiguresLocalSsrcOnExistingReceivers) { 9613 TestReceiverLocalSsrcConfiguration(true); 9614 } 9615 9616 TEST_F(WebRtcVideoChannelTest, Simulcast_QualityScalingNotAllowed) { 9617 FakeVideoSendStream* stream = SetUpSimulcast(true, /*with_rtx=*/true); 9618 EXPECT_FALSE(stream->GetEncoderConfig().is_quality_scaling_allowed); 9619 } 9620 9621 TEST_F(WebRtcVideoChannelTest, Singlecast_QualityScalingAllowed) { 9622 FakeVideoSendStream* stream = SetUpSimulcast(false, /*with_rtx=*/true); 9623 EXPECT_TRUE(stream->GetEncoderConfig().is_quality_scaling_allowed); 9624 } 9625 9626 TEST_F(WebRtcVideoChannelTest, 9627 SinglecastScreenSharing_QualityScalingNotAllowed) { 9628 SetUpSimulcast(false, /*with_rtx=*/true); 9629 9630 FrameForwarder frame_forwarder; 9631 VideoOptions options; 9632 options.is_screencast = true; 9633 EXPECT_TRUE( 9634 send_channel_->SetVideoSend(last_ssrc_, &options, &frame_forwarder)); 9635 // Fetch the latest stream since SetVideoSend() may recreate it if the 9636 // screen content setting is changed. 9637 FakeVideoSendStream* stream = fake_call_->GetVideoSendStreams().front(); 9638 9639 EXPECT_FALSE(stream->GetEncoderConfig().is_quality_scaling_allowed); 9640 EXPECT_TRUE(send_channel_->SetVideoSend(last_ssrc_, nullptr, nullptr)); 9641 } 9642 9643 TEST_F(WebRtcVideoChannelTest, 9644 SimulcastSingleActiveStream_QualityScalingAllowed) { 9645 FakeVideoSendStream* stream = SetUpSimulcast(true, /*with_rtx=*/false); 9646 9647 RtpParameters rtp_parameters = 9648 send_channel_->GetRtpSendParameters(last_ssrc_); 9649 ASSERT_EQ(3u, rtp_parameters.encodings.size()); 9650 ASSERT_TRUE(rtp_parameters.encodings[0].active); 9651 ASSERT_TRUE(rtp_parameters.encodings[1].active); 9652 ASSERT_TRUE(rtp_parameters.encodings[2].active); 9653 rtp_parameters.encodings[0].active = false; 9654 rtp_parameters.encodings[1].active = false; 9655 EXPECT_TRUE( 9656 send_channel_->SetRtpSendParameters(last_ssrc_, rtp_parameters).ok()); 9657 EXPECT_TRUE(stream->GetEncoderConfig().is_quality_scaling_allowed); 9658 } 9659 9660 TEST_F(WebRtcVideoChannelTest, GenerateKeyFrameSinglecast) { 9661 FakeVideoSendStream* stream = AddSendStream(); 9662 9663 RtpParameters rtp_parameters = 9664 send_channel_->GetRtpSendParameters(last_ssrc_); 9665 ASSERT_EQ(1u, rtp_parameters.encodings.size()); 9666 EXPECT_EQ(rtp_parameters.encodings[0].rid, ""); 9667 EXPECT_TRUE( 9668 send_channel_->SetRtpSendParameters(last_ssrc_, rtp_parameters).ok()); 9669 EXPECT_THAT(stream->GetKeyFramesRequested(), std::vector<std::string>({})); 9670 9671 // Manually set the key frames requested to check they are cleared by the next 9672 // call. 9673 stream->GenerateKeyFrame({"bogus"}); 9674 rtp_parameters.encodings[0].request_key_frame = true; 9675 EXPECT_TRUE( 9676 send_channel_->SetRtpSendParameters(last_ssrc_, rtp_parameters).ok()); 9677 EXPECT_THAT(stream->GetKeyFramesRequested(), 9678 ElementsAreArray(std::vector<std::string>({}))); 9679 } 9680 9681 TEST_F(WebRtcVideoChannelTest, GenerateKeyFrameSimulcast) { 9682 StreamParams stream_params = CreateSimStreamParams("cname", {123, 456, 789}); 9683 9684 std::vector<std::string> rids = {"f", "h", "q"}; 9685 std::vector<RidDescription> rid_descriptions; 9686 for (const auto& rid : rids) { 9687 rid_descriptions.emplace_back(rid, RidDirection::kSend); 9688 } 9689 stream_params.set_rids(rid_descriptions); 9690 FakeVideoSendStream* stream = AddSendStream(stream_params); 9691 9692 RtpParameters rtp_parameters = 9693 send_channel_->GetRtpSendParameters(last_ssrc_); 9694 ASSERT_EQ(3u, rtp_parameters.encodings.size()); 9695 EXPECT_EQ(rtp_parameters.encodings[0].rid, "f"); 9696 EXPECT_EQ(rtp_parameters.encodings[1].rid, "h"); 9697 EXPECT_EQ(rtp_parameters.encodings[2].rid, "q"); 9698 9699 EXPECT_TRUE( 9700 send_channel_->SetRtpSendParameters(last_ssrc_, rtp_parameters).ok()); 9701 EXPECT_THAT(stream->GetKeyFramesRequested(), 9702 ElementsAreArray(std::vector<std::string>({}))); 9703 9704 rtp_parameters.encodings[0].request_key_frame = true; 9705 EXPECT_TRUE( 9706 send_channel_->SetRtpSendParameters(last_ssrc_, rtp_parameters).ok()); 9707 EXPECT_THAT(stream->GetKeyFramesRequested(), ElementsAreArray({"f"})); 9708 9709 rtp_parameters.encodings[0].request_key_frame = true; 9710 rtp_parameters.encodings[1].request_key_frame = true; 9711 EXPECT_TRUE( 9712 send_channel_->SetRtpSendParameters(last_ssrc_, rtp_parameters).ok()); 9713 EXPECT_THAT(stream->GetKeyFramesRequested(), ElementsAreArray({"f", "h"})); 9714 9715 rtp_parameters.encodings[0].request_key_frame = true; 9716 rtp_parameters.encodings[1].request_key_frame = true; 9717 rtp_parameters.encodings[2].request_key_frame = true; 9718 EXPECT_TRUE( 9719 send_channel_->SetRtpSendParameters(last_ssrc_, rtp_parameters).ok()); 9720 EXPECT_THAT(stream->GetKeyFramesRequested(), 9721 ElementsAreArray({"f", "h", "q"})); 9722 9723 rtp_parameters.encodings[0].request_key_frame = true; 9724 rtp_parameters.encodings[1].request_key_frame = false; 9725 rtp_parameters.encodings[2].request_key_frame = true; 9726 EXPECT_TRUE( 9727 send_channel_->SetRtpSendParameters(last_ssrc_, rtp_parameters).ok()); 9728 EXPECT_THAT(stream->GetKeyFramesRequested(), ElementsAreArray({"f", "q"})); 9729 9730 rtp_parameters.encodings[0].request_key_frame = false; 9731 rtp_parameters.encodings[1].request_key_frame = false; 9732 rtp_parameters.encodings[2].request_key_frame = true; 9733 EXPECT_TRUE( 9734 send_channel_->SetRtpSendParameters(last_ssrc_, rtp_parameters).ok()); 9735 EXPECT_THAT(stream->GetKeyFramesRequested(), ElementsAreArray({"q"})); 9736 } 9737 9738 class WebRtcVideoChannelSimulcastTest : public ::testing::Test { 9739 public: 9740 WebRtcVideoChannelSimulcastTest() 9741 : env_(CreateTestEnvironment()), 9742 fake_call_(env_), 9743 encoder_factory_(new FakeWebRtcVideoEncoderFactory), 9744 decoder_factory_(new FakeWebRtcVideoDecoderFactory), 9745 mock_rate_allocator_factory_( 9746 std::make_unique<MockVideoBitrateAllocatorFactory>()), 9747 engine_( 9748 std::unique_ptr<FakeWebRtcVideoEncoderFactory>(encoder_factory_), 9749 std::unique_ptr<FakeWebRtcVideoDecoderFactory>(decoder_factory_), 9750 env_.field_trials()), 9751 last_ssrc_(0) {} 9752 9753 void SetUp() override { 9754 encoder_factory_->AddSupportedVideoCodecType("VP8"); 9755 decoder_factory_->AddSupportedVideoCodecType("VP8"); 9756 send_channel_ = engine_.CreateSendChannel( 9757 env_, &fake_call_, GetMediaConfig(), VideoOptions(), CryptoOptions(), 9758 mock_rate_allocator_factory_.get()); 9759 receive_channel_ = engine_.CreateReceiveChannel( 9760 env_, &fake_call_, GetMediaConfig(), VideoOptions(), CryptoOptions()); 9761 send_channel_->OnReadyToSend(true); 9762 receive_channel_->SetReceive(true); 9763 last_ssrc_ = 123; 9764 } 9765 9766 protected: 9767 void VerifySimulcastSettings(const Codec& codec_in, 9768 int capture_width, 9769 int capture_height, 9770 size_t num_configured_streams, 9771 size_t expected_num_streams, 9772 bool screenshare, 9773 bool conference_mode) { 9774 VideoSenderParameters parameters; 9775 // The codec ID does not matter, but must be valid. 9776 Codec codec = codec_in; 9777 codec.id = 123; 9778 parameters.codecs.push_back(codec); 9779 parameters.conference_mode = conference_mode; 9780 ASSERT_TRUE(send_channel_->SetSenderParameters(parameters)); 9781 9782 std::vector<uint32_t> ssrcs = MAKE_VECTOR(kSsrcs3); 9783 RTC_DCHECK(num_configured_streams <= ssrcs.size()); 9784 ssrcs.resize(num_configured_streams); 9785 9786 AddSendStream(CreateSimStreamParams("cname", ssrcs)); 9787 // Send a full-size frame to trigger a stream reconfiguration to use all 9788 // expected simulcast layers. 9789 FrameForwarder frame_forwarder; 9790 FakeFrameSource frame_source(capture_width, capture_height, 9791 kNumMicrosecsPerSec / 30); 9792 9793 VideoOptions options; 9794 if (screenshare) 9795 options.is_screencast = screenshare; 9796 EXPECT_TRUE( 9797 send_channel_->SetVideoSend(ssrcs.front(), &options, &frame_forwarder)); 9798 // Fetch the latest stream since SetVideoSend() may recreate it if the 9799 // screen content setting is changed. 9800 FakeVideoSendStream* stream = fake_call_.GetVideoSendStreams().front(); 9801 send_channel_->SetSend(true); 9802 frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame()); 9803 9804 auto rtp_parameters = send_channel_->GetRtpSendParameters(kSsrcs3[0]); 9805 EXPECT_EQ(num_configured_streams, rtp_parameters.encodings.size()); 9806 9807 std::vector<VideoStream> video_streams = stream->GetVideoStreams(); 9808 ASSERT_EQ(expected_num_streams, video_streams.size()); 9809 EXPECT_LE(expected_num_streams, stream->GetConfig().rtp.ssrcs.size()); 9810 9811 std::vector<VideoStream> expected_streams; 9812 if (num_configured_streams > 1 || conference_mode) { 9813 const VideoEncoderConfig& encoder_config = stream->GetEncoderConfig(); 9814 VideoEncoder::EncoderInfo encoder_info; 9815 auto factory = make_ref_counted<EncoderStreamFactory>(encoder_info); 9816 expected_streams = factory->CreateEncoderStreams( 9817 env_.field_trials(), capture_width, capture_height, encoder_config); 9818 if (screenshare && conference_mode) { 9819 for (const VideoStream& expected_stream : expected_streams) { 9820 // Never scale screen content. 9821 EXPECT_EQ(expected_stream.width, checked_cast<size_t>(capture_width)); 9822 EXPECT_EQ(expected_stream.height, 9823 checked_cast<size_t>(capture_height)); 9824 } 9825 } 9826 } else { 9827 VideoStream expected_stream; 9828 expected_stream.width = capture_width; 9829 expected_stream.height = capture_height; 9830 expected_stream.max_framerate = kDefaultVideoMaxFramerate; 9831 expected_stream.min_bitrate_bps = kDefaultMinVideoBitrateBps; 9832 expected_stream.target_bitrate_bps = expected_stream.max_bitrate_bps = 9833 GetMaxDefaultBitrateBps(capture_width, capture_height); 9834 expected_stream.max_qp = kDefaultVideoMaxQpVpx; 9835 expected_streams.push_back(expected_stream); 9836 } 9837 9838 ASSERT_EQ(expected_streams.size(), video_streams.size()); 9839 9840 size_t num_streams = video_streams.size(); 9841 for (size_t i = 0; i < num_streams; ++i) { 9842 EXPECT_EQ(expected_streams[i].width, video_streams[i].width); 9843 EXPECT_EQ(expected_streams[i].height, video_streams[i].height); 9844 9845 EXPECT_GT(video_streams[i].max_framerate, 0); 9846 EXPECT_EQ(expected_streams[i].max_framerate, 9847 video_streams[i].max_framerate); 9848 9849 EXPECT_GT(video_streams[i].min_bitrate_bps, 0); 9850 EXPECT_EQ(expected_streams[i].min_bitrate_bps, 9851 video_streams[i].min_bitrate_bps); 9852 9853 EXPECT_GT(video_streams[i].target_bitrate_bps, 0); 9854 EXPECT_EQ(expected_streams[i].target_bitrate_bps, 9855 video_streams[i].target_bitrate_bps); 9856 9857 EXPECT_GT(video_streams[i].max_bitrate_bps, 0); 9858 EXPECT_EQ(expected_streams[i].max_bitrate_bps, 9859 video_streams[i].max_bitrate_bps); 9860 9861 EXPECT_GT(video_streams[i].max_qp, 0); 9862 EXPECT_EQ(video_streams[i].max_qp, kDefaultVideoMaxQpVpx); 9863 9864 EXPECT_EQ(num_configured_streams > 1 || conference_mode, 9865 expected_streams[i].num_temporal_layers.has_value()); 9866 9867 if (conference_mode) { 9868 EXPECT_EQ(expected_streams[i].num_temporal_layers, 9869 video_streams[i].num_temporal_layers); 9870 } 9871 } 9872 9873 EXPECT_TRUE(send_channel_->SetVideoSend(ssrcs.front(), nullptr, nullptr)); 9874 } 9875 9876 FakeVideoSendStream* AddSendStream() { 9877 return AddSendStream(StreamParams::CreateLegacy(last_ssrc_++)); 9878 } 9879 9880 FakeVideoSendStream* AddSendStream(const StreamParams& sp) { 9881 size_t num_streams = fake_call_.GetVideoSendStreams().size(); 9882 EXPECT_TRUE(send_channel_->AddSendStream(sp)); 9883 std::vector<FakeVideoSendStream*> streams = 9884 fake_call_.GetVideoSendStreams(); 9885 EXPECT_EQ(num_streams + 1, streams.size()); 9886 return streams[streams.size() - 1]; 9887 } 9888 9889 std::vector<FakeVideoSendStream*> GetFakeSendStreams() { 9890 return fake_call_.GetVideoSendStreams(); 9891 } 9892 9893 FakeVideoReceiveStream* AddRecvStream() { 9894 return AddRecvStream(StreamParams::CreateLegacy(last_ssrc_++)); 9895 } 9896 9897 FakeVideoReceiveStream* AddRecvStream(const StreamParams& sp) { 9898 size_t num_streams = fake_call_.GetVideoReceiveStreams().size(); 9899 EXPECT_TRUE(receive_channel_->AddRecvStream(sp)); 9900 std::vector<FakeVideoReceiveStream*> streams = 9901 fake_call_.GetVideoReceiveStreams(); 9902 EXPECT_EQ(num_streams + 1, streams.size()); 9903 return streams[streams.size() - 1]; 9904 } 9905 9906 Environment env_; 9907 FakeCall fake_call_; 9908 FakeWebRtcVideoEncoderFactory* encoder_factory_; 9909 FakeWebRtcVideoDecoderFactory* decoder_factory_; 9910 std::unique_ptr<MockVideoBitrateAllocatorFactory> 9911 mock_rate_allocator_factory_; 9912 WebRtcVideoEngine engine_; 9913 std::unique_ptr<VideoMediaSendChannelInterface> send_channel_; 9914 std::unique_ptr<VideoMediaReceiveChannelInterface> receive_channel_; 9915 uint32_t last_ssrc_; 9916 }; 9917 9918 TEST_F(WebRtcVideoChannelSimulcastTest, SetSendCodecsWith2SimulcastStreams) { 9919 VerifySimulcastSettings(CreateVideoCodec("VP8"), 640, 360, 2, 2, false, true); 9920 } 9921 9922 TEST_F(WebRtcVideoChannelSimulcastTest, SetSendCodecsWith3SimulcastStreams) { 9923 VerifySimulcastSettings(CreateVideoCodec("VP8"), 1280, 720, 3, 3, false, 9924 true); 9925 } 9926 9927 // Test that we normalize send codec format size in simulcast. 9928 TEST_F(WebRtcVideoChannelSimulcastTest, SetSendCodecsWithOddSizeInSimulcast) { 9929 VerifySimulcastSettings(CreateVideoCodec("VP8"), 541, 271, 2, 2, false, true); 9930 } 9931 9932 TEST_F(WebRtcVideoChannelSimulcastTest, SetSendCodecsForScreenshare) { 9933 VerifySimulcastSettings(CreateVideoCodec("VP8"), 1280, 720, 3, 3, true, 9934 false); 9935 } 9936 9937 TEST_F(WebRtcVideoChannelSimulcastTest, SetSendCodecsForSimulcastScreenshare) { 9938 VerifySimulcastSettings(CreateVideoCodec("VP8"), 1280, 720, 3, 2, true, true); 9939 } 9940 9941 TEST_F(WebRtcVideoChannelSimulcastTest, SimulcastScreenshareWithoutConference) { 9942 VerifySimulcastSettings(CreateVideoCodec("VP8"), 1280, 720, 3, 3, true, 9943 false); 9944 } 9945 9946 TEST_F(WebRtcVideoChannelBaseTest, GetSources) { 9947 EXPECT_THAT(receive_channel_->GetSources(kSsrc), IsEmpty()); 9948 9949 receive_channel_->SetDefaultSink(&renderer_); 9950 EXPECT_TRUE(SetDefaultCodec()); 9951 EXPECT_TRUE(SetSend(true)); 9952 EXPECT_EQ(renderer_.num_rendered_frames(), 0); 9953 9954 // Send and receive one frame. 9955 SendFrame(); 9956 EXPECT_FRAME(1, kVideoWidth, kVideoHeight); 9957 9958 EXPECT_THAT(receive_channel_->GetSources(kSsrc - 1), IsEmpty()); 9959 EXPECT_THAT(receive_channel_->GetSources(kSsrc), SizeIs(1)); 9960 EXPECT_THAT(receive_channel_->GetSources(kSsrc + 1), IsEmpty()); 9961 9962 RtpSource source = receive_channel_->GetSources(kSsrc)[0]; 9963 EXPECT_EQ(source.source_id(), kSsrc); 9964 EXPECT_EQ(source.source_type(), RtpSourceType::SSRC); 9965 int64_t rtp_timestamp_1 = source.rtp_timestamp(); 9966 Timestamp timestamp_1 = source.timestamp(); 9967 9968 // Send and receive another frame. 9969 SendFrame(); 9970 EXPECT_FRAME(2, kVideoWidth, kVideoHeight); 9971 9972 EXPECT_THAT(receive_channel_->GetSources(kSsrc - 1), IsEmpty()); 9973 EXPECT_THAT(receive_channel_->GetSources(kSsrc), SizeIs(1)); 9974 EXPECT_THAT(receive_channel_->GetSources(kSsrc + 1), IsEmpty()); 9975 9976 source = receive_channel_->GetSources(kSsrc)[0]; 9977 EXPECT_EQ(source.source_id(), kSsrc); 9978 EXPECT_EQ(source.source_type(), RtpSourceType::SSRC); 9979 int64_t rtp_timestamp_2 = source.rtp_timestamp(); 9980 Timestamp timestamp_2 = source.timestamp(); 9981 9982 EXPECT_GT(rtp_timestamp_2, rtp_timestamp_1); 9983 EXPECT_GT(timestamp_2, timestamp_1); 9984 } 9985 9986 TEST_F(WebRtcVideoChannelTest, SetsRidsOnSendStream) { 9987 StreamParams sp = CreateSimStreamParams("cname", {123, 456, 789}); 9988 9989 std::vector<std::string> rids = {"f", "h", "q"}; 9990 std::vector<RidDescription> rid_descriptions; 9991 for (const auto& rid : rids) { 9992 rid_descriptions.emplace_back(rid, RidDirection::kSend); 9993 } 9994 sp.set_rids(rid_descriptions); 9995 9996 ASSERT_TRUE(send_channel_->AddSendStream(sp)); 9997 const auto& streams = fake_call_->GetVideoSendStreams(); 9998 ASSERT_EQ(1u, streams.size()); 9999 auto stream = streams[0]; 10000 ASSERT_NE(stream, nullptr); 10001 const auto& config = stream->GetConfig(); 10002 EXPECT_THAT(config.rtp.rids, ElementsAreArray(rids)); 10003 } 10004 10005 TEST_F(WebRtcVideoChannelBaseTest, EncoderSelectorSwitchCodec) { 10006 Codec vp9 = GetEngineCodec("VP9"); 10007 10008 VideoSenderParameters parameters; 10009 parameters.codecs.push_back(GetEngineCodec("VP8")); 10010 parameters.codecs.push_back(vp9); 10011 EXPECT_TRUE(send_channel_->SetSenderParameters(parameters)); 10012 send_channel_->SetSend(true); 10013 10014 std::optional<Codec> codec = send_channel_->GetSendCodec(); 10015 ASSERT_TRUE(codec); 10016 EXPECT_EQ("VP8", codec->name); 10017 10018 MockEncoderSelector encoder_selector; 10019 EXPECT_CALL(encoder_selector, OnAvailableBitrate) 10020 .WillRepeatedly(Return(SdpVideoFormat::VP9Profile0())); 10021 10022 send_channel_->SetEncoderSelector(kSsrc, &encoder_selector); 10023 time_controller_.AdvanceTime(kFrameDuration); 10024 10025 codec = send_channel_->GetSendCodec(); 10026 ASSERT_TRUE(codec); 10027 EXPECT_EQ("VP9", codec->name); 10028 10029 // Deregister the encoder selector in case it's called during test tear-down. 10030 send_channel_->SetEncoderSelector(kSsrc, nullptr); 10031 } 10032 10033 TEST_F(WebRtcVideoChannelTest, ScaleResolutionDownToSinglecast) { 10034 VideoSenderParameters parameters; 10035 parameters.codecs.push_back(GetEngineCodec("VP8")); 10036 ASSERT_TRUE(send_channel_->SetSenderParameters(parameters)); 10037 10038 FakeVideoSendStream* stream = AddSendStream(); 10039 FrameForwarder frame_forwarder; 10040 FakeFrameSource frame_source(1280, 720, kNumMicrosecsPerSec / 30); 10041 EXPECT_TRUE( 10042 send_channel_->SetVideoSend(last_ssrc_, nullptr, &frame_forwarder)); 10043 10044 { // TEST scale_resolution_down_to < frame size 10045 RtpParameters rtp_parameters = 10046 send_channel_->GetRtpSendParameters(last_ssrc_); 10047 EXPECT_EQ(1UL, rtp_parameters.encodings.size()); 10048 rtp_parameters.encodings[0].scale_resolution_down_to = {.width = 640, 10049 .height = 360}; 10050 send_channel_->SetRtpSendParameters(last_ssrc_, rtp_parameters); 10051 10052 frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame()); 10053 10054 auto streams = stream->GetVideoStreams(); 10055 ASSERT_EQ(streams.size(), 1u); 10056 EXPECT_EQ(checked_cast<size_t>(640), streams[0].width); 10057 EXPECT_EQ(checked_cast<size_t>(360), streams[0].height); 10058 } 10059 10060 { // TEST scale_resolution_down_to == frame size 10061 auto rtp_parameters = send_channel_->GetRtpSendParameters(last_ssrc_); 10062 EXPECT_EQ(1UL, rtp_parameters.encodings.size()); 10063 rtp_parameters.encodings[0].scale_resolution_down_to = {.width = 1280, 10064 .height = 720}; 10065 send_channel_->SetRtpSendParameters(last_ssrc_, rtp_parameters); 10066 10067 frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame()); 10068 auto streams = stream->GetVideoStreams(); 10069 ASSERT_EQ(streams.size(), 1u); 10070 EXPECT_EQ(checked_cast<size_t>(1280), streams[0].width); 10071 EXPECT_EQ(checked_cast<size_t>(720), streams[0].height); 10072 } 10073 10074 { // TEST scale_resolution_down_to > frame size 10075 auto rtp_parameters = send_channel_->GetRtpSendParameters(last_ssrc_); 10076 EXPECT_EQ(1UL, rtp_parameters.encodings.size()); 10077 rtp_parameters.encodings[0].scale_resolution_down_to = {.width = 2 * 1280, 10078 .height = 2 * 720}; 10079 send_channel_->SetRtpSendParameters(last_ssrc_, rtp_parameters); 10080 10081 frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame()); 10082 auto streams = stream->GetVideoStreams(); 10083 ASSERT_EQ(streams.size(), 1u); 10084 EXPECT_EQ(checked_cast<size_t>(1280), streams[0].width); 10085 EXPECT_EQ(checked_cast<size_t>(720), streams[0].height); 10086 } 10087 10088 EXPECT_TRUE(send_channel_->SetVideoSend(last_ssrc_, nullptr, nullptr)); 10089 } 10090 10091 TEST_F(WebRtcVideoChannelTest, ScaleResolutionDownToSinglecastScaling) { 10092 VideoSenderParameters parameters; 10093 parameters.codecs.push_back(GetEngineCodec("VP8")); 10094 ASSERT_TRUE(send_channel_->SetSenderParameters(parameters)); 10095 10096 FakeVideoSendStream* stream = AddSendStream(); 10097 FrameForwarder frame_forwarder; 10098 FakeFrameSource frame_source(1280, 720, kNumMicrosecsPerSec / 30); 10099 EXPECT_TRUE( 10100 send_channel_->SetVideoSend(last_ssrc_, nullptr, &frame_forwarder)); 10101 10102 { 10103 auto rtp_parameters = send_channel_->GetRtpSendParameters(last_ssrc_); 10104 EXPECT_EQ(1UL, rtp_parameters.encodings.size()); 10105 rtp_parameters.encodings[0].scale_resolution_down_to = {.width = 720, 10106 .height = 720}; 10107 send_channel_->SetRtpSendParameters(last_ssrc_, rtp_parameters); 10108 10109 frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame()); 10110 10111 auto streams = stream->GetVideoStreams(); 10112 ASSERT_EQ(streams.size(), 1u); 10113 // The scaling factor is 720/1280 because of orientation, 10114 // scaling the height (720) by this value gets you 405p. 10115 EXPECT_EQ(checked_cast<size_t>(720), streams[0].width); 10116 EXPECT_EQ(checked_cast<size_t>(405), streams[0].height); 10117 } 10118 10119 { 10120 auto rtp_parameters = send_channel_->GetRtpSendParameters(last_ssrc_); 10121 EXPECT_EQ(1UL, rtp_parameters.encodings.size()); 10122 rtp_parameters.encodings[0].scale_resolution_down_to = {.width = 1280, 10123 .height = 1280}; 10124 send_channel_->SetRtpSendParameters(last_ssrc_, rtp_parameters); 10125 10126 frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame()); 10127 10128 auto streams = stream->GetVideoStreams(); 10129 ASSERT_EQ(streams.size(), 1u); 10130 // No downscale needed to fit 1280x1280. 10131 EXPECT_EQ(checked_cast<size_t>(1280), streams[0].width); 10132 EXPECT_EQ(checked_cast<size_t>(720), streams[0].height); 10133 } 10134 10135 { 10136 auto rtp_parameters = send_channel_->GetRtpSendParameters(last_ssrc_); 10137 EXPECT_EQ(1UL, rtp_parameters.encodings.size()); 10138 rtp_parameters.encodings[0].scale_resolution_down_to = {.width = 650, 10139 .height = 650}; 10140 send_channel_->SetRtpSendParameters(last_ssrc_, rtp_parameters); 10141 10142 auto streams = stream->GetVideoStreams(); 10143 ASSERT_EQ(streams.size(), 1u); 10144 // The scaling factor is 650/1280 because of orientation, 10145 // scaling the height (720) by this value gets you 365.625 which is rounded. 10146 EXPECT_EQ(checked_cast<size_t>(650), streams[0].width); 10147 EXPECT_EQ(checked_cast<size_t>(366), streams[0].height); 10148 } 10149 10150 { 10151 auto rtp_parameters = send_channel_->GetRtpSendParameters(last_ssrc_); 10152 EXPECT_EQ(1UL, rtp_parameters.encodings.size()); 10153 rtp_parameters.encodings[0].scale_resolution_down_to = {.width = 2560, 10154 .height = 1440}; 10155 send_channel_->SetRtpSendParameters(last_ssrc_, rtp_parameters); 10156 10157 auto streams = stream->GetVideoStreams(); 10158 ASSERT_EQ(streams.size(), 1u); 10159 // We don't upscale. 10160 EXPECT_EQ(checked_cast<size_t>(1280), streams[0].width); 10161 EXPECT_EQ(checked_cast<size_t>(720), streams[0].height); 10162 } 10163 10164 EXPECT_TRUE(send_channel_->SetVideoSend(last_ssrc_, nullptr, nullptr)); 10165 } 10166 10167 TEST_F(WebRtcVideoChannelTest, ScaleResolutionDownToSimulcast) { 10168 VideoSenderParameters parameters; 10169 parameters.codecs.push_back(GetEngineCodec("VP8")); 10170 ASSERT_TRUE(send_channel_->SetSenderParameters(parameters)); 10171 10172 FakeVideoSendStream* stream = SetUpSimulcast(true, /*with_rtx=*/false); 10173 FrameForwarder frame_forwarder; 10174 FakeFrameSource frame_source(1280, 720, kNumMicrosecsPerSec / 30); 10175 EXPECT_TRUE( 10176 send_channel_->SetVideoSend(last_ssrc_, nullptr, &frame_forwarder)); 10177 10178 { 10179 RtpParameters rtp_parameters = 10180 send_channel_->GetRtpSendParameters(last_ssrc_); 10181 EXPECT_EQ(3UL, rtp_parameters.encodings.size()); 10182 rtp_parameters.encodings[0].scale_resolution_down_to = {.width = 320, 10183 .height = 180}; 10184 rtp_parameters.encodings[1].scale_resolution_down_to = {.width = 640, 10185 .height = 360}; 10186 rtp_parameters.encodings[2].scale_resolution_down_to = {.width = 1280, 10187 .height = 720}; 10188 send_channel_->SetRtpSendParameters(last_ssrc_, rtp_parameters); 10189 10190 frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame()); 10191 10192 EXPECT_EQ(GetStreamResolutions(stream->GetVideoStreams()), 10193 (std::vector<Resolution>{ 10194 {.width = 320, .height = 180}, 10195 {.width = 640, .height = 360}, 10196 {.width = 1280, .height = 720}, 10197 })); 10198 } 10199 10200 { 10201 RtpParameters rtp_parameters = 10202 send_channel_->GetRtpSendParameters(last_ssrc_); 10203 EXPECT_EQ(3UL, rtp_parameters.encodings.size()); 10204 rtp_parameters.encodings[0].scale_resolution_down_to = {.width = 320, 10205 .height = 180}; 10206 rtp_parameters.encodings[1].active = false; 10207 10208 rtp_parameters.encodings[2].scale_resolution_down_to = {.width = 1280, 10209 .height = 720}; 10210 send_channel_->SetRtpSendParameters(last_ssrc_, rtp_parameters); 10211 10212 frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame()); 10213 10214 EXPECT_EQ(GetStreamResolutions(stream->GetVideoStreams()), 10215 (std::vector<Resolution>{ 10216 {.width = 320, .height = 180}, 10217 {.width = 1280, .height = 720}, 10218 })); 10219 } 10220 10221 { 10222 RtpParameters rtp_parameters = 10223 send_channel_->GetRtpSendParameters(last_ssrc_); 10224 EXPECT_EQ(3UL, rtp_parameters.encodings.size()); 10225 rtp_parameters.encodings[0].scale_resolution_down_to = {.width = 320, 10226 .height = 180}; 10227 rtp_parameters.encodings[1].active = true; 10228 rtp_parameters.encodings[1].scale_resolution_down_to = {.width = 640, 10229 .height = 360}; 10230 rtp_parameters.encodings[2].scale_resolution_down_to = {.width = 960, 10231 .height = 540}; 10232 send_channel_->SetRtpSendParameters(last_ssrc_, rtp_parameters); 10233 10234 frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame()); 10235 10236 EXPECT_EQ(GetStreamResolutions(stream->GetVideoStreams()), 10237 (std::vector<Resolution>{ 10238 {.width = 320, .height = 180}, 10239 {.width = 640, .height = 360}, 10240 {.width = 960, .height = 540}, 10241 })); 10242 } 10243 10244 EXPECT_TRUE(send_channel_->SetVideoSend(last_ssrc_, nullptr, nullptr)); 10245 } 10246 10247 } // namespace 10248 } // namespace webrtc