| OLD | NEW | 
|     1 /* |     1 /* | 
|     2  *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. |     2  *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. | 
|     3  * |     3  * | 
|     4  *  Use of this source code is governed by a BSD-style license |     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 |     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 |     6  *  tree. An additional intellectual property rights grant can be found | 
|     7  *  in the file PATENTS.  All contributing project authors may |     7  *  in the file PATENTS.  All contributing project authors may | 
|     8  *  be found in the AUTHORS file in the root of the source tree. |     8  *  be found in the AUTHORS file in the root of the source tree. | 
|     9  */ |     9  */ | 
|    10 #include <algorithm> |    10 #include <algorithm> | 
| (...skipping 563 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   574  |   574  | 
|   575     uint32_t local_ssrc_; |   575     uint32_t local_ssrc_; | 
|   576     uint32_t remote_ssrc_; |   576     uint32_t remote_ssrc_; | 
|   577     Transport* receive_transport_; |   577     Transport* receive_transport_; | 
|   578     rtc::Optional<uint16_t> sequence_number_to_retransmit_; |   578     rtc::Optional<uint16_t> sequence_number_to_retransmit_; | 
|   579   } test; |   579   } test; | 
|   580  |   580  | 
|   581   RunBaseTest(&test); |   581   RunBaseTest(&test); | 
|   582 } |   582 } | 
|   583  |   583  | 
|   584 TEST_F(EndToEndTest, CanReceiveFec) { |   584 TEST_F(EndToEndTest, CanReceiveUlpfec) { | 
|   585   class FecRenderObserver : public test::EndToEndTest, |   585   class UlpfecRenderObserver : public test::EndToEndTest, | 
|   586                             public rtc::VideoSinkInterface<VideoFrame> { |   586                                public rtc::VideoSinkInterface<VideoFrame> { | 
|   587    public: |   587    public: | 
|   588     FecRenderObserver() |   588     UlpfecRenderObserver() | 
|   589         : EndToEndTest(kDefaultTimeoutMs), state_(kFirstPacket) {} |   589         : EndToEndTest(kDefaultTimeoutMs), state_(kFirstPacket) {} | 
|   590  |   590  | 
|   591    private: |   591    private: | 
|   592     Action OnSendRtp(const uint8_t* packet, size_t length) override { |   592     Action OnSendRtp(const uint8_t* packet, size_t length) override { | 
|   593       rtc::CritScope lock(&crit_); |   593       rtc::CritScope lock(&crit_); | 
|   594       RTPHeader header; |   594       RTPHeader header; | 
|   595       EXPECT_TRUE(parser_->Parse(packet, length, &header)); |   595       EXPECT_TRUE(parser_->Parse(packet, length, &header)); | 
|   596  |   596  | 
|   597       int encapsulated_payload_type = -1; |   597       int encapsulated_payload_type = -1; | 
|   598       if (header.payloadType == kRedPayloadType) { |   598       if (header.payloadType == kRedPayloadType) { | 
|   599         encapsulated_payload_type = |   599         encapsulated_payload_type = | 
|   600             static_cast<int>(packet[header.headerLength]); |   600             static_cast<int>(packet[header.headerLength]); | 
|   601         if (encapsulated_payload_type != kFakeVideoSendPayloadType) |   601         if (encapsulated_payload_type != kFakeVideoSendPayloadType) | 
|   602           EXPECT_EQ(kUlpfecPayloadType, encapsulated_payload_type); |   602           EXPECT_EQ(kUlpfecPayloadType, encapsulated_payload_type); | 
|   603       } else { |   603       } else { | 
|   604         EXPECT_EQ(kFakeVideoSendPayloadType, header.payloadType); |   604         EXPECT_EQ(kFakeVideoSendPayloadType, header.payloadType); | 
|   605       } |   605       } | 
|   606  |   606  | 
|   607       if (protected_sequence_numbers_.count(header.sequenceNumber) != 0) { |   607       if (protected_sequence_numbers_.count(header.sequenceNumber) != 0) { | 
|   608         // Retransmitted packet, should not count. |   608         // Retransmitted packet, should not count. | 
|   609         protected_sequence_numbers_.erase(header.sequenceNumber); |   609         protected_sequence_numbers_.erase(header.sequenceNumber); | 
|   610         EXPECT_GT(protected_timestamps_.count(header.timestamp), 0u); |   610         EXPECT_GT(protected_timestamps_.count(header.timestamp), 0u); | 
|   611         protected_timestamps_.erase(header.timestamp); |   611         protected_timestamps_.erase(header.timestamp); | 
|   612         return SEND_PACKET; |   612         return SEND_PACKET; | 
|   613       } |   613       } | 
|   614  |   614  | 
|   615       switch (state_) { |   615       switch (state_) { | 
|   616         case kFirstPacket: |   616         case kFirstPacket: | 
|   617           state_ = kDropEveryOtherPacketUntilFec; |   617           state_ = kDropEveryOtherPacketUntilUlpfec; | 
|   618           break; |   618           break; | 
|   619         case kDropEveryOtherPacketUntilFec: |   619         case kDropEveryOtherPacketUntilUlpfec: | 
|   620           if (encapsulated_payload_type == kUlpfecPayloadType) { |   620           if (encapsulated_payload_type == kUlpfecPayloadType) { | 
|   621             state_ = kDropNextMediaPacket; |   621             state_ = kDropNextMediaPacket; | 
|   622             return SEND_PACKET; |   622             return SEND_PACKET; | 
|   623           } |   623           } | 
|   624           if (header.sequenceNumber % 2 == 0) |   624           if (header.sequenceNumber % 2 == 0) | 
|   625             return DROP_PACKET; |   625             return DROP_PACKET; | 
|   626           break; |   626           break; | 
|   627         case kDropNextMediaPacket: |   627         case kDropNextMediaPacket: | 
|   628           if (encapsulated_payload_type == kFakeVideoSendPayloadType) { |   628           if (encapsulated_payload_type == kFakeVideoSendPayloadType) { | 
|   629             protected_sequence_numbers_.insert(header.sequenceNumber); |   629             protected_sequence_numbers_.insert(header.sequenceNumber); | 
|   630             protected_timestamps_.insert(header.timestamp); |   630             protected_timestamps_.insert(header.timestamp); | 
|   631             state_ = kDropEveryOtherPacketUntilFec; |   631             state_ = kDropEveryOtherPacketUntilUlpfec; | 
|   632             return DROP_PACKET; |   632             return DROP_PACKET; | 
|   633           } |   633           } | 
|   634           break; |   634           break; | 
|   635       } |   635       } | 
|   636  |   636  | 
|   637       return SEND_PACKET; |   637       return SEND_PACKET; | 
|   638     } |   638     } | 
|   639  |   639  | 
|   640     void OnFrame(const VideoFrame& video_frame) override { |   640     void OnFrame(const VideoFrame& video_frame) override { | 
|   641       rtc::CritScope lock(&crit_); |   641       rtc::CritScope lock(&crit_); | 
|   642       // Rendering frame with timestamp of packet that was dropped -> FEC |   642       // Rendering frame with timestamp of packet that was dropped -> FEC | 
|   643       // protection worked. |   643       // protection worked. | 
|   644       if (protected_timestamps_.count(video_frame.timestamp()) != 0) |   644       if (protected_timestamps_.count(video_frame.timestamp()) != 0) | 
|   645         observation_complete_.Set(); |   645         observation_complete_.Set(); | 
|   646     } |   646     } | 
|   647  |   647  | 
|   648     enum { |   648     enum { | 
|   649       kFirstPacket, |   649       kFirstPacket, | 
|   650       kDropEveryOtherPacketUntilFec, |   650       kDropEveryOtherPacketUntilUlpfec, | 
|   651       kDropNextMediaPacket, |   651       kDropNextMediaPacket, | 
|   652     } state_; |   652     } state_; | 
|   653  |   653  | 
|   654     void ModifyVideoConfigs( |   654     void ModifyVideoConfigs( | 
|   655         VideoSendStream::Config* send_config, |   655         VideoSendStream::Config* send_config, | 
|   656         std::vector<VideoReceiveStream::Config>* receive_configs, |   656         std::vector<VideoReceiveStream::Config>* receive_configs, | 
|   657         VideoEncoderConfig* encoder_config) override { |   657         VideoEncoderConfig* encoder_config) override { | 
|   658       // TODO(pbos): Run this test with combined NACK/FEC enabled as well. |   658       // TODO(pbos): Run this test with combined NACK/ULPFEC enabled as well. | 
|   659       // int rtp_history_ms = 1000; |   659       // int rtp_history_ms = 1000; | 
|   660       // (*receive_configs)[0].rtp.nack.rtp_history_ms = rtp_history_ms; |   660       // (*receive_configs)[0].rtp.nack.rtp_history_ms = rtp_history_ms; | 
|   661       // send_config->rtp.nack.rtp_history_ms = rtp_history_ms; |   661       // send_config->rtp.nack.rtp_history_ms = rtp_history_ms; | 
|   662       send_config->rtp.ulpfec.red_payload_type = kRedPayloadType; |   662       send_config->rtp.ulpfec.red_payload_type = kRedPayloadType; | 
|   663       send_config->rtp.ulpfec.ulpfec_payload_type = kUlpfecPayloadType; |   663       send_config->rtp.ulpfec.ulpfec_payload_type = kUlpfecPayloadType; | 
|   664  |   664  | 
|   665       (*receive_configs)[0].rtp.ulpfec.red_payload_type = kRedPayloadType; |   665       (*receive_configs)[0].rtp.ulpfec.red_payload_type = kRedPayloadType; | 
|   666       (*receive_configs)[0].rtp.ulpfec.ulpfec_payload_type = kUlpfecPayloadType; |   666       (*receive_configs)[0].rtp.ulpfec.ulpfec_payload_type = kUlpfecPayloadType; | 
|   667       (*receive_configs)[0].renderer = this; |   667       (*receive_configs)[0].renderer = this; | 
|   668     } |   668     } | 
|   669  |   669  | 
|   670     void PerformTest() override { |   670     void PerformTest() override { | 
|   671       EXPECT_TRUE(Wait()) |   671       EXPECT_TRUE(Wait()) | 
|   672           << "Timed out waiting for dropped frames frames to be rendered."; |   672           << "Timed out waiting for dropped frames frames to be rendered."; | 
|   673     } |   673     } | 
|   674  |   674  | 
|   675     rtc::CriticalSection crit_; |   675     rtc::CriticalSection crit_; | 
|   676     std::set<uint32_t> protected_sequence_numbers_ GUARDED_BY(crit_); |   676     std::set<uint32_t> protected_sequence_numbers_ GUARDED_BY(crit_); | 
|   677     std::set<uint32_t> protected_timestamps_ GUARDED_BY(crit_); |   677     std::set<uint32_t> protected_timestamps_ GUARDED_BY(crit_); | 
|   678   } test; |   678   } test; | 
|   679  |   679  | 
|   680   RunBaseTest(&test); |   680   RunBaseTest(&test); | 
|   681 } |   681 } | 
|   682  |   682  | 
|   683 TEST_F(EndToEndTest, ReceivedFecPacketsNotNacked) { |   683 TEST_F(EndToEndTest, ReceivedUlpfecPacketsNotNacked) { | 
|   684   class FecNackObserver : public test::EndToEndTest { |   684   class UlpfecNackObserver : public test::EndToEndTest { | 
|   685    public: |   685    public: | 
|   686     FecNackObserver() |   686     UlpfecNackObserver() | 
|   687         : EndToEndTest(kDefaultTimeoutMs), |   687         : EndToEndTest(kDefaultTimeoutMs), | 
|   688           state_(kFirstPacket), |   688           state_(kFirstPacket), | 
|   689           fec_sequence_number_(0), |   689           ulpfec_sequence_number_(0), | 
|   690           has_last_sequence_number_(false), |   690           has_last_sequence_number_(false), | 
|   691           last_sequence_number_(0), |   691           last_sequence_number_(0), | 
|   692           encoder_(VideoEncoder::Create(VideoEncoder::EncoderType::kVp8)), |   692           encoder_(VideoEncoder::Create(VideoEncoder::EncoderType::kVp8)), | 
|   693           decoder_(VP8Decoder::Create()) {} |   693           decoder_(VP8Decoder::Create()) {} | 
|   694  |   694  | 
|   695    private: |   695    private: | 
|   696     Action OnSendRtp(const uint8_t* packet, size_t length) override { |   696     Action OnSendRtp(const uint8_t* packet, size_t length) override { | 
|   697       rtc::CritScope lock_(&crit_); |   697       rtc::CritScope lock_(&crit_); | 
|   698       RTPHeader header; |   698       RTPHeader header; | 
|   699       EXPECT_TRUE(parser_->Parse(packet, length, &header)); |   699       EXPECT_TRUE(parser_->Parse(packet, length, &header)); | 
| (...skipping 10 matching lines...) Expand all  Loading... | 
|   710  |   710  | 
|   711       if (has_last_sequence_number_ && |   711       if (has_last_sequence_number_ && | 
|   712           !IsNewerSequenceNumber(header.sequenceNumber, |   712           !IsNewerSequenceNumber(header.sequenceNumber, | 
|   713                                  last_sequence_number_)) { |   713                                  last_sequence_number_)) { | 
|   714         // Drop retransmitted packets. |   714         // Drop retransmitted packets. | 
|   715         return DROP_PACKET; |   715         return DROP_PACKET; | 
|   716       } |   716       } | 
|   717       last_sequence_number_ = header.sequenceNumber; |   717       last_sequence_number_ = header.sequenceNumber; | 
|   718       has_last_sequence_number_ = true; |   718       has_last_sequence_number_ = true; | 
|   719  |   719  | 
|   720       bool fec_packet = encapsulated_payload_type == kUlpfecPayloadType; |   720       bool ulpfec_packet = encapsulated_payload_type == kUlpfecPayloadType; | 
|   721       switch (state_) { |   721       switch (state_) { | 
|   722         case kFirstPacket: |   722         case kFirstPacket: | 
|   723           state_ = kDropEveryOtherPacketUntilFec; |   723           state_ = kDropEveryOtherPacketUntilUlpfec; | 
|   724           break; |   724           break; | 
|   725         case kDropEveryOtherPacketUntilFec: |   725         case kDropEveryOtherPacketUntilUlpfec: | 
|   726           if (fec_packet) { |   726           if (ulpfec_packet) { | 
|   727             state_ = kDropAllMediaPacketsUntilFec; |   727             state_ = kDropAllMediaPacketsUntilUlpfec; | 
|   728           } else if (header.sequenceNumber % 2 == 0) { |   728           } else if (header.sequenceNumber % 2 == 0) { | 
|   729             return DROP_PACKET; |   729             return DROP_PACKET; | 
|   730           } |   730           } | 
|   731           break; |   731           break; | 
|   732         case kDropAllMediaPacketsUntilFec: |   732         case kDropAllMediaPacketsUntilUlpfec: | 
|   733           if (!fec_packet) |   733           if (!ulpfec_packet) | 
|   734             return DROP_PACKET; |   734             return DROP_PACKET; | 
|   735           fec_sequence_number_ = header.sequenceNumber; |   735           ulpfec_sequence_number_ = header.sequenceNumber; | 
|   736           state_ = kDropOneMediaPacket; |   736           state_ = kDropOneMediaPacket; | 
|   737           break; |   737           break; | 
|   738         case kDropOneMediaPacket: |   738         case kDropOneMediaPacket: | 
|   739           if (fec_packet) |   739           if (ulpfec_packet) | 
|   740             return DROP_PACKET; |   740             return DROP_PACKET; | 
|   741           state_ = kPassOneMediaPacket; |   741           state_ = kPassOneMediaPacket; | 
|   742           return DROP_PACKET; |   742           return DROP_PACKET; | 
|   743           break; |   743           break; | 
|   744         case kPassOneMediaPacket: |   744         case kPassOneMediaPacket: | 
|   745           if (fec_packet) |   745           if (ulpfec_packet) | 
|   746             return DROP_PACKET; |   746             return DROP_PACKET; | 
|   747           // Pass one media packet after dropped packet after last FEC, |   747           // Pass one media packet after dropped packet after last FEC, | 
|   748           // otherwise receiver might never see a seq_no after |   748           // otherwise receiver might never see a seq_no after | 
|   749           // |fec_sequence_number_| |   749           // |ulpfec_sequence_number_| | 
|   750           state_ = kVerifyFecPacketNotInNackList; |   750           state_ = kVerifyUlpfecPacketNotInNackList; | 
|   751           break; |   751           break; | 
|   752         case kVerifyFecPacketNotInNackList: |   752         case kVerifyUlpfecPacketNotInNackList: | 
|   753           // Continue to drop packets. Make sure no frame can be decoded. |   753           // Continue to drop packets. Make sure no frame can be decoded. | 
|   754           if (fec_packet || header.sequenceNumber % 2 == 0) |   754           if (ulpfec_packet || header.sequenceNumber % 2 == 0) | 
|   755             return DROP_PACKET; |   755             return DROP_PACKET; | 
|   756           break; |   756           break; | 
|   757       } |   757       } | 
|   758       return SEND_PACKET; |   758       return SEND_PACKET; | 
|   759     } |   759     } | 
|   760  |   760  | 
|   761     Action OnReceiveRtcp(const uint8_t* packet, size_t length) override { |   761     Action OnReceiveRtcp(const uint8_t* packet, size_t length) override { | 
|   762       rtc::CritScope lock_(&crit_); |   762       rtc::CritScope lock_(&crit_); | 
|   763       if (state_ == kVerifyFecPacketNotInNackList) { |   763       if (state_ == kVerifyUlpfecPacketNotInNackList) { | 
|   764         test::RtcpPacketParser rtcp_parser; |   764         test::RtcpPacketParser rtcp_parser; | 
|   765         rtcp_parser.Parse(packet, length); |   765         rtcp_parser.Parse(packet, length); | 
|   766         const std::vector<uint16_t>& nacks = rtcp_parser.nack()->packet_ids(); |   766         const std::vector<uint16_t>& nacks = rtcp_parser.nack()->packet_ids(); | 
|   767         EXPECT_TRUE(std::find(nacks.begin(), nacks.end(), |   767         EXPECT_TRUE(std::find(nacks.begin(), nacks.end(), | 
|   768                               fec_sequence_number_) == nacks.end()) |   768                               ulpfec_sequence_number_) == nacks.end()) | 
|   769             << "Got nack for FEC packet"; |   769             << "Got nack for ULPFEC packet"; | 
|   770         if (!nacks.empty() && |   770         if (!nacks.empty() && | 
|   771             IsNewerSequenceNumber(nacks.back(), fec_sequence_number_)) { |   771             IsNewerSequenceNumber(nacks.back(), ulpfec_sequence_number_)) { | 
|   772           observation_complete_.Set(); |   772           observation_complete_.Set(); | 
|   773         } |   773         } | 
|   774       } |   774       } | 
|   775       return SEND_PACKET; |   775       return SEND_PACKET; | 
|   776     } |   776     } | 
|   777  |   777  | 
|   778     test::PacketTransport* CreateSendTransport(Call* sender_call) override { |   778     test::PacketTransport* CreateSendTransport(Call* sender_call) override { | 
|   779       // At low RTT (< kLowRttNackMs) -> NACK only, no FEC. |   779       // At low RTT (< kLowRttNackMs) -> NACK only, no FEC. | 
|   780       // Configure some network delay. |   780       // Configure some network delay. | 
|   781       const int kNetworkDelayMs = 50; |   781       const int kNetworkDelayMs = 50; | 
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   819       (*receive_configs)[0].decoders[0].decoder = decoder_.get(); |   819       (*receive_configs)[0].decoders[0].decoder = decoder_.get(); | 
|   820     } |   820     } | 
|   821  |   821  | 
|   822     void PerformTest() override { |   822     void PerformTest() override { | 
|   823       EXPECT_TRUE(Wait()) |   823       EXPECT_TRUE(Wait()) | 
|   824           << "Timed out while waiting for FEC packets to be received."; |   824           << "Timed out while waiting for FEC packets to be received."; | 
|   825     } |   825     } | 
|   826  |   826  | 
|   827     enum { |   827     enum { | 
|   828       kFirstPacket, |   828       kFirstPacket, | 
|   829       kDropEveryOtherPacketUntilFec, |   829       kDropEveryOtherPacketUntilUlpfec, | 
|   830       kDropAllMediaPacketsUntilFec, |   830       kDropAllMediaPacketsUntilUlpfec, | 
|   831       kDropOneMediaPacket, |   831       kDropOneMediaPacket, | 
|   832       kPassOneMediaPacket, |   832       kPassOneMediaPacket, | 
|   833       kVerifyFecPacketNotInNackList, |   833       kVerifyUlpfecPacketNotInNackList, | 
|   834     } state_; |   834     } state_; | 
|   835  |   835  | 
|   836     rtc::CriticalSection crit_; |   836     rtc::CriticalSection crit_; | 
|   837     uint16_t fec_sequence_number_ GUARDED_BY(&crit_); |   837     uint16_t ulpfec_sequence_number_ GUARDED_BY(&crit_); | 
|   838     bool has_last_sequence_number_; |   838     bool has_last_sequence_number_; | 
|   839     uint16_t last_sequence_number_; |   839     uint16_t last_sequence_number_; | 
|   840     std::unique_ptr<webrtc::VideoEncoder> encoder_; |   840     std::unique_ptr<webrtc::VideoEncoder> encoder_; | 
|   841     std::unique_ptr<webrtc::VideoDecoder> decoder_; |   841     std::unique_ptr<webrtc::VideoDecoder> decoder_; | 
|   842   } test; |   842   } test; | 
|   843  |   843  | 
|   844   RunBaseTest(&test); |   844   RunBaseTest(&test); | 
|   845 } |   845 } | 
|   846  |   846  | 
|   847 // This test drops second RTP packet with a marker bit set, makes sure it's |   847 // This test drops second RTP packet with a marker bit set, makes sure it's | 
| (...skipping 2902 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  3750   VerifyNewVideoReceiveStreamsRespectNetworkState(MediaType::AUDIO, &transport); |  3750   VerifyNewVideoReceiveStreamsRespectNetworkState(MediaType::AUDIO, &transport); | 
|  3751 } |  3751 } | 
|  3752  |  3752  | 
|  3753 void VerifyEmptyNackConfig(const NackConfig& config) { |  3753 void VerifyEmptyNackConfig(const NackConfig& config) { | 
|  3754   EXPECT_EQ(0, config.rtp_history_ms) |  3754   EXPECT_EQ(0, config.rtp_history_ms) | 
|  3755       << "Enabling NACK requires rtcp-fb: nack negotiation."; |  3755       << "Enabling NACK requires rtcp-fb: nack negotiation."; | 
|  3756 } |  3756 } | 
|  3757  |  3757  | 
|  3758 void VerifyEmptyUlpfecConfig(const UlpfecConfig& config) { |  3758 void VerifyEmptyUlpfecConfig(const UlpfecConfig& config) { | 
|  3759   EXPECT_EQ(-1, config.ulpfec_payload_type) |  3759   EXPECT_EQ(-1, config.ulpfec_payload_type) | 
|  3760       << "Enabling FEC requires rtpmap: ulpfec negotiation."; |  3760       << "Enabling ULPFEC requires rtpmap: ulpfec negotiation."; | 
|  3761   EXPECT_EQ(-1, config.red_payload_type) |  3761   EXPECT_EQ(-1, config.red_payload_type) | 
|  3762       << "Enabling FEC requires rtpmap: red negotiation."; |  3762       << "Enabling ULPFEC requires rtpmap: red negotiation."; | 
|  3763   EXPECT_EQ(-1, config.red_rtx_payload_type) |  3763   EXPECT_EQ(-1, config.red_rtx_payload_type) | 
|  3764       << "Enabling RTX in FEC requires rtpmap: rtx negotiation."; |  3764       << "Enabling RTX in ULPFEC requires rtpmap: rtx negotiation."; | 
|  3765 } |  3765 } | 
|  3766  |  3766  | 
|  3767 TEST_F(EndToEndTest, VerifyDefaultSendConfigParameters) { |  3767 TEST_F(EndToEndTest, VerifyDefaultSendConfigParameters) { | 
|  3768   VideoSendStream::Config default_send_config(nullptr); |  3768   VideoSendStream::Config default_send_config(nullptr); | 
|  3769   EXPECT_EQ(0, default_send_config.rtp.nack.rtp_history_ms) |  3769   EXPECT_EQ(0, default_send_config.rtp.nack.rtp_history_ms) | 
|  3770       << "Enabling NACK require rtcp-fb: nack negotiation."; |  3770       << "Enabling NACK require rtcp-fb: nack negotiation."; | 
|  3771   EXPECT_TRUE(default_send_config.rtp.rtx.ssrcs.empty()) |  3771   EXPECT_TRUE(default_send_config.rtp.rtx.ssrcs.empty()) | 
|  3772       << "Enabling RTX requires rtpmap: rtx negotiation."; |  3772       << "Enabling RTX requires rtpmap: rtx negotiation."; | 
|  3773   EXPECT_TRUE(default_send_config.rtp.extensions.empty()) |  3773   EXPECT_TRUE(default_send_config.rtp.extensions.empty()) | 
|  3774       << "Enabling RTP extensions require negotiation."; |  3774       << "Enabling RTP extensions require negotiation."; | 
| (...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  3962     std::unique_ptr<VideoEncoder> encoder_; |  3962     std::unique_ptr<VideoEncoder> encoder_; | 
|  3963     std::unique_ptr<VideoDecoder> decoder_; |  3963     std::unique_ptr<VideoDecoder> decoder_; | 
|  3964     rtc::CriticalSection crit_; |  3964     rtc::CriticalSection crit_; | 
|  3965     int recorded_frames_ GUARDED_BY(crit_); |  3965     int recorded_frames_ GUARDED_BY(crit_); | 
|  3966   } test(this); |  3966   } test(this); | 
|  3967  |  3967  | 
|  3968   RunBaseTest(&test); |  3968   RunBaseTest(&test); | 
|  3969 } |  3969 } | 
|  3970  |  3970  | 
|  3971 }  // namespace webrtc |  3971 }  // namespace webrtc | 
| OLD | NEW |