Chromium Code Reviews| Index: webrtc/video/video_send_stream_tests.cc |
| diff --git a/webrtc/video/video_send_stream_tests.cc b/webrtc/video/video_send_stream_tests.cc |
| index f6112f9ed9ffeba2043a2c9cd1670323f63317b4..036bff5582163902963a811f16e736aa384a44f4 100644 |
| --- a/webrtc/video/video_send_stream_tests.cc |
| +++ b/webrtc/video/video_send_stream_tests.cc |
| @@ -535,6 +535,188 @@ TEST_F(VideoSendStreamTest, DoesUtilizeUlpfecForVp9WithNackEnabled) { |
| } |
| #endif // !defined(RTC_DISABLE_VP9) |
| +// TODO(brandtr): Move these FlexFEC tests when we have created |
| +// FlexfecSendStream. |
| +class FlexfecObserver : public test::EndToEndTest { |
| + public: |
| + FlexfecObserver(bool header_extensions_enabled, |
| + bool use_nack, |
| + const std::string& codec) |
| + : EndToEndTest(VideoSendStreamTest::kDefaultTimeoutMs), |
| + payload_name_(codec), |
| + use_nack_(use_nack), |
| + send_count_(0), |
| + sent_media_(false), |
| + sent_flexfec_(false), |
| + header_extensions_enabled_(header_extensions_enabled) { |
| + if (codec == "H264") { |
| + encoder_.reset(new test::FakeH264Encoder(Clock::GetRealTimeClock())); |
| + } else if (codec == "VP8") { |
| + encoder_.reset(VideoEncoder::Create(VideoEncoder::EncoderType::kVp8)); |
| + } else if (codec == "VP9") { |
| + encoder_.reset(VideoEncoder::Create(VideoEncoder::EncoderType::kVp9)); |
| + } else { |
| + RTC_NOTREACHED(); |
| + } |
| + } |
| + |
| + size_t GetNumFlexfecStreams() const override { return 1; } |
| + |
| + private: |
| + Action OnSendRtp(const uint8_t* packet, size_t length) override { |
| + RTPHeader header; |
| + EXPECT_TRUE(parser_->Parse(packet, length, &header)); |
| + |
| + ++send_count_; |
| + if (header.payloadType == VideoSendStreamTest::kFlexfecPayloadType) { |
| + EXPECT_EQ(VideoSendStreamTest::kFlexfecSendSsrc, header.ssrc); |
| + sent_flexfec_ = true; |
| + } else { |
| + EXPECT_EQ(VideoSendStreamTest::kFakeVideoSendPayloadType, |
| + header.payloadType); |
| + EXPECT_EQ(VideoSendStreamTest::kVideoSendSsrcs[0], header.ssrc); |
| + sent_media_ = true; |
| + } |
| + |
| + if (header_extensions_enabled_) { |
| + EXPECT_TRUE(header.extension.hasAbsoluteSendTime); |
| + uint32_t kHalf24BitsSpace = 0xFFFFFF / 2; |
| + if (header.extension.absoluteSendTime <= kHalf24BitsSpace && |
| + prev_header_.extension.absoluteSendTime > kHalf24BitsSpace) { |
| + // 24 bits wrap. |
| + EXPECT_GT(prev_header_.extension.absoluteSendTime, |
| + header.extension.absoluteSendTime); |
| + } else { |
| + EXPECT_GE(header.extension.absoluteSendTime, |
| + prev_header_.extension.absoluteSendTime); |
| + } |
| + EXPECT_TRUE(header.extension.hasTransportSequenceNumber); |
| + uint16_t seq_num_diff = header.extension.transportSequenceNumber - |
| + prev_header_.extension.transportSequenceNumber; |
| + EXPECT_EQ(1, seq_num_diff); |
|
stefan-webrtc
2016/11/15 12:29:53
Do you think it's necessary to verify that the ext
brandtr
2016/11/15 13:05:39
It's enough to just check that they are set. Also
|
| + } |
| + |
| + if (send_count_ > 100 && sent_media_ && sent_flexfec_) { |
| + observation_complete_.Set(); |
| + } |
| + |
| + prev_header_ = header; |
| + |
| + return SEND_PACKET; |
| + } |
| + |
| + test::PacketTransport* CreateSendTransport(Call* sender_call) override { |
| + // At low RTT (< kLowRttNackMs) -> NACK only, no FEC. |
| + // Therefore we need some network delay. |
| + const int kNetworkDelayMs = 100; |
| + FakeNetworkPipe::Config config; |
| + config.loss_percent = 50; |
| + config.queue_delay_ms = kNetworkDelayMs; |
| + return new test::PacketTransport(sender_call, this, |
| + test::PacketTransport::kSender, config); |
| + } |
| + |
| + void ModifyVideoConfigs( |
| + VideoSendStream::Config* send_config, |
| + std::vector<VideoReceiveStream::Config>* receive_configs, |
| + VideoEncoderConfig* encoder_config) override { |
| + transport_adapter_.reset( |
| + new internal::TransportAdapter(send_config->send_transport)); |
| + transport_adapter_->Enable(); |
| + if (use_nack_) { |
| + send_config->rtp.nack.rtp_history_ms = |
| + (*receive_configs)[0].rtp.nack.rtp_history_ms = |
| + VideoSendStreamTest::kNackRtpHistoryMs; |
| + } |
| + send_config->encoder_settings.encoder = encoder_.get(); |
| + send_config->encoder_settings.payload_name = payload_name_; |
| + if (header_extensions_enabled_) { |
| + send_config->rtp.extensions.push_back(RtpExtension( |
| + RtpExtension::kAbsSendTimeUri, test::kAbsSendTimeExtensionId)); |
| + send_config->rtp.extensions.push_back( |
| + RtpExtension(RtpExtension::kTransportSequenceNumberUri, |
| + test::kTransportSequenceNumberExtensionId)); |
| + } |
| + } |
| + |
| + void PerformTest() override { |
| + EXPECT_TRUE(Wait()) |
| + << "Timed out waiting for FlexFEC and/or media packets."; |
| + } |
| + |
| + std::unique_ptr<internal::TransportAdapter> transport_adapter_; |
| + std::unique_ptr<VideoEncoder> encoder_; |
| + const std::string payload_name_; |
| + const bool use_nack_; |
| + int send_count_; |
| + bool sent_media_; |
| + bool sent_flexfec_; |
| + bool header_extensions_enabled_; |
| + RTPHeader prev_header_; |
| +}; |
| + |
| +TEST_F(VideoSendStreamTest, SupportsFlexfecWithRtpExtensionsVp8) { |
| + FlexfecObserver test(true, false, "VP8"); |
| + RunBaseTest(&test); |
| +} |
| + |
| +TEST_F(VideoSendStreamTest, SupportsFlexfecWithoutRtpExtensionsVp8) { |
| + FlexfecObserver test(false, false, "VP8"); |
| + RunBaseTest(&test); |
| +} |
| + |
| +TEST_F(VideoSendStreamTest, SupportsFlexfecWithRtpExtensionsAndNackVp8) { |
| + FlexfecObserver test(true, true, "VP8"); |
| + RunBaseTest(&test); |
| +} |
| + |
| +TEST_F(VideoSendStreamTest, SupportsFlexfecWithoutRtpExtensionsAndNackVp8) { |
| + FlexfecObserver test(false, true, "VP8"); |
| + RunBaseTest(&test); |
| +} |
| + |
| +#if !defined(RTC_DISABLE_VP9) |
| +TEST_F(VideoSendStreamTest, SupportsFlexfecWithRtpExtensionsVp9) { |
| + FlexfecObserver test(true, false, "VP9"); |
| + RunBaseTest(&test); |
| +} |
| + |
| +TEST_F(VideoSendStreamTest, SupportsFlexfecWithoutRtpExtensionsVp9) { |
| + FlexfecObserver test(false, false, "VP9"); |
| + RunBaseTest(&test); |
| +} |
| + |
| +TEST_F(VideoSendStreamTest, SupportsFlexfecWithRtpExtensionsAndNackVp9) { |
| + FlexfecObserver test(true, true, "VP9"); |
| + RunBaseTest(&test); |
| +} |
| + |
| +TEST_F(VideoSendStreamTest, SupportsFlexfecWithoutRtpExtensionsAndNackVp9) { |
| + FlexfecObserver test(false, true, "VP9"); |
| + RunBaseTest(&test); |
| +} |
| +#endif // defined(RTC_DISABLE_VP9) |
| + |
| +TEST_F(VideoSendStreamTest, SupportsFlexfecWithRtpExtensionsH264) { |
| + FlexfecObserver test(true, false, "H264"); |
| + RunBaseTest(&test); |
| +} |
| + |
| +TEST_F(VideoSendStreamTest, SupportsFlexfecWithoutRtpExtensionsH264) { |
| + FlexfecObserver test(false, false, "H264"); |
| + RunBaseTest(&test); |
| +} |
| + |
| +TEST_F(VideoSendStreamTest, SupportsFlexfecWithRtpExtensionsAndNackH264) { |
| + FlexfecObserver test(true, true, "H264"); |
| + RunBaseTest(&test); |
| +} |
| + |
| +TEST_F(VideoSendStreamTest, SupportsFlexfecWithoutRtpExtensionsAndNackH264) { |
| + FlexfecObserver test(false, true, "H264"); |
| + RunBaseTest(&test); |
| +} |
| + |
| void VideoSendStreamTest::TestNackRetransmission( |
| uint32_t retransmit_ssrc, |
| uint8_t retransmit_payload_type) { |