| Index: webrtc/video/end_to_end_tests.cc
|
| diff --git a/webrtc/video/end_to_end_tests.cc b/webrtc/video/end_to_end_tests.cc
|
| index 607d654c929d896f3e8f3f02f6a0178b1b8bf020..592c31a675da6b158d4c0ce3c480b5b5f7edf643 100644
|
| --- a/webrtc/video/end_to_end_tests.cc
|
| +++ b/webrtc/video/end_to_end_tests.cc
|
| @@ -584,8 +584,7 @@ TEST_F(EndToEndTest, CanReceiveFec) {
|
| RunBaseTest(&test);
|
| }
|
|
|
| -// Flacky on all platforms. See webrtc:4328.
|
| -TEST_F(EndToEndTest, DISABLED_ReceivedFecPacketsNotNacked) {
|
| +TEST_F(EndToEndTest, ReceivedFecPacketsNotNacked) {
|
| class FecNackObserver : public test::EndToEndTest {
|
| public:
|
| FecNackObserver()
|
| @@ -593,7 +592,9 @@ TEST_F(EndToEndTest, DISABLED_ReceivedFecPacketsNotNacked) {
|
| state_(kFirstPacket),
|
| fec_sequence_number_(0),
|
| has_last_sequence_number_(false),
|
| - last_sequence_number_(0) {}
|
| + last_sequence_number_(0),
|
| + encoder_(VideoEncoder::Create(VideoEncoder::EncoderType::kVp8)),
|
| + decoder_(VP8Decoder::Create()) {}
|
|
|
| private:
|
| Action OnSendRtp(const uint8_t* packet, size_t length) override {
|
| @@ -636,6 +637,20 @@ TEST_F(EndToEndTest, DISABLED_ReceivedFecPacketsNotNacked) {
|
| if (!fec_packet)
|
| return DROP_PACKET;
|
| fec_sequence_number_ = header.sequenceNumber;
|
| + state_ = kDropOneMediaPacket;
|
| + break;
|
| + case kDropOneMediaPacket:
|
| + if (fec_packet)
|
| + return DROP_PACKET;
|
| + state_ = kPassOneMediaPacket;
|
| + return DROP_PACKET;
|
| + break;
|
| + case kPassOneMediaPacket:
|
| + if (fec_packet)
|
| + return DROP_PACKET;
|
| + // Pass one media packet after dropped packet after last FEC,
|
| + // otherwise receiver might never see a seq_no after
|
| + // |fec_sequence_number_|
|
| state_ = kVerifyFecPacketNotInNackList;
|
| break;
|
| case kVerifyFecPacketNotInNackList:
|
| @@ -653,10 +668,11 @@ TEST_F(EndToEndTest, DISABLED_ReceivedFecPacketsNotNacked) {
|
| test::RtcpPacketParser rtcp_parser;
|
| rtcp_parser.Parse(packet, length);
|
| std::vector<uint16_t> nacks = rtcp_parser.nack_item()->last_nack_list();
|
| + EXPECT_TRUE(std::find(nacks.begin(), nacks.end(),
|
| + fec_sequence_number_) == nacks.end())
|
| + << "Got nack for FEC packet";
|
| if (!nacks.empty() &&
|
| IsNewerSequenceNumber(nacks.back(), fec_sequence_number_)) {
|
| - EXPECT_TRUE(std::find(
|
| - nacks.begin(), nacks.end(), fec_sequence_number_) == nacks.end());
|
| observation_complete_.Set();
|
| }
|
| }
|
| @@ -690,9 +706,24 @@ TEST_F(EndToEndTest, DISABLED_ReceivedFecPacketsNotNacked) {
|
| send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
|
| send_config->rtp.fec.red_payload_type = kRedPayloadType;
|
| send_config->rtp.fec.ulpfec_payload_type = kUlpfecPayloadType;
|
| + // Set codec to VP8, otherwise NACK/FEC hybrid will be disabled.
|
| + send_config->encoder_settings.encoder = encoder_.get();
|
| + send_config->encoder_settings.payload_name = "VP8";
|
| + send_config->encoder_settings.payload_type = kFakeVideoSendPayloadType;
|
| + encoder_config->streams[0].min_bitrate_bps = 50000;
|
| + encoder_config->streams[0].max_bitrate_bps =
|
| + encoder_config->streams[0].target_bitrate_bps = 2000000;
|
| +
|
| (*receive_configs)[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
|
| (*receive_configs)[0].rtp.fec.red_payload_type = kRedPayloadType;
|
| (*receive_configs)[0].rtp.fec.ulpfec_payload_type = kUlpfecPayloadType;
|
| +
|
| + (*receive_configs)[0].decoders.resize(1);
|
| + (*receive_configs)[0].decoders[0].payload_type =
|
| + send_config->encoder_settings.payload_type;
|
| + (*receive_configs)[0].decoders[0].payload_name =
|
| + send_config->encoder_settings.payload_name;
|
| + (*receive_configs)[0].decoders[0].decoder = decoder_.get();
|
| }
|
|
|
| void PerformTest() override {
|
| @@ -704,6 +735,8 @@ TEST_F(EndToEndTest, DISABLED_ReceivedFecPacketsNotNacked) {
|
| kFirstPacket,
|
| kDropEveryOtherPacketUntilFec,
|
| kDropAllMediaPacketsUntilFec,
|
| + kDropOneMediaPacket,
|
| + kPassOneMediaPacket,
|
| kVerifyFecPacketNotInNackList,
|
| } state_;
|
|
|
| @@ -711,6 +744,8 @@ TEST_F(EndToEndTest, DISABLED_ReceivedFecPacketsNotNacked) {
|
| uint16_t fec_sequence_number_ GUARDED_BY(&crit_);
|
| bool has_last_sequence_number_;
|
| uint16_t last_sequence_number_;
|
| + std::unique_ptr<webrtc::VideoEncoder> encoder_;
|
| + std::unique_ptr<webrtc::VideoDecoder> decoder_;
|
| } test;
|
|
|
| RunBaseTest(&test);
|
|
|