Home | History | Annotate | Download | only in video
      1 /*
      2  *  Copyright (c) 2013 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 #include <algorithm>  // max
     11 #include <vector>
     12 
     13 #include "testing/gtest/include/gtest/gtest.h"
     14 
     15 #include "webrtc/base/bind.h"
     16 #include "webrtc/base/checks.h"
     17 #include "webrtc/base/criticalsection.h"
     18 #include "webrtc/base/event.h"
     19 #include "webrtc/base/logging.h"
     20 #include "webrtc/base/platform_thread.h"
     21 #include "webrtc/base/scoped_ptr.h"
     22 #include "webrtc/call.h"
     23 #include "webrtc/call/transport_adapter.h"
     24 #include "webrtc/frame_callback.h"
     25 #include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h"
     26 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h"
     27 #include "webrtc/modules/rtp_rtcp/source/rtcp_sender.h"
     28 #include "webrtc/modules/rtp_rtcp/source/rtcp_utility.h"
     29 #include "webrtc/modules/rtp_rtcp/source/rtp_format_vp9.h"
     30 #include "webrtc/modules/video_coding/codecs/vp9/include/vp9.h"
     31 #include "webrtc/system_wrappers/include/critical_section_wrapper.h"
     32 #include "webrtc/system_wrappers/include/ref_count.h"
     33 #include "webrtc/system_wrappers/include/sleep.h"
     34 #include "webrtc/test/call_test.h"
     35 #include "webrtc/test/configurable_frame_size_encoder.h"
     36 #include "webrtc/test/fake_texture_frame.h"
     37 #include "webrtc/test/null_transport.h"
     38 #include "webrtc/test/testsupport/perf_test.h"
     39 #include "webrtc/video/send_statistics_proxy.h"
     40 #include "webrtc/video_frame.h"
     41 #include "webrtc/video_send_stream.h"
     42 
     43 namespace webrtc {
     44 
     45 enum VideoFormat { kGeneric, kVP8, };
     46 
     47 void ExpectEqualFrames(const VideoFrame& frame1, const VideoFrame& frame2);
     48 void ExpectEqualTextureFrames(const VideoFrame& frame1,
     49                               const VideoFrame& frame2);
     50 void ExpectEqualBufferFrames(const VideoFrame& frame1,
     51                              const VideoFrame& frame2);
     52 void ExpectEqualFramesVector(const std::vector<VideoFrame>& frames1,
     53                              const std::vector<VideoFrame>& frames2);
     54 VideoFrame CreateVideoFrame(int width, int height, uint8_t data);
     55 
     56 class VideoSendStreamTest : public test::CallTest {
     57  protected:
     58   void TestNackRetransmission(uint32_t retransmit_ssrc,
     59                               uint8_t retransmit_payload_type);
     60   void TestPacketFragmentationSize(VideoFormat format, bool with_fec);
     61 
     62   void TestVp9NonFlexMode(uint8_t num_temporal_layers,
     63                           uint8_t num_spatial_layers);
     64 };
     65 
     66 TEST_F(VideoSendStreamTest, CanStartStartedStream) {
     67   Call::Config call_config;
     68   CreateSenderCall(call_config);
     69 
     70   test::NullTransport transport;
     71   CreateSendConfig(1, 0, &transport);
     72   CreateVideoStreams();
     73   video_send_stream_->Start();
     74   video_send_stream_->Start();
     75   DestroyStreams();
     76 }
     77 
     78 TEST_F(VideoSendStreamTest, CanStopStoppedStream) {
     79   Call::Config call_config;
     80   CreateSenderCall(call_config);
     81 
     82   test::NullTransport transport;
     83   CreateSendConfig(1, 0, &transport);
     84   CreateVideoStreams();
     85   video_send_stream_->Stop();
     86   video_send_stream_->Stop();
     87   DestroyStreams();
     88 }
     89 
     90 TEST_F(VideoSendStreamTest, SupportsCName) {
     91   static std::string kCName = "PjQatC14dGfbVwGPUOA9IH7RlsFDbWl4AhXEiDsBizo=";
     92   class CNameObserver : public test::SendTest {
     93    public:
     94     CNameObserver() : SendTest(kDefaultTimeoutMs) {}
     95 
     96    private:
     97     Action OnSendRtcp(const uint8_t* packet, size_t length) override {
     98       RTCPUtility::RTCPParserV2 parser(packet, length, true);
     99       EXPECT_TRUE(parser.IsValid());
    100 
    101       RTCPUtility::RTCPPacketTypes packet_type = parser.Begin();
    102       while (packet_type != RTCPUtility::RTCPPacketTypes::kInvalid) {
    103         if (packet_type == RTCPUtility::RTCPPacketTypes::kSdesChunk) {
    104           EXPECT_EQ(parser.Packet().CName.CName, kCName);
    105           observation_complete_.Set();
    106         }
    107 
    108         packet_type = parser.Iterate();
    109       }
    110 
    111       return SEND_PACKET;
    112     }
    113 
    114     void ModifyVideoConfigs(
    115         VideoSendStream::Config* send_config,
    116         std::vector<VideoReceiveStream::Config>* receive_configs,
    117         VideoEncoderConfig* encoder_config) override {
    118       send_config->rtp.c_name = kCName;
    119     }
    120 
    121     void PerformTest() override {
    122       EXPECT_TRUE(Wait()) << "Timed out while waiting for RTCP with CNAME.";
    123     }
    124   } test;
    125 
    126   RunBaseTest(&test);
    127 }
    128 
    129 TEST_F(VideoSendStreamTest, SupportsAbsoluteSendTime) {
    130   class AbsoluteSendTimeObserver : public test::SendTest {
    131    public:
    132     AbsoluteSendTimeObserver() : SendTest(kDefaultTimeoutMs) {
    133       EXPECT_TRUE(parser_->RegisterRtpHeaderExtension(
    134           kRtpExtensionAbsoluteSendTime, test::kAbsSendTimeExtensionId));
    135     }
    136 
    137     Action OnSendRtp(const uint8_t* packet, size_t length) override {
    138       RTPHeader header;
    139       EXPECT_TRUE(parser_->Parse(packet, length, &header));
    140 
    141       EXPECT_FALSE(header.extension.hasTransmissionTimeOffset);
    142       EXPECT_TRUE(header.extension.hasAbsoluteSendTime);
    143       EXPECT_EQ(header.extension.transmissionTimeOffset, 0);
    144       EXPECT_GT(header.extension.absoluteSendTime, 0u);
    145       observation_complete_.Set();
    146 
    147       return SEND_PACKET;
    148     }
    149 
    150     void ModifyVideoConfigs(
    151         VideoSendStream::Config* send_config,
    152         std::vector<VideoReceiveStream::Config>* receive_configs,
    153         VideoEncoderConfig* encoder_config) override {
    154       send_config->rtp.extensions.clear();
    155       send_config->rtp.extensions.push_back(RtpExtension(
    156           RtpExtension::kAbsSendTime, test::kAbsSendTimeExtensionId));
    157     }
    158 
    159     void PerformTest() override {
    160       EXPECT_TRUE(Wait()) << "Timed out while waiting for single RTP packet.";
    161     }
    162   } test;
    163 
    164   RunBaseTest(&test);
    165 }
    166 
    167 TEST_F(VideoSendStreamTest, SupportsTransmissionTimeOffset) {
    168   static const int kEncodeDelayMs = 5;
    169   class TransmissionTimeOffsetObserver : public test::SendTest {
    170    public:
    171     TransmissionTimeOffsetObserver()
    172         : SendTest(kDefaultTimeoutMs),
    173           encoder_(Clock::GetRealTimeClock(), kEncodeDelayMs) {
    174       EXPECT_TRUE(parser_->RegisterRtpHeaderExtension(
    175           kRtpExtensionTransmissionTimeOffset, test::kTOffsetExtensionId));
    176     }
    177 
    178    private:
    179     Action OnSendRtp(const uint8_t* packet, size_t length) override {
    180       RTPHeader header;
    181       EXPECT_TRUE(parser_->Parse(packet, length, &header));
    182 
    183       EXPECT_TRUE(header.extension.hasTransmissionTimeOffset);
    184       EXPECT_FALSE(header.extension.hasAbsoluteSendTime);
    185       EXPECT_GT(header.extension.transmissionTimeOffset, 0);
    186       EXPECT_EQ(header.extension.absoluteSendTime, 0u);
    187       observation_complete_.Set();
    188 
    189       return SEND_PACKET;
    190     }
    191 
    192     void ModifyVideoConfigs(
    193         VideoSendStream::Config* send_config,
    194         std::vector<VideoReceiveStream::Config>* receive_configs,
    195         VideoEncoderConfig* encoder_config) override {
    196       send_config->encoder_settings.encoder = &encoder_;
    197       send_config->rtp.extensions.clear();
    198       send_config->rtp.extensions.push_back(
    199           RtpExtension(RtpExtension::kTOffset, test::kTOffsetExtensionId));
    200     }
    201 
    202     void PerformTest() override {
    203       EXPECT_TRUE(Wait()) << "Timed out while waiting for a single RTP packet.";
    204     }
    205 
    206     test::DelayedEncoder encoder_;
    207   } test;
    208 
    209   RunBaseTest(&test);
    210 }
    211 
    212 TEST_F(VideoSendStreamTest, SupportsTransportWideSequenceNumbers) {
    213   static const uint8_t kExtensionId = 13;
    214   class TransportWideSequenceNumberObserver : public test::SendTest {
    215    public:
    216     TransportWideSequenceNumberObserver()
    217         : SendTest(kDefaultTimeoutMs), encoder_(Clock::GetRealTimeClock()) {
    218       EXPECT_TRUE(parser_->RegisterRtpHeaderExtension(
    219           kRtpExtensionTransportSequenceNumber, kExtensionId));
    220     }
    221 
    222    private:
    223     Action OnSendRtp(const uint8_t* packet, size_t length) override {
    224       RTPHeader header;
    225       EXPECT_TRUE(parser_->Parse(packet, length, &header));
    226 
    227       EXPECT_TRUE(header.extension.hasTransportSequenceNumber);
    228       EXPECT_FALSE(header.extension.hasTransmissionTimeOffset);
    229       EXPECT_FALSE(header.extension.hasAbsoluteSendTime);
    230 
    231       observation_complete_.Set();
    232 
    233       return SEND_PACKET;
    234     }
    235 
    236     void ModifyVideoConfigs(
    237         VideoSendStream::Config* send_config,
    238         std::vector<VideoReceiveStream::Config>* receive_configs,
    239         VideoEncoderConfig* encoder_config) override {
    240       send_config->encoder_settings.encoder = &encoder_;
    241       send_config->rtp.extensions.clear();
    242       send_config->rtp.extensions.push_back(
    243           RtpExtension(RtpExtension::kTransportSequenceNumber, kExtensionId));
    244     }
    245 
    246     void PerformTest() override {
    247       EXPECT_TRUE(Wait()) << "Timed out while waiting for a single RTP packet.";
    248     }
    249 
    250     test::FakeEncoder encoder_;
    251   } test;
    252 
    253   RunBaseTest(&test);
    254 }
    255 
    256 class FakeReceiveStatistics : public NullReceiveStatistics {
    257  public:
    258   FakeReceiveStatistics(uint32_t send_ssrc,
    259                         uint32_t last_sequence_number,
    260                         uint32_t cumulative_lost,
    261                         uint8_t fraction_lost)
    262       : lossy_stats_(new LossyStatistician(last_sequence_number,
    263                                            cumulative_lost,
    264                                            fraction_lost)) {
    265     stats_map_[send_ssrc] = lossy_stats_.get();
    266   }
    267 
    268   StatisticianMap GetActiveStatisticians() const override { return stats_map_; }
    269 
    270   StreamStatistician* GetStatistician(uint32_t ssrc) const override {
    271     return lossy_stats_.get();
    272   }
    273 
    274  private:
    275   class LossyStatistician : public StreamStatistician {
    276    public:
    277     LossyStatistician(uint32_t extended_max_sequence_number,
    278                       uint32_t cumulative_lost,
    279                       uint8_t fraction_lost) {
    280       stats_.fraction_lost = fraction_lost;
    281       stats_.cumulative_lost = cumulative_lost;
    282       stats_.extended_max_sequence_number = extended_max_sequence_number;
    283     }
    284     bool GetStatistics(RtcpStatistics* statistics, bool reset) override {
    285       *statistics = stats_;
    286       return true;
    287     }
    288     void GetDataCounters(size_t* bytes_received,
    289                          uint32_t* packets_received) const override {
    290       *bytes_received = 0;
    291       *packets_received = 0;
    292     }
    293     void GetReceiveStreamDataCounters(
    294         StreamDataCounters* data_counters) const override {}
    295     uint32_t BitrateReceived() const override { return 0; }
    296     bool IsRetransmitOfOldPacket(const RTPHeader& header,
    297                                  int64_t min_rtt) const override {
    298       return false;
    299     }
    300 
    301     bool IsPacketInOrder(uint16_t sequence_number) const override {
    302       return true;
    303     }
    304 
    305     RtcpStatistics stats_;
    306   };
    307 
    308   rtc::scoped_ptr<LossyStatistician> lossy_stats_;
    309   StatisticianMap stats_map_;
    310 };
    311 
    312 class FecObserver : public test::SendTest {
    313  public:
    314   explicit FecObserver(bool header_extensions_enabled)
    315       : SendTest(VideoSendStreamTest::kDefaultTimeoutMs),
    316         send_count_(0),
    317         received_media_(false),
    318         received_fec_(false),
    319         header_extensions_enabled_(header_extensions_enabled) {}
    320 
    321  private:
    322   Action OnSendRtp(const uint8_t* packet, size_t length) override {
    323     RTPHeader header;
    324     EXPECT_TRUE(parser_->Parse(packet, length, &header));
    325 
    326     // Send lossy receive reports to trigger FEC enabling.
    327     if (send_count_++ % 2 != 0) {
    328       // Receive statistics reporting having lost 50% of the packets.
    329       FakeReceiveStatistics lossy_receive_stats(
    330           VideoSendStreamTest::kVideoSendSsrcs[0], header.sequenceNumber,
    331           send_count_ / 2, 127);
    332       RTCPSender rtcp_sender(false, Clock::GetRealTimeClock(),
    333                              &lossy_receive_stats, nullptr,
    334                              transport_adapter_.get());
    335 
    336       rtcp_sender.SetRTCPStatus(RtcpMode::kReducedSize);
    337       rtcp_sender.SetRemoteSSRC(VideoSendStreamTest::kVideoSendSsrcs[0]);
    338 
    339       RTCPSender::FeedbackState feedback_state;
    340 
    341       EXPECT_EQ(0, rtcp_sender.SendRTCP(feedback_state, kRtcpRr));
    342     }
    343 
    344     int encapsulated_payload_type = -1;
    345     if (header.payloadType == VideoSendStreamTest::kRedPayloadType) {
    346       encapsulated_payload_type = static_cast<int>(packet[header.headerLength]);
    347       if (encapsulated_payload_type !=
    348           VideoSendStreamTest::kFakeVideoSendPayloadType)
    349         EXPECT_EQ(VideoSendStreamTest::kUlpfecPayloadType,
    350                   encapsulated_payload_type);
    351     } else {
    352       EXPECT_EQ(VideoSendStreamTest::kFakeVideoSendPayloadType,
    353                 header.payloadType);
    354     }
    355 
    356     if (header_extensions_enabled_) {
    357       EXPECT_TRUE(header.extension.hasAbsoluteSendTime);
    358       uint32_t kHalf24BitsSpace = 0xFFFFFF / 2;
    359       if (header.extension.absoluteSendTime <= kHalf24BitsSpace &&
    360           prev_header_.extension.absoluteSendTime > kHalf24BitsSpace) {
    361         // 24 bits wrap.
    362         EXPECT_GT(prev_header_.extension.absoluteSendTime,
    363                   header.extension.absoluteSendTime);
    364       } else {
    365         EXPECT_GE(header.extension.absoluteSendTime,
    366                   prev_header_.extension.absoluteSendTime);
    367       }
    368       EXPECT_TRUE(header.extension.hasTransportSequenceNumber);
    369       uint16_t seq_num_diff = header.extension.transportSequenceNumber -
    370                               prev_header_.extension.transportSequenceNumber;
    371       EXPECT_EQ(1, seq_num_diff);
    372     }
    373 
    374     if (encapsulated_payload_type != -1) {
    375       if (encapsulated_payload_type ==
    376           VideoSendStreamTest::kUlpfecPayloadType) {
    377         received_fec_ = true;
    378       } else {
    379         received_media_ = true;
    380       }
    381     }
    382 
    383     if (received_media_ && received_fec_ && send_count_ > 100)
    384       observation_complete_.Set();
    385 
    386     prev_header_ = header;
    387 
    388     return SEND_PACKET;
    389   }
    390 
    391   void ModifyVideoConfigs(
    392       VideoSendStream::Config* send_config,
    393       std::vector<VideoReceiveStream::Config>* receive_configs,
    394       VideoEncoderConfig* encoder_config) override {
    395     transport_adapter_.reset(
    396         new internal::TransportAdapter(send_config->send_transport));
    397     transport_adapter_->Enable();
    398     send_config->rtp.fec.red_payload_type =
    399         VideoSendStreamTest::kRedPayloadType;
    400     send_config->rtp.fec.ulpfec_payload_type =
    401         VideoSendStreamTest::kUlpfecPayloadType;
    402     if (header_extensions_enabled_) {
    403       send_config->rtp.extensions.push_back(RtpExtension(
    404           RtpExtension::kAbsSendTime, test::kAbsSendTimeExtensionId));
    405       send_config->rtp.extensions.push_back(
    406           RtpExtension(RtpExtension::kTransportSequenceNumber,
    407                        test::kTransportSequenceNumberExtensionId));
    408     }
    409   }
    410 
    411   void PerformTest() override {
    412     EXPECT_TRUE(Wait()) << "Timed out waiting for FEC and media packets.";
    413   }
    414 
    415   rtc::scoped_ptr<internal::TransportAdapter> transport_adapter_;
    416   int send_count_;
    417   bool received_media_;
    418   bool received_fec_;
    419   bool header_extensions_enabled_;
    420   RTPHeader prev_header_;
    421 };
    422 
    423 TEST_F(VideoSendStreamTest, SupportsFecWithExtensions) {
    424   FecObserver test(true);
    425 
    426   RunBaseTest(&test);
    427 }
    428 
    429 TEST_F(VideoSendStreamTest, SupportsFecWithoutExtensions) {
    430   FecObserver test(false);
    431 
    432   RunBaseTest(&test);
    433 }
    434 
    435 void VideoSendStreamTest::TestNackRetransmission(
    436     uint32_t retransmit_ssrc,
    437     uint8_t retransmit_payload_type) {
    438   class NackObserver : public test::SendTest {
    439    public:
    440     explicit NackObserver(uint32_t retransmit_ssrc,
    441                           uint8_t retransmit_payload_type)
    442         : SendTest(kDefaultTimeoutMs),
    443           send_count_(0),
    444           retransmit_ssrc_(retransmit_ssrc),
    445           retransmit_payload_type_(retransmit_payload_type),
    446           nacked_sequence_number_(-1) {
    447     }
    448 
    449    private:
    450     Action OnSendRtp(const uint8_t* packet, size_t length) override {
    451       RTPHeader header;
    452       EXPECT_TRUE(parser_->Parse(packet, length, &header));
    453 
    454       // Nack second packet after receiving the third one.
    455       if (++send_count_ == 3) {
    456         uint16_t nack_sequence_number = header.sequenceNumber - 1;
    457         nacked_sequence_number_ = nack_sequence_number;
    458         NullReceiveStatistics null_stats;
    459         RTCPSender rtcp_sender(false, Clock::GetRealTimeClock(), &null_stats,
    460                                nullptr, transport_adapter_.get());
    461 
    462         rtcp_sender.SetRTCPStatus(RtcpMode::kReducedSize);
    463         rtcp_sender.SetRemoteSSRC(kVideoSendSsrcs[0]);
    464 
    465         RTCPSender::FeedbackState feedback_state;
    466 
    467         EXPECT_EQ(0,
    468                   rtcp_sender.SendRTCP(
    469                       feedback_state, kRtcpNack, 1, &nack_sequence_number));
    470       }
    471 
    472       uint16_t sequence_number = header.sequenceNumber;
    473 
    474       if (header.ssrc == retransmit_ssrc_ &&
    475           retransmit_ssrc_ != kVideoSendSsrcs[0]) {
    476         // Not kVideoSendSsrcs[0], assume correct RTX packet. Extract sequence
    477         // number.
    478         const uint8_t* rtx_header = packet + header.headerLength;
    479         sequence_number = (rtx_header[0] << 8) + rtx_header[1];
    480       }
    481 
    482       if (sequence_number == nacked_sequence_number_) {
    483         EXPECT_EQ(retransmit_ssrc_, header.ssrc);
    484         EXPECT_EQ(retransmit_payload_type_, header.payloadType);
    485         observation_complete_.Set();
    486       }
    487 
    488       return SEND_PACKET;
    489     }
    490 
    491     void ModifyVideoConfigs(
    492         VideoSendStream::Config* send_config,
    493         std::vector<VideoReceiveStream::Config>* receive_configs,
    494         VideoEncoderConfig* encoder_config) override {
    495       transport_adapter_.reset(
    496           new internal::TransportAdapter(send_config->send_transport));
    497       transport_adapter_->Enable();
    498       send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
    499       send_config->rtp.rtx.payload_type = retransmit_payload_type_;
    500       if (retransmit_ssrc_ != kVideoSendSsrcs[0])
    501         send_config->rtp.rtx.ssrcs.push_back(retransmit_ssrc_);
    502     }
    503 
    504     void PerformTest() override {
    505       EXPECT_TRUE(Wait()) << "Timed out while waiting for NACK retransmission.";
    506     }
    507 
    508     rtc::scoped_ptr<internal::TransportAdapter> transport_adapter_;
    509     int send_count_;
    510     uint32_t retransmit_ssrc_;
    511     uint8_t retransmit_payload_type_;
    512     int nacked_sequence_number_;
    513   } test(retransmit_ssrc, retransmit_payload_type);
    514 
    515   RunBaseTest(&test);
    516 }
    517 
    518 TEST_F(VideoSendStreamTest, RetransmitsNack) {
    519   // Normal NACKs should use the send SSRC.
    520   TestNackRetransmission(kVideoSendSsrcs[0], kFakeVideoSendPayloadType);
    521 }
    522 
    523 TEST_F(VideoSendStreamTest, RetransmitsNackOverRtx) {
    524   // NACKs over RTX should use a separate SSRC.
    525   TestNackRetransmission(kSendRtxSsrcs[0], kSendRtxPayloadType);
    526 }
    527 
    528 void VideoSendStreamTest::TestPacketFragmentationSize(VideoFormat format,
    529                                                       bool with_fec) {
    530   // Use a fake encoder to output a frame of every size in the range [90, 290],
    531   // for each size making sure that the exact number of payload bytes received
    532   // is correct and that packets are fragmented to respect max packet size.
    533   static const size_t kMaxPacketSize = 128;
    534   static const size_t start = 90;
    535   static const size_t stop = 290;
    536 
    537   // Observer that verifies that the expected number of packets and bytes
    538   // arrive for each frame size, from start_size to stop_size.
    539   class FrameFragmentationTest : public test::SendTest,
    540                                  public EncodedFrameObserver {
    541    public:
    542     FrameFragmentationTest(size_t max_packet_size,
    543                            size_t start_size,
    544                            size_t stop_size,
    545                            bool test_generic_packetization,
    546                            bool use_fec)
    547         : SendTest(kLongTimeoutMs),
    548           encoder_(stop),
    549           max_packet_size_(max_packet_size),
    550           stop_size_(stop_size),
    551           test_generic_packetization_(test_generic_packetization),
    552           use_fec_(use_fec),
    553           packet_count_(0),
    554           accumulated_size_(0),
    555           accumulated_payload_(0),
    556           fec_packet_received_(false),
    557           current_size_rtp_(start_size),
    558           current_size_frame_(static_cast<int32_t>(start_size)) {
    559       // Fragmentation required, this test doesn't make sense without it.
    560       encoder_.SetFrameSize(start_size);
    561       RTC_DCHECK_GT(stop_size, max_packet_size);
    562     }
    563 
    564    private:
    565     Action OnSendRtp(const uint8_t* packet, size_t size) override {
    566       size_t length = size;
    567       RTPHeader header;
    568       EXPECT_TRUE(parser_->Parse(packet, length, &header));
    569 
    570       EXPECT_LE(length, max_packet_size_);
    571 
    572       if (use_fec_) {
    573         uint8_t payload_type = packet[header.headerLength];
    574         bool is_fec = header.payloadType == kRedPayloadType &&
    575                       payload_type == kUlpfecPayloadType;
    576         if (is_fec) {
    577           fec_packet_received_ = true;
    578           return SEND_PACKET;
    579         }
    580       }
    581 
    582       accumulated_size_ += length;
    583 
    584       if (use_fec_)
    585         TriggerLossReport(header);
    586 
    587       if (test_generic_packetization_) {
    588         size_t overhead = header.headerLength + header.paddingLength;
    589         // Only remove payload header and RED header if the packet actually
    590         // contains payload.
    591         if (length > overhead) {
    592           overhead += (1 /* Generic header */);
    593           if (use_fec_)
    594             overhead += 1;  // RED for FEC header.
    595         }
    596         EXPECT_GE(length, overhead);
    597         accumulated_payload_ += length - overhead;
    598       }
    599 
    600       // Marker bit set indicates last packet of a frame.
    601       if (header.markerBit) {
    602         if (use_fec_ && accumulated_payload_ == current_size_rtp_ - 1) {
    603           // With FEC enabled, frame size is incremented asynchronously, so
    604           // "old" frames one byte too small may arrive. Accept, but don't
    605           // increase expected frame size.
    606           accumulated_size_ = 0;
    607           accumulated_payload_ = 0;
    608           return SEND_PACKET;
    609         }
    610 
    611         EXPECT_GE(accumulated_size_, current_size_rtp_);
    612         if (test_generic_packetization_) {
    613           EXPECT_EQ(current_size_rtp_, accumulated_payload_);
    614         }
    615 
    616         // Last packet of frame; reset counters.
    617         accumulated_size_ = 0;
    618         accumulated_payload_ = 0;
    619         if (current_size_rtp_ == stop_size_) {
    620           // Done! (Don't increase size again, might arrive more @ stop_size).
    621           observation_complete_.Set();
    622         } else {
    623           // Increase next expected frame size. If testing with FEC, make sure
    624           // a FEC packet has been received for this frame size before
    625           // proceeding, to make sure that redundancy packets don't exceed
    626           // size limit.
    627           if (!use_fec_) {
    628             ++current_size_rtp_;
    629           } else if (fec_packet_received_) {
    630             fec_packet_received_ = false;
    631             ++current_size_rtp_;
    632             ++current_size_frame_;
    633           }
    634         }
    635       }
    636 
    637       return SEND_PACKET;
    638     }
    639 
    640     void TriggerLossReport(const RTPHeader& header) {
    641       // Send lossy receive reports to trigger FEC enabling.
    642       if (packet_count_++ % 2 != 0) {
    643         // Receive statistics reporting having lost 50% of the packets.
    644         FakeReceiveStatistics lossy_receive_stats(
    645             kVideoSendSsrcs[0], header.sequenceNumber, packet_count_ / 2, 127);
    646         RTCPSender rtcp_sender(false, Clock::GetRealTimeClock(),
    647                                &lossy_receive_stats, nullptr,
    648                                transport_adapter_.get());
    649 
    650         rtcp_sender.SetRTCPStatus(RtcpMode::kReducedSize);
    651         rtcp_sender.SetRemoteSSRC(kVideoSendSsrcs[0]);
    652 
    653         RTCPSender::FeedbackState feedback_state;
    654 
    655         EXPECT_EQ(0, rtcp_sender.SendRTCP(feedback_state, kRtcpRr));
    656       }
    657     }
    658 
    659     virtual void EncodedFrameCallback(const EncodedFrame& encoded_frame) {
    660       // Increase frame size for next encoded frame, in the context of the
    661       // encoder thread.
    662       if (!use_fec_ &&
    663           current_size_frame_.Value() < static_cast<int32_t>(stop_size_)) {
    664         ++current_size_frame_;
    665       }
    666       encoder_.SetFrameSize(static_cast<size_t>(current_size_frame_.Value()));
    667     }
    668 
    669     Call::Config GetSenderCallConfig() override {
    670       Call::Config config;
    671       const int kMinBitrateBps = 30000;
    672       config.bitrate_config.min_bitrate_bps = kMinBitrateBps;
    673       return config;
    674     }
    675 
    676     void ModifyVideoConfigs(
    677         VideoSendStream::Config* send_config,
    678         std::vector<VideoReceiveStream::Config>* receive_configs,
    679         VideoEncoderConfig* encoder_config) override {
    680       transport_adapter_.reset(
    681           new internal::TransportAdapter(send_config->send_transport));
    682       transport_adapter_->Enable();
    683       if (use_fec_) {
    684         send_config->rtp.fec.red_payload_type = kRedPayloadType;
    685         send_config->rtp.fec.ulpfec_payload_type = kUlpfecPayloadType;
    686       }
    687 
    688       if (!test_generic_packetization_)
    689         send_config->encoder_settings.payload_name = "VP8";
    690 
    691       send_config->encoder_settings.encoder = &encoder_;
    692       send_config->rtp.max_packet_size = kMaxPacketSize;
    693       send_config->post_encode_callback = this;
    694 
    695       // Make sure there is at least one extension header, to make the RTP
    696       // header larger than the base length of 12 bytes.
    697       EXPECT_FALSE(send_config->rtp.extensions.empty());
    698     }
    699 
    700     void PerformTest() override {
    701       EXPECT_TRUE(Wait()) << "Timed out while observing incoming RTP packets.";
    702     }
    703 
    704     rtc::scoped_ptr<internal::TransportAdapter> transport_adapter_;
    705     test::ConfigurableFrameSizeEncoder encoder_;
    706 
    707     const size_t max_packet_size_;
    708     const size_t stop_size_;
    709     const bool test_generic_packetization_;
    710     const bool use_fec_;
    711 
    712     uint32_t packet_count_;
    713     size_t accumulated_size_;
    714     size_t accumulated_payload_;
    715     bool fec_packet_received_;
    716 
    717     size_t current_size_rtp_;
    718     Atomic32 current_size_frame_;
    719   };
    720 
    721   // Don't auto increment if FEC is used; continue sending frame size until
    722   // a FEC packet has been received.
    723   FrameFragmentationTest test(
    724       kMaxPacketSize, start, stop, format == kGeneric, with_fec);
    725 
    726   RunBaseTest(&test);
    727 }
    728 
    729 // TODO(sprang): Is there any way of speeding up these tests?
    730 TEST_F(VideoSendStreamTest, FragmentsGenericAccordingToMaxPacketSize) {
    731   TestPacketFragmentationSize(kGeneric, false);
    732 }
    733 
    734 TEST_F(VideoSendStreamTest, FragmentsGenericAccordingToMaxPacketSizeWithFec) {
    735   TestPacketFragmentationSize(kGeneric, true);
    736 }
    737 
    738 TEST_F(VideoSendStreamTest, FragmentsVp8AccordingToMaxPacketSize) {
    739   TestPacketFragmentationSize(kVP8, false);
    740 }
    741 
    742 TEST_F(VideoSendStreamTest, FragmentsVp8AccordingToMaxPacketSizeWithFec) {
    743   TestPacketFragmentationSize(kVP8, true);
    744 }
    745 
    746 // The test will go through a number of phases.
    747 // 1. Start sending packets.
    748 // 2. As soon as the RTP stream has been detected, signal a low REMB value to
    749 //    suspend the stream.
    750 // 3. Wait until |kSuspendTimeFrames| have been captured without seeing any RTP
    751 //    packets.
    752 // 4. Signal a high REMB and then wait for the RTP stream to start again.
    753 //    When the stream is detected again, and the stats show that the stream
    754 //    is no longer suspended, the test ends.
    755 TEST_F(VideoSendStreamTest, SuspendBelowMinBitrate) {
    756   static const int kSuspendTimeFrames = 60;  // Suspend for 2 seconds @ 30 fps.
    757 
    758   class RembObserver : public test::SendTest, public I420FrameCallback {
    759    public:
    760     RembObserver()
    761         : SendTest(kDefaultTimeoutMs),
    762           clock_(Clock::GetRealTimeClock()),
    763           test_state_(kBeforeSuspend),
    764           rtp_count_(0),
    765           last_sequence_number_(0),
    766           suspended_frame_count_(0),
    767           low_remb_bps_(0),
    768           high_remb_bps_(0) {
    769     }
    770 
    771    private:
    772     Action OnSendRtp(const uint8_t* packet, size_t length) override {
    773       rtc::CritScope lock(&crit_);
    774       ++rtp_count_;
    775       RTPHeader header;
    776       EXPECT_TRUE(parser_->Parse(packet, length, &header));
    777       last_sequence_number_ = header.sequenceNumber;
    778 
    779       if (test_state_ == kBeforeSuspend) {
    780         // The stream has started. Try to suspend it.
    781         SendRtcpFeedback(low_remb_bps_);
    782         test_state_ = kDuringSuspend;
    783       } else if (test_state_ == kDuringSuspend) {
    784         if (header.paddingLength == 0) {
    785           // Received non-padding packet during suspension period. Reset the
    786           // counter.
    787           suspended_frame_count_ = 0;
    788         }
    789         SendRtcpFeedback(0);  // REMB is only sent if value is > 0.
    790       } else if (test_state_ == kWaitingForPacket) {
    791         if (header.paddingLength == 0) {
    792           // Non-padding packet observed. Test is almost complete. Will just
    793           // have to wait for the stats to change.
    794           test_state_ = kWaitingForStats;
    795         }
    796         SendRtcpFeedback(0);  // REMB is only sent if value is > 0.
    797       } else if (test_state_ == kWaitingForStats) {
    798         VideoSendStream::Stats stats = stream_->GetStats();
    799         if (stats.suspended == false) {
    800           // Stats flipped to false. Test is complete.
    801           observation_complete_.Set();
    802         }
    803         SendRtcpFeedback(0);  // REMB is only sent if value is > 0.
    804       }
    805 
    806       return SEND_PACKET;
    807     }
    808 
    809     // This method implements the I420FrameCallback.
    810     void FrameCallback(VideoFrame* video_frame) override {
    811       rtc::CritScope lock(&crit_);
    812       if (test_state_ == kDuringSuspend &&
    813           ++suspended_frame_count_ > kSuspendTimeFrames) {
    814         VideoSendStream::Stats stats = stream_->GetStats();
    815         EXPECT_TRUE(stats.suspended);
    816         SendRtcpFeedback(high_remb_bps_);
    817         test_state_ = kWaitingForPacket;
    818       }
    819     }
    820 
    821     void set_low_remb_bps(int value) {
    822       rtc::CritScope lock(&crit_);
    823       low_remb_bps_ = value;
    824     }
    825 
    826     void set_high_remb_bps(int value) {
    827       rtc::CritScope lock(&crit_);
    828       high_remb_bps_ = value;
    829     }
    830 
    831     void OnVideoStreamsCreated(
    832         VideoSendStream* send_stream,
    833         const std::vector<VideoReceiveStream*>& receive_streams) override {
    834       stream_ = send_stream;
    835     }
    836 
    837     void ModifyVideoConfigs(
    838         VideoSendStream::Config* send_config,
    839         std::vector<VideoReceiveStream::Config>* receive_configs,
    840         VideoEncoderConfig* encoder_config) override {
    841       transport_adapter_.reset(
    842           new internal::TransportAdapter(send_config->send_transport));
    843       transport_adapter_->Enable();
    844       send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
    845       send_config->pre_encode_callback = this;
    846       send_config->suspend_below_min_bitrate = true;
    847       int min_bitrate_bps = encoder_config->streams[0].min_bitrate_bps;
    848       set_low_remb_bps(min_bitrate_bps - 10000);
    849       int threshold_window = std::max(min_bitrate_bps / 10, 10000);
    850       ASSERT_GT(encoder_config->streams[0].max_bitrate_bps,
    851                 min_bitrate_bps + threshold_window + 5000);
    852       set_high_remb_bps(min_bitrate_bps + threshold_window + 5000);
    853     }
    854 
    855     void PerformTest() override {
    856       EXPECT_TRUE(Wait()) << "Timed out during suspend-below-min-bitrate test.";
    857     }
    858 
    859     enum TestState {
    860       kBeforeSuspend,
    861       kDuringSuspend,
    862       kWaitingForPacket,
    863       kWaitingForStats
    864     };
    865 
    866     virtual void SendRtcpFeedback(int remb_value)
    867         EXCLUSIVE_LOCKS_REQUIRED(crit_) {
    868       FakeReceiveStatistics receive_stats(kVideoSendSsrcs[0],
    869                                           last_sequence_number_, rtp_count_, 0);
    870       RTCPSender rtcp_sender(false, clock_, &receive_stats, nullptr,
    871                              transport_adapter_.get());
    872 
    873       rtcp_sender.SetRTCPStatus(RtcpMode::kReducedSize);
    874       rtcp_sender.SetRemoteSSRC(kVideoSendSsrcs[0]);
    875       if (remb_value > 0) {
    876         rtcp_sender.SetREMBStatus(true);
    877         rtcp_sender.SetREMBData(remb_value, std::vector<uint32_t>());
    878       }
    879       RTCPSender::FeedbackState feedback_state;
    880       EXPECT_EQ(0, rtcp_sender.SendRTCP(feedback_state, kRtcpRr));
    881     }
    882 
    883     rtc::scoped_ptr<internal::TransportAdapter> transport_adapter_;
    884     Clock* const clock_;
    885     VideoSendStream* stream_;
    886 
    887     rtc::CriticalSection crit_;
    888     TestState test_state_ GUARDED_BY(crit_);
    889     int rtp_count_ GUARDED_BY(crit_);
    890     int last_sequence_number_ GUARDED_BY(crit_);
    891     int suspended_frame_count_ GUARDED_BY(crit_);
    892     int low_remb_bps_ GUARDED_BY(crit_);
    893     int high_remb_bps_ GUARDED_BY(crit_);
    894   } test;
    895 
    896   RunBaseTest(&test);
    897 }
    898 
    899 TEST_F(VideoSendStreamTest, NoPaddingWhenVideoIsMuted) {
    900   class NoPaddingWhenVideoIsMuted : public test::SendTest {
    901    public:
    902     NoPaddingWhenVideoIsMuted()
    903         : SendTest(kDefaultTimeoutMs),
    904           clock_(Clock::GetRealTimeClock()),
    905           last_packet_time_ms_(-1),
    906           capturer_(nullptr) {
    907     }
    908 
    909    private:
    910     Action OnSendRtp(const uint8_t* packet, size_t length) override {
    911       rtc::CritScope lock(&crit_);
    912       last_packet_time_ms_ = clock_->TimeInMilliseconds();
    913       capturer_->Stop();
    914       return SEND_PACKET;
    915     }
    916 
    917     Action OnSendRtcp(const uint8_t* packet, size_t length) override {
    918       rtc::CritScope lock(&crit_);
    919       const int kVideoMutedThresholdMs = 10000;
    920       if (last_packet_time_ms_ > 0 &&
    921           clock_->TimeInMilliseconds() - last_packet_time_ms_ >
    922               kVideoMutedThresholdMs)
    923         observation_complete_.Set();
    924       // Receive statistics reporting having lost 50% of the packets.
    925       FakeReceiveStatistics receive_stats(kVideoSendSsrcs[0], 1, 1, 0);
    926       RTCPSender rtcp_sender(false, Clock::GetRealTimeClock(), &receive_stats,
    927                              nullptr, transport_adapter_.get());
    928 
    929       rtcp_sender.SetRTCPStatus(RtcpMode::kReducedSize);
    930       rtcp_sender.SetRemoteSSRC(kVideoSendSsrcs[0]);
    931 
    932       RTCPSender::FeedbackState feedback_state;
    933 
    934       EXPECT_EQ(0, rtcp_sender.SendRTCP(feedback_state, kRtcpRr));
    935       return SEND_PACKET;
    936     }
    937 
    938     test::PacketTransport* CreateReceiveTransport() override {
    939       test::PacketTransport* transport = new test::PacketTransport(
    940           nullptr, this, test::PacketTransport::kReceiver,
    941           FakeNetworkPipe::Config());
    942       transport_adapter_.reset(new internal::TransportAdapter(transport));
    943       transport_adapter_->Enable();
    944       return transport;
    945     }
    946 
    947     size_t GetNumVideoStreams() const override { return 3; }
    948 
    949     virtual void OnFrameGeneratorCapturerCreated(
    950         test::FrameGeneratorCapturer* frame_generator_capturer) {
    951       rtc::CritScope lock(&crit_);
    952       capturer_ = frame_generator_capturer;
    953     }
    954 
    955     void PerformTest() override {
    956       EXPECT_TRUE(Wait())
    957           << "Timed out while waiting for RTP packets to stop being sent.";
    958     }
    959 
    960     Clock* const clock_;
    961     rtc::scoped_ptr<internal::TransportAdapter> transport_adapter_;
    962     rtc::CriticalSection crit_;
    963     int64_t last_packet_time_ms_ GUARDED_BY(crit_);
    964     test::FrameGeneratorCapturer* capturer_ GUARDED_BY(crit_);
    965   } test;
    966 
    967   RunBaseTest(&test);
    968 }
    969 
    970 // This test first observes "high" bitrate use at which point it sends a REMB to
    971 // indicate that it should be lowered significantly. The test then observes that
    972 // the bitrate observed is sinking well below the min-transmit-bitrate threshold
    973 // to verify that the min-transmit bitrate respects incoming REMB.
    974 //
    975 // Note that the test starts at "high" bitrate and does not ramp up to "higher"
    976 // bitrate since no receiver block or remb is sent in the initial phase.
    977 TEST_F(VideoSendStreamTest, MinTransmitBitrateRespectsRemb) {
    978   static const int kMinTransmitBitrateBps = 400000;
    979   static const int kHighBitrateBps = 150000;
    980   static const int kRembBitrateBps = 80000;
    981   static const int kRembRespectedBitrateBps = 100000;
    982   class BitrateObserver : public test::SendTest {
    983    public:
    984     BitrateObserver()
    985         : SendTest(kDefaultTimeoutMs),
    986           bitrate_capped_(false) {
    987     }
    988 
    989    private:
    990     virtual Action OnSendRtp(const uint8_t* packet, size_t length) {
    991       if (RtpHeaderParser::IsRtcp(packet, length))
    992         return DROP_PACKET;
    993 
    994       RTPHeader header;
    995       if (!parser_->Parse(packet, length, &header))
    996         return DROP_PACKET;
    997       RTC_DCHECK(stream_ != nullptr);
    998       VideoSendStream::Stats stats = stream_->GetStats();
    999       if (!stats.substreams.empty()) {
   1000         EXPECT_EQ(1u, stats.substreams.size());
   1001         int total_bitrate_bps =
   1002             stats.substreams.begin()->second.total_bitrate_bps;
   1003         test::PrintResult("bitrate_stats_",
   1004                           "min_transmit_bitrate_low_remb",
   1005                           "bitrate_bps",
   1006                           static_cast<size_t>(total_bitrate_bps),
   1007                           "bps",
   1008                           false);
   1009         if (total_bitrate_bps > kHighBitrateBps) {
   1010           rtp_rtcp_->SetREMBData(kRembBitrateBps,
   1011                                  std::vector<uint32_t>(1, header.ssrc));
   1012           rtp_rtcp_->Process();
   1013           bitrate_capped_ = true;
   1014         } else if (bitrate_capped_ &&
   1015                    total_bitrate_bps < kRembRespectedBitrateBps) {
   1016           observation_complete_.Set();
   1017         }
   1018       }
   1019       // Packets don't have to be delivered since the test is the receiver.
   1020       return DROP_PACKET;
   1021     }
   1022 
   1023     void OnVideoStreamsCreated(
   1024         VideoSendStream* send_stream,
   1025         const std::vector<VideoReceiveStream*>& receive_streams) override {
   1026       stream_ = send_stream;
   1027       RtpRtcp::Configuration config;
   1028       config.outgoing_transport = feedback_transport_.get();
   1029       rtp_rtcp_.reset(RtpRtcp::CreateRtpRtcp(config));
   1030       rtp_rtcp_->SetREMBStatus(true);
   1031       rtp_rtcp_->SetRTCPStatus(RtcpMode::kReducedSize);
   1032     }
   1033 
   1034     void ModifyVideoConfigs(
   1035         VideoSendStream::Config* send_config,
   1036         std::vector<VideoReceiveStream::Config>* receive_configs,
   1037         VideoEncoderConfig* encoder_config) override {
   1038       feedback_transport_.reset(
   1039           new internal::TransportAdapter(send_config->send_transport));
   1040       feedback_transport_->Enable();
   1041       encoder_config->min_transmit_bitrate_bps = kMinTransmitBitrateBps;
   1042     }
   1043 
   1044     void PerformTest() override {
   1045       EXPECT_TRUE(Wait())
   1046           << "Timeout while waiting for low bitrate stats after REMB.";
   1047     }
   1048 
   1049     rtc::scoped_ptr<RtpRtcp> rtp_rtcp_;
   1050     rtc::scoped_ptr<internal::TransportAdapter> feedback_transport_;
   1051     VideoSendStream* stream_;
   1052     bool bitrate_capped_;
   1053   } test;
   1054 
   1055   RunBaseTest(&test);
   1056 }
   1057 
   1058 TEST_F(VideoSendStreamTest, CanReconfigureToUseStartBitrateAbovePreviousMax) {
   1059   class StartBitrateObserver : public test::FakeEncoder {
   1060    public:
   1061     StartBitrateObserver()
   1062         : FakeEncoder(Clock::GetRealTimeClock()), start_bitrate_kbps_(0) {}
   1063     int32_t InitEncode(const VideoCodec* config,
   1064                        int32_t number_of_cores,
   1065                        size_t max_payload_size) override {
   1066       rtc::CritScope lock(&crit_);
   1067       start_bitrate_kbps_ = config->startBitrate;
   1068       return FakeEncoder::InitEncode(config, number_of_cores, max_payload_size);
   1069     }
   1070 
   1071     int32_t SetRates(uint32_t new_target_bitrate, uint32_t framerate) override {
   1072       rtc::CritScope lock(&crit_);
   1073       start_bitrate_kbps_ = new_target_bitrate;
   1074       return FakeEncoder::SetRates(new_target_bitrate, framerate);
   1075     }
   1076 
   1077     int GetStartBitrateKbps() const {
   1078       rtc::CritScope lock(&crit_);
   1079       return start_bitrate_kbps_;
   1080     }
   1081 
   1082    private:
   1083     mutable rtc::CriticalSection crit_;
   1084     int start_bitrate_kbps_ GUARDED_BY(crit_);
   1085   };
   1086 
   1087   CreateSenderCall(Call::Config());
   1088 
   1089   test::NullTransport transport;
   1090   CreateSendConfig(1, 0, &transport);
   1091 
   1092   Call::Config::BitrateConfig bitrate_config;
   1093   bitrate_config.start_bitrate_bps =
   1094       2 * video_encoder_config_.streams[0].max_bitrate_bps;
   1095   sender_call_->SetBitrateConfig(bitrate_config);
   1096 
   1097   StartBitrateObserver encoder;
   1098   video_send_config_.encoder_settings.encoder = &encoder;
   1099 
   1100   CreateVideoStreams();
   1101 
   1102   EXPECT_EQ(video_encoder_config_.streams[0].max_bitrate_bps / 1000,
   1103             encoder.GetStartBitrateKbps());
   1104 
   1105   video_encoder_config_.streams[0].max_bitrate_bps =
   1106       2 * bitrate_config.start_bitrate_bps;
   1107   video_send_stream_->ReconfigureVideoEncoder(video_encoder_config_);
   1108 
   1109   // New bitrate should be reconfigured above the previous max. As there's no
   1110   // network connection this shouldn't be flaky, as no bitrate should've been
   1111   // reported in between.
   1112   EXPECT_EQ(bitrate_config.start_bitrate_bps / 1000,
   1113             encoder.GetStartBitrateKbps());
   1114 
   1115   DestroyStreams();
   1116 }
   1117 
   1118 TEST_F(VideoSendStreamTest, CapturesTextureAndVideoFrames) {
   1119   class FrameObserver : public I420FrameCallback {
   1120    public:
   1121     FrameObserver() : output_frame_event_(false, false) {}
   1122 
   1123     void FrameCallback(VideoFrame* video_frame) override {
   1124       output_frames_.push_back(*video_frame);
   1125       output_frame_event_.Set();
   1126     }
   1127 
   1128     void WaitOutputFrame() {
   1129       const int kWaitFrameTimeoutMs = 3000;
   1130       EXPECT_TRUE(output_frame_event_.Wait(kWaitFrameTimeoutMs))
   1131           << "Timeout while waiting for output frames.";
   1132     }
   1133 
   1134     const std::vector<VideoFrame>& output_frames() const {
   1135       return output_frames_;
   1136     }
   1137 
   1138    private:
   1139     // Delivered output frames.
   1140     std::vector<VideoFrame> output_frames_;
   1141 
   1142     // Indicate an output frame has arrived.
   1143     rtc::Event output_frame_event_;
   1144   };
   1145 
   1146   // Initialize send stream.
   1147   CreateSenderCall(Call::Config());
   1148 
   1149   test::NullTransport transport;
   1150   CreateSendConfig(1, 0, &transport);
   1151   FrameObserver observer;
   1152   video_send_config_.pre_encode_callback = &observer;
   1153   CreateVideoStreams();
   1154 
   1155   // Prepare five input frames. Send ordinary VideoFrame and texture frames
   1156   // alternatively.
   1157   std::vector<VideoFrame> input_frames;
   1158   int width = static_cast<int>(video_encoder_config_.streams[0].width);
   1159   int height = static_cast<int>(video_encoder_config_.streams[0].height);
   1160   test::FakeNativeHandle* handle1 = new test::FakeNativeHandle();
   1161   test::FakeNativeHandle* handle2 = new test::FakeNativeHandle();
   1162   test::FakeNativeHandle* handle3 = new test::FakeNativeHandle();
   1163   input_frames.push_back(test::FakeNativeHandle::CreateFrame(
   1164       handle1, width, height, 1, 1, kVideoRotation_0));
   1165   input_frames.push_back(test::FakeNativeHandle::CreateFrame(
   1166       handle2, width, height, 2, 2, kVideoRotation_0));
   1167   input_frames.push_back(CreateVideoFrame(width, height, 3));
   1168   input_frames.push_back(CreateVideoFrame(width, height, 4));
   1169   input_frames.push_back(test::FakeNativeHandle::CreateFrame(
   1170       handle3, width, height, 5, 5, kVideoRotation_0));
   1171 
   1172   video_send_stream_->Start();
   1173   for (size_t i = 0; i < input_frames.size(); i++) {
   1174     video_send_stream_->Input()->IncomingCapturedFrame(input_frames[i]);
   1175     // Do not send the next frame too fast, so the frame dropper won't drop it.
   1176     if (i < input_frames.size() - 1)
   1177       SleepMs(1000 / video_encoder_config_.streams[0].max_framerate);
   1178     // Wait until the output frame is received before sending the next input
   1179     // frame. Or the previous input frame may be replaced without delivering.
   1180     observer.WaitOutputFrame();
   1181   }
   1182   video_send_stream_->Stop();
   1183 
   1184   // Test if the input and output frames are the same. render_time_ms and
   1185   // timestamp are not compared because capturer sets those values.
   1186   ExpectEqualFramesVector(input_frames, observer.output_frames());
   1187 
   1188   DestroyStreams();
   1189 }
   1190 
   1191 void ExpectEqualFrames(const VideoFrame& frame1, const VideoFrame& frame2) {
   1192   if (frame1.native_handle() != nullptr || frame2.native_handle() != nullptr)
   1193     ExpectEqualTextureFrames(frame1, frame2);
   1194   else
   1195     ExpectEqualBufferFrames(frame1, frame2);
   1196 }
   1197 
   1198 void ExpectEqualTextureFrames(const VideoFrame& frame1,
   1199                               const VideoFrame& frame2) {
   1200   EXPECT_EQ(frame1.native_handle(), frame2.native_handle());
   1201   EXPECT_EQ(frame1.width(), frame2.width());
   1202   EXPECT_EQ(frame1.height(), frame2.height());
   1203   EXPECT_EQ(frame1.render_time_ms(), frame2.render_time_ms());
   1204 }
   1205 
   1206 void ExpectEqualBufferFrames(const VideoFrame& frame1,
   1207                              const VideoFrame& frame2) {
   1208   EXPECT_EQ(frame1.width(), frame2.width());
   1209   EXPECT_EQ(frame1.height(), frame2.height());
   1210   EXPECT_EQ(frame1.stride(kYPlane), frame2.stride(kYPlane));
   1211   EXPECT_EQ(frame1.stride(kUPlane), frame2.stride(kUPlane));
   1212   EXPECT_EQ(frame1.stride(kVPlane), frame2.stride(kVPlane));
   1213   EXPECT_EQ(frame1.render_time_ms(), frame2.render_time_ms());
   1214   ASSERT_EQ(frame1.allocated_size(kYPlane), frame2.allocated_size(kYPlane));
   1215   EXPECT_EQ(0,
   1216             memcmp(frame1.buffer(kYPlane),
   1217                    frame2.buffer(kYPlane),
   1218                    frame1.allocated_size(kYPlane)));
   1219   ASSERT_EQ(frame1.allocated_size(kUPlane), frame2.allocated_size(kUPlane));
   1220   EXPECT_EQ(0,
   1221             memcmp(frame1.buffer(kUPlane),
   1222                    frame2.buffer(kUPlane),
   1223                    frame1.allocated_size(kUPlane)));
   1224   ASSERT_EQ(frame1.allocated_size(kVPlane), frame2.allocated_size(kVPlane));
   1225   EXPECT_EQ(0,
   1226             memcmp(frame1.buffer(kVPlane),
   1227                    frame2.buffer(kVPlane),
   1228                    frame1.allocated_size(kVPlane)));
   1229 }
   1230 
   1231 void ExpectEqualFramesVector(const std::vector<VideoFrame>& frames1,
   1232                              const std::vector<VideoFrame>& frames2) {
   1233   EXPECT_EQ(frames1.size(), frames2.size());
   1234   for (size_t i = 0; i < std::min(frames1.size(), frames2.size()); ++i)
   1235     ExpectEqualFrames(frames1[i], frames2[i]);
   1236 }
   1237 
   1238 VideoFrame CreateVideoFrame(int width, int height, uint8_t data) {
   1239   const int kSizeY = width * height * 2;
   1240   rtc::scoped_ptr<uint8_t[]> buffer(new uint8_t[kSizeY]);
   1241   memset(buffer.get(), data, kSizeY);
   1242   VideoFrame frame;
   1243   frame.CreateFrame(buffer.get(), buffer.get(), buffer.get(), width, height,
   1244                     width, width / 2, width / 2);
   1245   frame.set_timestamp(data);
   1246   frame.set_render_time_ms(data);
   1247   return frame;
   1248 }
   1249 
   1250 TEST_F(VideoSendStreamTest, EncoderIsProperlyInitializedAndDestroyed) {
   1251   class EncoderStateObserver : public test::SendTest, public VideoEncoder {
   1252    public:
   1253     EncoderStateObserver()
   1254         : SendTest(kDefaultTimeoutMs),
   1255           initialized_(false),
   1256           callback_registered_(false),
   1257           num_releases_(0),
   1258           released_(false) {}
   1259 
   1260     bool IsReleased() {
   1261       rtc::CritScope lock(&crit_);
   1262       return released_;
   1263     }
   1264 
   1265     bool IsReadyForEncode() {
   1266       rtc::CritScope lock(&crit_);
   1267       return initialized_ && callback_registered_;
   1268     }
   1269 
   1270     size_t num_releases() {
   1271       rtc::CritScope lock(&crit_);
   1272       return num_releases_;
   1273     }
   1274 
   1275    private:
   1276     int32_t InitEncode(const VideoCodec* codecSettings,
   1277                        int32_t numberOfCores,
   1278                        size_t maxPayloadSize) override {
   1279       rtc::CritScope lock(&crit_);
   1280       EXPECT_FALSE(initialized_);
   1281       initialized_ = true;
   1282       released_ = false;
   1283       return 0;
   1284     }
   1285 
   1286     int32_t Encode(const VideoFrame& inputImage,
   1287                    const CodecSpecificInfo* codecSpecificInfo,
   1288                    const std::vector<FrameType>* frame_types) override {
   1289       EXPECT_TRUE(IsReadyForEncode());
   1290 
   1291       observation_complete_.Set();
   1292       return 0;
   1293     }
   1294 
   1295     int32_t RegisterEncodeCompleteCallback(
   1296         EncodedImageCallback* callback) override {
   1297       rtc::CritScope lock(&crit_);
   1298       EXPECT_TRUE(initialized_);
   1299       callback_registered_ = true;
   1300       return 0;
   1301     }
   1302 
   1303     int32_t Release() override {
   1304       rtc::CritScope lock(&crit_);
   1305       EXPECT_TRUE(IsReadyForEncode());
   1306       EXPECT_FALSE(released_);
   1307       initialized_ = false;
   1308       callback_registered_ = false;
   1309       released_ = true;
   1310       ++num_releases_;
   1311       return 0;
   1312     }
   1313 
   1314     int32_t SetChannelParameters(uint32_t packetLoss, int64_t rtt) override {
   1315       EXPECT_TRUE(IsReadyForEncode());
   1316       return 0;
   1317     }
   1318 
   1319     int32_t SetRates(uint32_t newBitRate, uint32_t frameRate) override {
   1320       EXPECT_TRUE(IsReadyForEncode());
   1321       return 0;
   1322     }
   1323 
   1324     void OnVideoStreamsCreated(
   1325         VideoSendStream* send_stream,
   1326         const std::vector<VideoReceiveStream*>& receive_streams) override {
   1327       // Encoder initialization should be done in stream construction before
   1328       // starting.
   1329       EXPECT_TRUE(IsReadyForEncode());
   1330       stream_ = send_stream;
   1331     }
   1332 
   1333     void ModifyVideoConfigs(
   1334         VideoSendStream::Config* send_config,
   1335         std::vector<VideoReceiveStream::Config>* receive_configs,
   1336         VideoEncoderConfig* encoder_config) override {
   1337       send_config->encoder_settings.encoder = this;
   1338       encoder_config_ = *encoder_config;
   1339     }
   1340 
   1341     void PerformTest() override {
   1342       EXPECT_TRUE(Wait()) << "Timed out while waiting for Encode.";
   1343       EXPECT_EQ(0u, num_releases());
   1344       stream_->ReconfigureVideoEncoder(encoder_config_);
   1345       EXPECT_EQ(0u, num_releases());
   1346       stream_->Stop();
   1347       // Encoder should not be released before destroying the VideoSendStream.
   1348       EXPECT_FALSE(IsReleased());
   1349       EXPECT_TRUE(IsReadyForEncode());
   1350       stream_->Start();
   1351       // Sanity check, make sure we still encode frames with this encoder.
   1352       EXPECT_TRUE(Wait()) << "Timed out while waiting for Encode.";
   1353     }
   1354 
   1355     rtc::CriticalSection crit_;
   1356     VideoSendStream* stream_;
   1357     bool initialized_ GUARDED_BY(crit_);
   1358     bool callback_registered_ GUARDED_BY(crit_);
   1359     size_t num_releases_ GUARDED_BY(crit_);
   1360     bool released_ GUARDED_BY(crit_);
   1361     VideoEncoderConfig encoder_config_;
   1362   } test_encoder;
   1363 
   1364   RunBaseTest(&test_encoder);
   1365 
   1366   EXPECT_TRUE(test_encoder.IsReleased());
   1367   EXPECT_EQ(1u, test_encoder.num_releases());
   1368 }
   1369 
   1370 TEST_F(VideoSendStreamTest, EncoderSetupPropagatesCommonEncoderConfigValues) {
   1371   class VideoCodecConfigObserver : public test::SendTest,
   1372                                    public test::FakeEncoder {
   1373    public:
   1374     VideoCodecConfigObserver()
   1375         : SendTest(kDefaultTimeoutMs),
   1376           FakeEncoder(Clock::GetRealTimeClock()),
   1377           num_initializations_(0) {}
   1378 
   1379    private:
   1380     void ModifyVideoConfigs(
   1381         VideoSendStream::Config* send_config,
   1382         std::vector<VideoReceiveStream::Config>* receive_configs,
   1383         VideoEncoderConfig* encoder_config) override {
   1384       send_config->encoder_settings.encoder = this;
   1385       encoder_config_ = *encoder_config;
   1386     }
   1387 
   1388     void OnVideoStreamsCreated(
   1389         VideoSendStream* send_stream,
   1390         const std::vector<VideoReceiveStream*>& receive_streams) override {
   1391       stream_ = send_stream;
   1392     }
   1393 
   1394     int32_t InitEncode(const VideoCodec* config,
   1395                        int32_t number_of_cores,
   1396                        size_t max_payload_size) override {
   1397       if (num_initializations_ == 0) {
   1398         // Verify default values.
   1399         EXPECT_EQ(kRealtimeVideo, config->mode);
   1400       } else {
   1401         // Verify that changed values are propagated.
   1402         EXPECT_EQ(kScreensharing, config->mode);
   1403       }
   1404       ++num_initializations_;
   1405       return FakeEncoder::InitEncode(config, number_of_cores, max_payload_size);
   1406     }
   1407 
   1408     void PerformTest() override {
   1409       EXPECT_EQ(1u, num_initializations_) << "VideoEncoder not initialized.";
   1410 
   1411       encoder_config_.content_type = VideoEncoderConfig::ContentType::kScreen;
   1412       stream_->ReconfigureVideoEncoder(encoder_config_);
   1413       EXPECT_EQ(2u, num_initializations_)
   1414           << "ReconfigureVideoEncoder did not reinitialize the encoder with "
   1415              "new encoder settings.";
   1416     }
   1417 
   1418     size_t num_initializations_;
   1419     VideoSendStream* stream_;
   1420     VideoEncoderConfig encoder_config_;
   1421   } test;
   1422 
   1423   RunBaseTest(&test);
   1424 }
   1425 
   1426 static const size_t kVideoCodecConfigObserverNumberOfTemporalLayers = 4;
   1427 template <typename T>
   1428 class VideoCodecConfigObserver : public test::SendTest,
   1429                                  public test::FakeEncoder {
   1430  public:
   1431   VideoCodecConfigObserver(VideoCodecType video_codec_type,
   1432                            const char* codec_name)
   1433       : SendTest(VideoSendStreamTest::kDefaultTimeoutMs),
   1434         FakeEncoder(Clock::GetRealTimeClock()),
   1435         video_codec_type_(video_codec_type),
   1436         codec_name_(codec_name),
   1437         num_initializations_(0) {
   1438     memset(&encoder_settings_, 0, sizeof(encoder_settings_));
   1439   }
   1440 
   1441  private:
   1442   void ModifyVideoConfigs(
   1443       VideoSendStream::Config* send_config,
   1444       std::vector<VideoReceiveStream::Config>* receive_configs,
   1445       VideoEncoderConfig* encoder_config) override {
   1446     send_config->encoder_settings.encoder = this;
   1447     send_config->encoder_settings.payload_name = codec_name_;
   1448 
   1449     for (size_t i = 0; i < encoder_config->streams.size(); ++i) {
   1450       encoder_config->streams[i].temporal_layer_thresholds_bps.resize(
   1451           kVideoCodecConfigObserverNumberOfTemporalLayers - 1);
   1452     }
   1453 
   1454     encoder_config->encoder_specific_settings = &encoder_settings_;
   1455     encoder_config_ = *encoder_config;
   1456   }
   1457 
   1458   void OnVideoStreamsCreated(
   1459       VideoSendStream* send_stream,
   1460       const std::vector<VideoReceiveStream*>& receive_streams) override {
   1461     stream_ = send_stream;
   1462   }
   1463 
   1464   int32_t InitEncode(const VideoCodec* config,
   1465                      int32_t number_of_cores,
   1466                      size_t max_payload_size) override {
   1467     EXPECT_EQ(video_codec_type_, config->codecType);
   1468     VerifyCodecSpecifics(*config);
   1469     ++num_initializations_;
   1470     return FakeEncoder::InitEncode(config, number_of_cores, max_payload_size);
   1471   }
   1472 
   1473   void VerifyCodecSpecifics(const VideoCodec& config) const;
   1474 
   1475   void PerformTest() override {
   1476     EXPECT_EQ(1u, num_initializations_) << "VideoEncoder not initialized.";
   1477 
   1478     encoder_settings_.frameDroppingOn = true;
   1479     stream_->ReconfigureVideoEncoder(encoder_config_);
   1480     EXPECT_EQ(2u, num_initializations_)
   1481         << "ReconfigureVideoEncoder did not reinitialize the encoder with "
   1482            "new encoder settings.";
   1483   }
   1484 
   1485   int32_t Encode(const VideoFrame& input_image,
   1486                  const CodecSpecificInfo* codec_specific_info,
   1487                  const std::vector<FrameType>* frame_types) override {
   1488     // Silently skip the encode, FakeEncoder::Encode doesn't produce VP8.
   1489     return 0;
   1490   }
   1491 
   1492   T encoder_settings_;
   1493   const VideoCodecType video_codec_type_;
   1494   const char* const codec_name_;
   1495   size_t num_initializations_;
   1496   VideoSendStream* stream_;
   1497   VideoEncoderConfig encoder_config_;
   1498 };
   1499 
   1500 template <>
   1501 void VideoCodecConfigObserver<VideoCodecH264>::VerifyCodecSpecifics(
   1502     const VideoCodec& config) const {
   1503   EXPECT_EQ(0, memcmp(&config.codecSpecific.H264, &encoder_settings_,
   1504                       sizeof(encoder_settings_)));
   1505 }
   1506 template <>
   1507 void VideoCodecConfigObserver<VideoCodecVP8>::VerifyCodecSpecifics(
   1508     const VideoCodec& config) const {
   1509   // Check that the number of temporal layers has propagated properly to
   1510   // VideoCodec.
   1511   EXPECT_EQ(kVideoCodecConfigObserverNumberOfTemporalLayers,
   1512             config.codecSpecific.VP8.numberOfTemporalLayers);
   1513 
   1514   for (unsigned char i = 0; i < config.numberOfSimulcastStreams; ++i) {
   1515     EXPECT_EQ(kVideoCodecConfigObserverNumberOfTemporalLayers,
   1516               config.simulcastStream[i].numberOfTemporalLayers);
   1517   }
   1518 
   1519   // Set expected temporal layers as they should have been set when
   1520   // reconfiguring the encoder and not match the set config.
   1521   VideoCodecVP8 encoder_settings = encoder_settings_;
   1522   encoder_settings.numberOfTemporalLayers =
   1523       kVideoCodecConfigObserverNumberOfTemporalLayers;
   1524   EXPECT_EQ(0, memcmp(&config.codecSpecific.VP8, &encoder_settings,
   1525                       sizeof(encoder_settings_)));
   1526 }
   1527 template <>
   1528 void VideoCodecConfigObserver<VideoCodecVP9>::VerifyCodecSpecifics(
   1529     const VideoCodec& config) const {
   1530   // Check that the number of temporal layers has propagated properly to
   1531   // VideoCodec.
   1532   EXPECT_EQ(kVideoCodecConfigObserverNumberOfTemporalLayers,
   1533             config.codecSpecific.VP9.numberOfTemporalLayers);
   1534 
   1535   for (unsigned char i = 0; i < config.numberOfSimulcastStreams; ++i) {
   1536     EXPECT_EQ(kVideoCodecConfigObserverNumberOfTemporalLayers,
   1537               config.simulcastStream[i].numberOfTemporalLayers);
   1538   }
   1539 
   1540   // Set expected temporal layers as they should have been set when
   1541   // reconfiguring the encoder and not match the set config.
   1542   VideoCodecVP9 encoder_settings = encoder_settings_;
   1543   encoder_settings.numberOfTemporalLayers =
   1544       kVideoCodecConfigObserverNumberOfTemporalLayers;
   1545   EXPECT_EQ(0, memcmp(&config.codecSpecific.VP9, &encoder_settings,
   1546                       sizeof(encoder_settings_)));
   1547 }
   1548 
   1549 TEST_F(VideoSendStreamTest, EncoderSetupPropagatesVp8Config) {
   1550   VideoCodecConfigObserver<VideoCodecVP8> test(kVideoCodecVP8, "VP8");
   1551   RunBaseTest(&test);
   1552 }
   1553 
   1554 TEST_F(VideoSendStreamTest, EncoderSetupPropagatesVp9Config) {
   1555   VideoCodecConfigObserver<VideoCodecVP9> test(kVideoCodecVP9, "VP9");
   1556   RunBaseTest(&test);
   1557 }
   1558 
   1559 TEST_F(VideoSendStreamTest, EncoderSetupPropagatesH264Config) {
   1560   VideoCodecConfigObserver<VideoCodecH264> test(kVideoCodecH264, "H264");
   1561   RunBaseTest(&test);
   1562 }
   1563 
   1564 TEST_F(VideoSendStreamTest, RtcpSenderReportContainsMediaBytesSent) {
   1565   class RtcpSenderReportTest : public test::SendTest {
   1566    public:
   1567     RtcpSenderReportTest() : SendTest(kDefaultTimeoutMs),
   1568                              rtp_packets_sent_(0),
   1569                              media_bytes_sent_(0) {}
   1570 
   1571    private:
   1572     Action OnSendRtp(const uint8_t* packet, size_t length) override {
   1573       rtc::CritScope lock(&crit_);
   1574       RTPHeader header;
   1575       EXPECT_TRUE(parser_->Parse(packet, length, &header));
   1576       ++rtp_packets_sent_;
   1577       media_bytes_sent_ += length - header.headerLength - header.paddingLength;
   1578       return SEND_PACKET;
   1579     }
   1580 
   1581     Action OnSendRtcp(const uint8_t* packet, size_t length) override {
   1582       rtc::CritScope lock(&crit_);
   1583       RTCPUtility::RTCPParserV2 parser(packet, length, true);
   1584       EXPECT_TRUE(parser.IsValid());
   1585 
   1586       RTCPUtility::RTCPPacketTypes packet_type = parser.Begin();
   1587       while (packet_type != RTCPUtility::RTCPPacketTypes::kInvalid) {
   1588         if (packet_type == RTCPUtility::RTCPPacketTypes::kSr) {
   1589           // Only compare sent media bytes if SenderPacketCount matches the
   1590           // number of sent rtp packets (a new rtp packet could be sent before
   1591           // the rtcp packet).
   1592           if (parser.Packet().SR.SenderOctetCount > 0 &&
   1593               parser.Packet().SR.SenderPacketCount == rtp_packets_sent_) {
   1594             EXPECT_EQ(media_bytes_sent_, parser.Packet().SR.SenderOctetCount);
   1595             observation_complete_.Set();
   1596           }
   1597         }
   1598         packet_type = parser.Iterate();
   1599       }
   1600 
   1601       return SEND_PACKET;
   1602     }
   1603 
   1604     void PerformTest() override {
   1605       EXPECT_TRUE(Wait()) << "Timed out while waiting for RTCP sender report.";
   1606     }
   1607 
   1608     rtc::CriticalSection crit_;
   1609     size_t rtp_packets_sent_ GUARDED_BY(&crit_);
   1610     size_t media_bytes_sent_ GUARDED_BY(&crit_);
   1611   } test;
   1612 
   1613   RunBaseTest(&test);
   1614 }
   1615 
   1616 TEST_F(VideoSendStreamTest, TranslatesTwoLayerScreencastToTargetBitrate) {
   1617   static const int kScreencastTargetBitrateKbps = 200;
   1618   class ScreencastTargetBitrateTest : public test::SendTest,
   1619                                       public test::FakeEncoder {
   1620    public:
   1621     ScreencastTargetBitrateTest()
   1622         : SendTest(kDefaultTimeoutMs),
   1623           test::FakeEncoder(Clock::GetRealTimeClock()) {}
   1624 
   1625    private:
   1626     int32_t InitEncode(const VideoCodec* config,
   1627                        int32_t number_of_cores,
   1628                        size_t max_payload_size) override {
   1629       EXPECT_EQ(static_cast<unsigned int>(kScreencastTargetBitrateKbps),
   1630                 config->targetBitrate);
   1631       observation_complete_.Set();
   1632       return test::FakeEncoder::InitEncode(
   1633           config, number_of_cores, max_payload_size);
   1634     }
   1635     void ModifyVideoConfigs(
   1636         VideoSendStream::Config* send_config,
   1637         std::vector<VideoReceiveStream::Config>* receive_configs,
   1638         VideoEncoderConfig* encoder_config) override {
   1639       send_config->encoder_settings.encoder = this;
   1640       EXPECT_EQ(1u, encoder_config->streams.size());
   1641       EXPECT_TRUE(
   1642           encoder_config->streams[0].temporal_layer_thresholds_bps.empty());
   1643       encoder_config->streams[0].temporal_layer_thresholds_bps.push_back(
   1644           kScreencastTargetBitrateKbps * 1000);
   1645       encoder_config->content_type = VideoEncoderConfig::ContentType::kScreen;
   1646     }
   1647 
   1648     void PerformTest() override {
   1649       EXPECT_TRUE(Wait())
   1650           << "Timed out while waiting for the encoder to be initialized.";
   1651     }
   1652   } test;
   1653 
   1654   RunBaseTest(&test);
   1655 }
   1656 
   1657 // Disabled on LinuxAsan:
   1658 // https://bugs.chromium.org/p/webrtc/issues/detail?id=5382
   1659 #if defined(ADDRESS_SANITIZER) && defined(WEBRTC_LINUX)
   1660 #define MAYBE_ReconfigureBitratesSetsEncoderBitratesCorrectly \
   1661   DISABLED_ReconfigureBitratesSetsEncoderBitratesCorrectly
   1662 #else
   1663 #define MAYBE_ReconfigureBitratesSetsEncoderBitratesCorrectly \
   1664   ReconfigureBitratesSetsEncoderBitratesCorrectly
   1665 #endif
   1666 
   1667 TEST_F(VideoSendStreamTest,
   1668        MAYBE_ReconfigureBitratesSetsEncoderBitratesCorrectly) {
   1669   // These are chosen to be "kind of odd" to not be accidentally checked against
   1670   // default values.
   1671   static const int kMinBitrateKbps = 137;
   1672   static const int kStartBitrateKbps = 345;
   1673   static const int kLowerMaxBitrateKbps = 312;
   1674   static const int kMaxBitrateKbps = 413;
   1675   static const int kIncreasedStartBitrateKbps = 451;
   1676   static const int kIncreasedMaxBitrateKbps = 597;
   1677   class EncoderBitrateThresholdObserver : public test::SendTest,
   1678                                           public test::FakeEncoder {
   1679    public:
   1680     EncoderBitrateThresholdObserver()
   1681         : SendTest(kDefaultTimeoutMs),
   1682           FakeEncoder(Clock::GetRealTimeClock()),
   1683           num_initializations_(0) {}
   1684 
   1685    private:
   1686     int32_t InitEncode(const VideoCodec* codecSettings,
   1687                        int32_t numberOfCores,
   1688                        size_t maxPayloadSize) override {
   1689       if (num_initializations_ == 0) {
   1690         EXPECT_EQ(static_cast<unsigned int>(kMinBitrateKbps),
   1691                   codecSettings->minBitrate);
   1692         EXPECT_EQ(static_cast<unsigned int>(kStartBitrateKbps),
   1693                   codecSettings->startBitrate);
   1694         EXPECT_EQ(static_cast<unsigned int>(kMaxBitrateKbps),
   1695                   codecSettings->maxBitrate);
   1696         observation_complete_.Set();
   1697       } else if (num_initializations_ == 1) {
   1698         EXPECT_EQ(static_cast<unsigned int>(kLowerMaxBitrateKbps),
   1699                   codecSettings->maxBitrate);
   1700         // The start bitrate should be kept (-1) and capped to the max bitrate.
   1701         // Since this is not an end-to-end call no receiver should have been
   1702         // returning a REMB that could lower this estimate.
   1703         EXPECT_EQ(codecSettings->startBitrate, codecSettings->maxBitrate);
   1704       } else if (num_initializations_ == 2) {
   1705         EXPECT_EQ(static_cast<unsigned int>(kIncreasedMaxBitrateKbps),
   1706                   codecSettings->maxBitrate);
   1707         EXPECT_EQ(static_cast<unsigned int>(kIncreasedStartBitrateKbps),
   1708                   codecSettings->startBitrate);
   1709       }
   1710       ++num_initializations_;
   1711       return FakeEncoder::InitEncode(codecSettings, numberOfCores,
   1712                                      maxPayloadSize);
   1713     }
   1714 
   1715     Call::Config GetSenderCallConfig() override {
   1716       Call::Config config;
   1717       config.bitrate_config.min_bitrate_bps = kMinBitrateKbps * 1000;
   1718       config.bitrate_config.start_bitrate_bps = kStartBitrateKbps * 1000;
   1719       config.bitrate_config.max_bitrate_bps = kMaxBitrateKbps * 1000;
   1720       return config;
   1721     }
   1722 
   1723     void ModifyVideoConfigs(
   1724         VideoSendStream::Config* send_config,
   1725         std::vector<VideoReceiveStream::Config>* receive_configs,
   1726         VideoEncoderConfig* encoder_config) override {
   1727       send_config->encoder_settings.encoder = this;
   1728       // Set bitrates lower/higher than min/max to make sure they are properly
   1729       // capped.
   1730       encoder_config->streams.front().min_bitrate_bps = kMinBitrateKbps * 1000;
   1731       encoder_config->streams.front().max_bitrate_bps = kMaxBitrateKbps * 1000;
   1732       encoder_config_ = *encoder_config;
   1733     }
   1734 
   1735     void OnCallsCreated(Call* sender_call, Call* receiver_call) override {
   1736       call_ = sender_call;
   1737     }
   1738 
   1739     void OnVideoStreamsCreated(
   1740         VideoSendStream* send_stream,
   1741         const std::vector<VideoReceiveStream*>& receive_streams) override {
   1742       send_stream_ = send_stream;
   1743     }
   1744 
   1745     void PerformTest() override {
   1746       Call::Config::BitrateConfig bitrate_config;
   1747       bitrate_config.start_bitrate_bps = kIncreasedStartBitrateKbps * 1000;
   1748       bitrate_config.max_bitrate_bps = kIncreasedMaxBitrateKbps * 1000;
   1749       call_->SetBitrateConfig(bitrate_config);
   1750       EXPECT_TRUE(Wait())
   1751           << "Timed out while waiting encoder to be configured.";
   1752       encoder_config_.streams[0].min_bitrate_bps = 0;
   1753       encoder_config_.streams[0].max_bitrate_bps = kLowerMaxBitrateKbps * 1000;
   1754       send_stream_->ReconfigureVideoEncoder(encoder_config_);
   1755       EXPECT_EQ(2, num_initializations_)
   1756           << "Encoder should have been reconfigured with the new value.";
   1757       encoder_config_.streams[0].target_bitrate_bps =
   1758           encoder_config_.streams[0].min_bitrate_bps;
   1759       encoder_config_.streams[0].max_bitrate_bps =
   1760           kIncreasedMaxBitrateKbps * 1000;
   1761       send_stream_->ReconfigureVideoEncoder(encoder_config_);
   1762       EXPECT_EQ(3, num_initializations_)
   1763           << "Encoder should have been reconfigured with the new value.";
   1764     }
   1765 
   1766     int num_initializations_;
   1767     webrtc::Call* call_;
   1768     webrtc::VideoSendStream* send_stream_;
   1769     webrtc::VideoEncoderConfig encoder_config_;
   1770   } test;
   1771 
   1772   RunBaseTest(&test);
   1773 }
   1774 
   1775 TEST_F(VideoSendStreamTest, ReportsSentResolution) {
   1776   static const size_t kNumStreams = 3;
   1777   // Unusual resolutions to make sure that they are the ones being reported.
   1778   static const struct {
   1779     int width;
   1780     int height;
   1781   } kEncodedResolution[kNumStreams] = {
   1782       {241, 181}, {300, 121}, {121, 221}};
   1783   class ScreencastTargetBitrateTest : public test::SendTest,
   1784                                       public test::FakeEncoder {
   1785    public:
   1786     ScreencastTargetBitrateTest()
   1787         : SendTest(kDefaultTimeoutMs),
   1788           test::FakeEncoder(Clock::GetRealTimeClock()) {}
   1789 
   1790    private:
   1791     int32_t Encode(const VideoFrame& input_image,
   1792                    const CodecSpecificInfo* codecSpecificInfo,
   1793                    const std::vector<FrameType>* frame_types) override {
   1794       CodecSpecificInfo specifics;
   1795       memset(&specifics, 0, sizeof(specifics));
   1796       specifics.codecType = kVideoCodecGeneric;
   1797 
   1798       uint8_t buffer[16] = {0};
   1799       EncodedImage encoded(buffer, sizeof(buffer), sizeof(buffer));
   1800       encoded._timeStamp = input_image.timestamp();
   1801       encoded.capture_time_ms_ = input_image.render_time_ms();
   1802 
   1803       for (size_t i = 0; i < kNumStreams; ++i) {
   1804         specifics.codecSpecific.generic.simulcast_idx = static_cast<uint8_t>(i);
   1805         encoded._frameType = (*frame_types)[i];
   1806         encoded._encodedWidth = kEncodedResolution[i].width;
   1807         encoded._encodedHeight = kEncodedResolution[i].height;
   1808         RTC_DCHECK(callback_ != nullptr);
   1809         if (callback_->Encoded(encoded, &specifics, nullptr) != 0)
   1810           return -1;
   1811       }
   1812 
   1813       observation_complete_.Set();
   1814       return 0;
   1815     }
   1816     void ModifyVideoConfigs(
   1817         VideoSendStream::Config* send_config,
   1818         std::vector<VideoReceiveStream::Config>* receive_configs,
   1819         VideoEncoderConfig* encoder_config) override {
   1820       send_config->encoder_settings.encoder = this;
   1821       EXPECT_EQ(kNumStreams, encoder_config->streams.size());
   1822     }
   1823 
   1824     size_t GetNumVideoStreams() const override { return kNumStreams; }
   1825 
   1826     void PerformTest() override {
   1827       EXPECT_TRUE(Wait())
   1828           << "Timed out while waiting for the encoder to send one frame.";
   1829       VideoSendStream::Stats stats = send_stream_->GetStats();
   1830 
   1831       for (size_t i = 0; i < kNumStreams; ++i) {
   1832         ASSERT_TRUE(stats.substreams.find(kVideoSendSsrcs[i]) !=
   1833                     stats.substreams.end())
   1834             << "No stats for SSRC: " << kVideoSendSsrcs[i]
   1835             << ", stats should exist as soon as frames have been encoded.";
   1836         VideoSendStream::StreamStats ssrc_stats =
   1837             stats.substreams[kVideoSendSsrcs[i]];
   1838         EXPECT_EQ(kEncodedResolution[i].width, ssrc_stats.width);
   1839         EXPECT_EQ(kEncodedResolution[i].height, ssrc_stats.height);
   1840       }
   1841     }
   1842 
   1843     void OnVideoStreamsCreated(
   1844         VideoSendStream* send_stream,
   1845         const std::vector<VideoReceiveStream*>& receive_streams) override {
   1846       send_stream_ = send_stream;
   1847     }
   1848 
   1849     VideoSendStream* send_stream_;
   1850   } test;
   1851 
   1852   RunBaseTest(&test);
   1853 }
   1854 
   1855 class Vp9HeaderObserver : public test::SendTest {
   1856  public:
   1857   Vp9HeaderObserver()
   1858       : SendTest(VideoSendStreamTest::kLongTimeoutMs),
   1859         vp9_encoder_(VP9Encoder::Create()),
   1860         vp9_settings_(VideoEncoder::GetDefaultVp9Settings()),
   1861         packets_sent_(0),
   1862         frames_sent_(0) {}
   1863 
   1864   virtual void ModifyVideoConfigsHook(
   1865       VideoSendStream::Config* send_config,
   1866       std::vector<VideoReceiveStream::Config>* receive_configs,
   1867       VideoEncoderConfig* encoder_config) {}
   1868 
   1869   virtual void InspectHeader(const RTPVideoHeaderVP9& vp9) = 0;
   1870 
   1871  private:
   1872   const int kVp9PayloadType = 105;
   1873 
   1874   void ModifyVideoConfigs(
   1875       VideoSendStream::Config* send_config,
   1876       std::vector<VideoReceiveStream::Config>* receive_configs,
   1877       VideoEncoderConfig* encoder_config) override {
   1878     encoder_config->encoder_specific_settings = &vp9_settings_;
   1879     send_config->encoder_settings.encoder = vp9_encoder_.get();
   1880     send_config->encoder_settings.payload_name = "VP9";
   1881     send_config->encoder_settings.payload_type = kVp9PayloadType;
   1882     ModifyVideoConfigsHook(send_config, receive_configs, encoder_config);
   1883     EXPECT_EQ(1u, encoder_config->streams.size());
   1884     encoder_config->streams[0].temporal_layer_thresholds_bps.resize(
   1885         vp9_settings_.numberOfTemporalLayers - 1);
   1886     encoder_config_ = *encoder_config;
   1887   }
   1888 
   1889   void PerformTest() override {
   1890     EXPECT_TRUE(Wait()) << "Test timed out waiting for VP9 packet, num frames "
   1891                         << frames_sent_;
   1892   }
   1893 
   1894   Action OnSendRtp(const uint8_t* packet, size_t length) override {
   1895     RTPHeader header;
   1896     EXPECT_TRUE(parser_->Parse(packet, length, &header));
   1897 
   1898     EXPECT_EQ(kVp9PayloadType, header.payloadType);
   1899     const uint8_t* payload = packet + header.headerLength;
   1900     size_t payload_length = length - header.headerLength - header.paddingLength;
   1901 
   1902     bool new_packet = packets_sent_ == 0 ||
   1903                       IsNewerSequenceNumber(header.sequenceNumber,
   1904                                             last_header_.sequenceNumber);
   1905     if (payload_length > 0 && new_packet) {
   1906       RtpDepacketizer::ParsedPayload parsed;
   1907       RtpDepacketizerVp9 depacketizer;
   1908       EXPECT_TRUE(depacketizer.Parse(&parsed, payload, payload_length));
   1909       EXPECT_EQ(RtpVideoCodecTypes::kRtpVideoVp9, parsed.type.Video.codec);
   1910       // Verify common fields for all configurations.
   1911       VerifyCommonHeader(parsed.type.Video.codecHeader.VP9);
   1912       CompareConsecutiveFrames(header, parsed.type.Video);
   1913       // Verify configuration specific settings.
   1914       InspectHeader(parsed.type.Video.codecHeader.VP9);
   1915 
   1916       ++packets_sent_;
   1917       if (header.markerBit) {
   1918         ++frames_sent_;
   1919       }
   1920       last_header_ = header;
   1921       last_vp9_ = parsed.type.Video.codecHeader.VP9;
   1922     }
   1923     return SEND_PACKET;
   1924   }
   1925 
   1926  protected:
   1927   bool ContinuousPictureId(const RTPVideoHeaderVP9& vp9) const {
   1928     if (last_vp9_.picture_id > vp9.picture_id) {
   1929       return vp9.picture_id == 0;  // Wrap.
   1930     } else {
   1931       return vp9.picture_id == last_vp9_.picture_id + 1;
   1932     }
   1933   }
   1934 
   1935   void VerifySpatialIdxWithinFrame(const RTPVideoHeaderVP9& vp9) const {
   1936     bool new_layer = vp9.spatial_idx != last_vp9_.spatial_idx;
   1937     EXPECT_EQ(new_layer, vp9.beginning_of_frame);
   1938     EXPECT_EQ(new_layer, last_vp9_.end_of_frame);
   1939     EXPECT_EQ(new_layer ? last_vp9_.spatial_idx + 1 : last_vp9_.spatial_idx,
   1940               vp9.spatial_idx);
   1941   }
   1942 
   1943   void VerifyFixedTemporalLayerStructure(const RTPVideoHeaderVP9& vp9,
   1944                                          uint8_t num_layers) const {
   1945     switch (num_layers) {
   1946       case 0:
   1947         VerifyTemporalLayerStructure0(vp9);
   1948         break;
   1949       case 1:
   1950         VerifyTemporalLayerStructure1(vp9);
   1951         break;
   1952       case 2:
   1953         VerifyTemporalLayerStructure2(vp9);
   1954         break;
   1955       case 3:
   1956         VerifyTemporalLayerStructure3(vp9);
   1957         break;
   1958       default:
   1959         RTC_NOTREACHED();
   1960     }
   1961   }
   1962 
   1963   void VerifyTemporalLayerStructure0(const RTPVideoHeaderVP9& vp9) const {
   1964     EXPECT_EQ(kNoTl0PicIdx, vp9.tl0_pic_idx);
   1965     EXPECT_EQ(kNoTemporalIdx, vp9.temporal_idx);  // no tid
   1966     EXPECT_FALSE(vp9.temporal_up_switch);
   1967   }
   1968 
   1969   void VerifyTemporalLayerStructure1(const RTPVideoHeaderVP9& vp9) const {
   1970     EXPECT_NE(kNoTl0PicIdx, vp9.tl0_pic_idx);
   1971     EXPECT_EQ(0, vp9.temporal_idx);  // 0,0,0,...
   1972     EXPECT_FALSE(vp9.temporal_up_switch);
   1973   }
   1974 
   1975   void VerifyTemporalLayerStructure2(const RTPVideoHeaderVP9& vp9) const {
   1976     EXPECT_NE(kNoTl0PicIdx, vp9.tl0_pic_idx);
   1977     EXPECT_GE(vp9.temporal_idx, 0);  // 0,1,0,1,... (tid reset on I-frames).
   1978     EXPECT_LE(vp9.temporal_idx, 1);
   1979     EXPECT_EQ(vp9.temporal_idx > 0, vp9.temporal_up_switch);
   1980     if (IsNewPictureId(vp9)) {
   1981       uint8_t expected_tid =
   1982           (!vp9.inter_pic_predicted || last_vp9_.temporal_idx == 1) ? 0 : 1;
   1983       EXPECT_EQ(expected_tid, vp9.temporal_idx);
   1984     }
   1985   }
   1986 
   1987   void VerifyTemporalLayerStructure3(const RTPVideoHeaderVP9& vp9) const {
   1988     EXPECT_NE(kNoTl0PicIdx, vp9.tl0_pic_idx);
   1989     EXPECT_GE(vp9.temporal_idx, 0);  // 0,2,1,2,... (tid reset on I-frames).
   1990     EXPECT_LE(vp9.temporal_idx, 2);
   1991     if (IsNewPictureId(vp9) && vp9.inter_pic_predicted) {
   1992       EXPECT_NE(vp9.temporal_idx, last_vp9_.temporal_idx);
   1993       switch (vp9.temporal_idx) {
   1994         case 0:
   1995           EXPECT_EQ(2, last_vp9_.temporal_idx);
   1996           EXPECT_FALSE(vp9.temporal_up_switch);
   1997           break;
   1998         case 1:
   1999           EXPECT_EQ(2, last_vp9_.temporal_idx);
   2000           EXPECT_TRUE(vp9.temporal_up_switch);
   2001           break;
   2002         case 2:
   2003           EXPECT_EQ(last_vp9_.temporal_idx == 0, vp9.temporal_up_switch);
   2004           break;
   2005       }
   2006     }
   2007   }
   2008 
   2009   void VerifyTl0Idx(const RTPVideoHeaderVP9& vp9) const {
   2010     if (vp9.tl0_pic_idx == kNoTl0PicIdx)
   2011       return;
   2012 
   2013     uint8_t expected_tl0_idx = last_vp9_.tl0_pic_idx;
   2014     if (vp9.temporal_idx == 0)
   2015       ++expected_tl0_idx;
   2016     EXPECT_EQ(expected_tl0_idx, vp9.tl0_pic_idx);
   2017   }
   2018 
   2019   bool IsNewPictureId(const RTPVideoHeaderVP9& vp9) const {
   2020     return frames_sent_ > 0 && (vp9.picture_id != last_vp9_.picture_id);
   2021   }
   2022 
   2023   // Flexible mode (F=1):    Non-flexible mode (F=0):
   2024   //
   2025   //      +-+-+-+-+-+-+-+-+     +-+-+-+-+-+-+-+-+
   2026   //      |I|P|L|F|B|E|V|-|     |I|P|L|F|B|E|V|-|
   2027   //      +-+-+-+-+-+-+-+-+     +-+-+-+-+-+-+-+-+
   2028   // I:   |M| PICTURE ID  |  I: |M| PICTURE ID  |
   2029   //      +-+-+-+-+-+-+-+-+     +-+-+-+-+-+-+-+-+
   2030   // M:   | EXTENDED PID  |  M: | EXTENDED PID  |
   2031   //      +-+-+-+-+-+-+-+-+     +-+-+-+-+-+-+-+-+
   2032   // L:   |  T  |U|  S  |D|  L: |  T  |U|  S  |D|
   2033   //      +-+-+-+-+-+-+-+-+     +-+-+-+-+-+-+-+-+
   2034   // P,F: | P_DIFF    |X|N|     |   TL0PICIDX   |
   2035   //      +-+-+-+-+-+-+-+-+     +-+-+-+-+-+-+-+-+
   2036   // X:   |EXTENDED P_DIFF|  V: | SS  ..        |
   2037   //      +-+-+-+-+-+-+-+-+     +-+-+-+-+-+-+-+-+
   2038   // V:   | SS  ..        |
   2039   //      +-+-+-+-+-+-+-+-+
   2040   void VerifyCommonHeader(const RTPVideoHeaderVP9& vp9) const {
   2041     EXPECT_EQ(kMaxTwoBytePictureId, vp9.max_picture_id);       // M:1
   2042     EXPECT_NE(kNoPictureId, vp9.picture_id);                   // I:1
   2043     EXPECT_EQ(vp9_settings_.flexibleMode, vp9.flexible_mode);  // F
   2044     EXPECT_GE(vp9.spatial_idx, 0);                             // S
   2045     EXPECT_LT(vp9.spatial_idx, vp9_settings_.numberOfSpatialLayers);
   2046     if (vp9.ss_data_available)  // V
   2047       VerifySsData(vp9);
   2048 
   2049     if (frames_sent_ == 0)
   2050       EXPECT_FALSE(vp9.inter_pic_predicted);  // P
   2051 
   2052     if (!vp9.inter_pic_predicted) {
   2053       EXPECT_TRUE(vp9.temporal_idx == 0 || vp9.temporal_idx == kNoTemporalIdx);
   2054       EXPECT_FALSE(vp9.temporal_up_switch);
   2055     }
   2056   }
   2057 
   2058   // Scalability structure (SS).
   2059   //
   2060   //      +-+-+-+-+-+-+-+-+
   2061   // V:   | N_S |Y|G|-|-|-|
   2062   //      +-+-+-+-+-+-+-+-+
   2063   // Y:   |    WIDTH      |  N_S + 1 times
   2064   //      +-+-+-+-+-+-+-+-+
   2065   //      |    HEIGHT     |
   2066   //      +-+-+-+-+-+-+-+-+
   2067   // G:   |      N_G      |
   2068   //      +-+-+-+-+-+-+-+-+
   2069   // N_G: |  T  |U| R |-|-|  N_G times
   2070   //      +-+-+-+-+-+-+-+-+
   2071   //      |    P_DIFF     |  R times
   2072   //      +-+-+-+-+-+-+-+-+
   2073   void VerifySsData(const RTPVideoHeaderVP9& vp9) const {
   2074     EXPECT_TRUE(vp9.ss_data_available);             // V
   2075     EXPECT_EQ(vp9_settings_.numberOfSpatialLayers,  // N_S + 1
   2076               vp9.num_spatial_layers);
   2077     EXPECT_TRUE(vp9.spatial_layer_resolution_present);  // Y:1
   2078     size_t expected_width = encoder_config_.streams[0].width;
   2079     size_t expected_height = encoder_config_.streams[0].height;
   2080     for (int i = vp9.num_spatial_layers - 1; i >= 0; --i) {
   2081       EXPECT_EQ(expected_width, vp9.width[i]);    // WIDTH
   2082       EXPECT_EQ(expected_height, vp9.height[i]);  // HEIGHT
   2083       expected_width /= 2;
   2084       expected_height /= 2;
   2085     }
   2086   }
   2087 
   2088   void CompareConsecutiveFrames(const RTPHeader& header,
   2089                                 const RTPVideoHeader& video) const {
   2090     const RTPVideoHeaderVP9& vp9 = video.codecHeader.VP9;
   2091 
   2092     bool new_frame = packets_sent_ == 0 ||
   2093                      IsNewerTimestamp(header.timestamp, last_header_.timestamp);
   2094     EXPECT_EQ(new_frame, video.isFirstPacket);
   2095     if (!new_frame) {
   2096       EXPECT_FALSE(last_header_.markerBit);
   2097       EXPECT_EQ(last_header_.timestamp, header.timestamp);
   2098       EXPECT_EQ(last_vp9_.picture_id, vp9.picture_id);
   2099       EXPECT_EQ(last_vp9_.temporal_idx, vp9.temporal_idx);
   2100       EXPECT_EQ(last_vp9_.tl0_pic_idx, vp9.tl0_pic_idx);
   2101       VerifySpatialIdxWithinFrame(vp9);
   2102       return;
   2103     }
   2104     // New frame.
   2105     EXPECT_TRUE(vp9.beginning_of_frame);
   2106 
   2107     // Compare with last packet in previous frame.
   2108     if (frames_sent_ == 0)
   2109       return;
   2110     EXPECT_TRUE(last_vp9_.end_of_frame);
   2111     EXPECT_TRUE(last_header_.markerBit);
   2112     EXPECT_TRUE(ContinuousPictureId(vp9));
   2113     VerifyTl0Idx(vp9);
   2114   }
   2115 
   2116   rtc::scoped_ptr<VP9Encoder> vp9_encoder_;
   2117   VideoCodecVP9 vp9_settings_;
   2118   webrtc::VideoEncoderConfig encoder_config_;
   2119   RTPHeader last_header_;
   2120   RTPVideoHeaderVP9 last_vp9_;
   2121   size_t packets_sent_;
   2122   size_t frames_sent_;
   2123 };
   2124 
   2125 TEST_F(VideoSendStreamTest, Vp9NonFlexMode_1Tl1SLayers) {
   2126   const uint8_t kNumTemporalLayers = 1;
   2127   const uint8_t kNumSpatialLayers = 1;
   2128   TestVp9NonFlexMode(kNumTemporalLayers, kNumSpatialLayers);
   2129 }
   2130 
   2131 TEST_F(VideoSendStreamTest, Vp9NonFlexMode_2Tl1SLayers) {
   2132   const uint8_t kNumTemporalLayers = 2;
   2133   const uint8_t kNumSpatialLayers = 1;
   2134   TestVp9NonFlexMode(kNumTemporalLayers, kNumSpatialLayers);
   2135 }
   2136 
   2137 TEST_F(VideoSendStreamTest, Vp9NonFlexMode_3Tl1SLayers) {
   2138   const uint8_t kNumTemporalLayers = 3;
   2139   const uint8_t kNumSpatialLayers = 1;
   2140   TestVp9NonFlexMode(kNumTemporalLayers, kNumSpatialLayers);
   2141 }
   2142 
   2143 TEST_F(VideoSendStreamTest, Vp9NonFlexMode_1Tl2SLayers) {
   2144   const uint8_t kNumTemporalLayers = 1;
   2145   const uint8_t kNumSpatialLayers = 2;
   2146   TestVp9NonFlexMode(kNumTemporalLayers, kNumSpatialLayers);
   2147 }
   2148 
   2149 TEST_F(VideoSendStreamTest, Vp9NonFlexMode_2Tl2SLayers) {
   2150   const uint8_t kNumTemporalLayers = 2;
   2151   const uint8_t kNumSpatialLayers = 2;
   2152   TestVp9NonFlexMode(kNumTemporalLayers, kNumSpatialLayers);
   2153 }
   2154 
   2155 TEST_F(VideoSendStreamTest, Vp9NonFlexMode_3Tl2SLayers) {
   2156   const uint8_t kNumTemporalLayers = 3;
   2157   const uint8_t kNumSpatialLayers = 2;
   2158   TestVp9NonFlexMode(kNumTemporalLayers, kNumSpatialLayers);
   2159 }
   2160 
   2161 void VideoSendStreamTest::TestVp9NonFlexMode(uint8_t num_temporal_layers,
   2162                                              uint8_t num_spatial_layers) {
   2163   static const size_t kNumFramesToSend = 100;
   2164   // Set to < kNumFramesToSend and coprime to length of temporal layer
   2165   // structures to verify temporal id reset on key frame.
   2166   static const int kKeyFrameInterval = 31;
   2167   class NonFlexibleMode : public Vp9HeaderObserver {
   2168    public:
   2169     NonFlexibleMode(uint8_t num_temporal_layers, uint8_t num_spatial_layers)
   2170         : num_temporal_layers_(num_temporal_layers),
   2171           num_spatial_layers_(num_spatial_layers),
   2172           l_field_(num_temporal_layers > 1 || num_spatial_layers > 1) {}
   2173     void ModifyVideoConfigsHook(
   2174         VideoSendStream::Config* send_config,
   2175         std::vector<VideoReceiveStream::Config>* receive_configs,
   2176         VideoEncoderConfig* encoder_config) override {
   2177       vp9_settings_.flexibleMode = false;
   2178       vp9_settings_.frameDroppingOn = false;
   2179       vp9_settings_.keyFrameInterval = kKeyFrameInterval;
   2180       vp9_settings_.numberOfTemporalLayers = num_temporal_layers_;
   2181       vp9_settings_.numberOfSpatialLayers = num_spatial_layers_;
   2182     }
   2183 
   2184     void InspectHeader(const RTPVideoHeaderVP9& vp9) override {
   2185       bool ss_data_expected = !vp9.inter_pic_predicted &&
   2186                               vp9.beginning_of_frame && vp9.spatial_idx == 0;
   2187       EXPECT_EQ(ss_data_expected, vp9.ss_data_available);
   2188       EXPECT_EQ(vp9.spatial_idx > 0, vp9.inter_layer_predicted);  // D
   2189       EXPECT_EQ(!vp9.inter_pic_predicted,
   2190                 frames_sent_ % kKeyFrameInterval == 0);
   2191 
   2192       if (IsNewPictureId(vp9)) {
   2193         EXPECT_EQ(0, vp9.spatial_idx);
   2194         EXPECT_EQ(num_spatial_layers_ - 1, last_vp9_.spatial_idx);
   2195       }
   2196 
   2197       VerifyFixedTemporalLayerStructure(vp9,
   2198                                         l_field_ ? num_temporal_layers_ : 0);
   2199 
   2200       if (frames_sent_ > kNumFramesToSend)
   2201         observation_complete_.Set();
   2202     }
   2203     const uint8_t num_temporal_layers_;
   2204     const uint8_t num_spatial_layers_;
   2205     const bool l_field_;
   2206   } test(num_temporal_layers, num_spatial_layers);
   2207 
   2208   RunBaseTest(&test);
   2209 }
   2210 
   2211 #if !defined(MEMORY_SANITIZER)
   2212 // Fails under MemorySanitizer:
   2213 // See https://code.google.com/p/webrtc/issues/detail?id=5402.
   2214 TEST_F(VideoSendStreamTest, Vp9FlexModeRefCount) {
   2215   class FlexibleMode : public Vp9HeaderObserver {
   2216     void ModifyVideoConfigsHook(
   2217         VideoSendStream::Config* send_config,
   2218         std::vector<VideoReceiveStream::Config>* receive_configs,
   2219         VideoEncoderConfig* encoder_config) override {
   2220       encoder_config->content_type = VideoEncoderConfig::ContentType::kScreen;
   2221       vp9_settings_.flexibleMode = true;
   2222       vp9_settings_.numberOfTemporalLayers = 1;
   2223       vp9_settings_.numberOfSpatialLayers = 2;
   2224     }
   2225 
   2226     void InspectHeader(const RTPVideoHeaderVP9& vp9_header) override {
   2227       EXPECT_TRUE(vp9_header.flexible_mode);
   2228       EXPECT_EQ(kNoTl0PicIdx, vp9_header.tl0_pic_idx);
   2229       if (vp9_header.inter_pic_predicted) {
   2230         EXPECT_GT(vp9_header.num_ref_pics, 0u);
   2231         observation_complete_.Set();
   2232       }
   2233     }
   2234   } test;
   2235 
   2236   RunBaseTest(&test);
   2237 }
   2238 #endif
   2239 
   2240 }  // namespace webrtc
   2241