| 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..0ef76eea28095ea34554e5ed2454653f7a32f2ba 100644
|
| --- a/webrtc/video/video_send_stream_tests.cc
|
| +++ b/webrtc/video/video_send_stream_tests.cc
|
| @@ -535,6 +535,175 @@ 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);
|
| + EXPECT_TRUE(header.extension.hasTransmissionTimeOffset);
|
| + EXPECT_TRUE(header.extension.hasTransportSequenceNumber);
|
| + }
|
| +
|
| + if (send_count_ > 100 && sent_media_ && sent_flexfec_) {
|
| + observation_complete_.Set();
|
| + }
|
| +
|
| + 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::kTimestampOffsetUri, test::kTOffsetExtensionId));
|
| + 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_;
|
| +};
|
| +
|
| +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) {
|
|
|