tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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