| 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 01267735e073a2e35677d4aef72686caa26f6cf1..00aa2a901815cb4b0be6296e55e7ade6dae09364 100644
|
| --- a/webrtc/video/video_send_stream_tests.cc
|
| +++ b/webrtc/video/video_send_stream_tests.cc
|
| @@ -308,55 +308,48 @@
|
| StatisticianMap stats_map_;
|
| };
|
|
|
| -class FecObserver : public test::EndToEndTest {
|
| +class FecObserver : public test::SendTest {
|
| public:
|
| - FecObserver(bool header_extensions_enabled,
|
| - bool use_nack,
|
| - bool expect_red,
|
| - const std::string& codec)
|
| - : EndToEndTest(VideoSendStreamTest::kDefaultTimeoutMs),
|
| - payload_name_(codec),
|
| - use_nack_(use_nack),
|
| - expect_red_(expect_red),
|
| + explicit FecObserver(bool header_extensions_enabled)
|
| + : SendTest(VideoSendStreamTest::kDefaultTimeoutMs),
|
| send_count_(0),
|
| received_media_(false),
|
| received_fec_(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();
|
| - }
|
| - }
|
| + header_extensions_enabled_(header_extensions_enabled) {}
|
|
|
| private:
|
| Action OnSendRtp(const uint8_t* packet, size_t length) override {
|
| RTPHeader header;
|
| EXPECT_TRUE(parser_->Parse(packet, length, &header));
|
|
|
| - ++send_count_;
|
| + // Send lossy receive reports to trigger FEC enabling.
|
| + if (send_count_++ % 2 != 0) {
|
| + // Receive statistics reporting having lost 50% of the packets.
|
| + FakeReceiveStatistics lossy_receive_stats(
|
| + VideoSendStreamTest::kVideoSendSsrcs[0], header.sequenceNumber,
|
| + send_count_ / 2, 127);
|
| + RTCPSender rtcp_sender(false, Clock::GetRealTimeClock(),
|
| + &lossy_receive_stats, nullptr, nullptr,
|
| + transport_adapter_.get());
|
| +
|
| + rtcp_sender.SetRTCPStatus(RtcpMode::kReducedSize);
|
| + rtcp_sender.SetRemoteSSRC(VideoSendStreamTest::kVideoSendSsrcs[0]);
|
| +
|
| + RTCPSender::FeedbackState feedback_state;
|
| +
|
| + EXPECT_EQ(0, rtcp_sender.SendRTCP(feedback_state, kRtcpRr));
|
| + }
|
| +
|
| int encapsulated_payload_type = -1;
|
| if (header.payloadType == VideoSendStreamTest::kRedPayloadType) {
|
| - EXPECT_TRUE(expect_red_);
|
| encapsulated_payload_type = static_cast<int>(packet[header.headerLength]);
|
| if (encapsulated_payload_type !=
|
| - VideoSendStreamTest::kFakeVideoSendPayloadType) {
|
| + VideoSendStreamTest::kFakeVideoSendPayloadType)
|
| EXPECT_EQ(VideoSendStreamTest::kUlpfecPayloadType,
|
| encapsulated_payload_type);
|
| - }
|
| } else {
|
| EXPECT_EQ(VideoSendStreamTest::kFakeVideoSendPayloadType,
|
| header.payloadType);
|
| - if (static_cast<size_t>(header.headerLength + header.paddingLength) <
|
| - length) {
|
| - // Not padding-only, media received outside of RED.
|
| - EXPECT_FALSE(expect_red_);
|
| - received_media_ = true;
|
| - }
|
| }
|
|
|
| if (header_extensions_enabled_) {
|
| @@ -386,25 +379,12 @@
|
| }
|
| }
|
|
|
| - if (send_count_ > 100 && received_media_) {
|
| - if (received_fec_ || !expect_red_)
|
| - observation_complete_.Set();
|
| - }
|
| + if (received_media_ && received_fec_ && send_count_ > 100)
|
| + observation_complete_.Set();
|
|
|
| prev_header_ = header;
|
|
|
| return SEND_PACKET;
|
| - }
|
| -
|
| - test::PacketTransport* CreateSendTransport(Call* sender_call) override {
|
| - // At low RTT (< kLowRttNackMs) -> NACK only, no FEC.
|
| - // Configure 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(
|
| @@ -414,17 +394,10 @@
|
| 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_;
|
| send_config->rtp.fec.red_payload_type =
|
| - VideoSendStreamTest::kRedPayloadType;
|
| + VideoSendStreamTest::kRedPayloadType;
|
| send_config->rtp.fec.ulpfec_payload_type =
|
| - VideoSendStreamTest::kUlpfecPayloadType;
|
| + VideoSendStreamTest::kUlpfecPayloadType;
|
| if (header_extensions_enabled_) {
|
| send_config->rtp.extensions.push_back(RtpExtension(
|
| RtpExtension::kAbsSendTime, test::kAbsSendTimeExtensionId));
|
| @@ -432,10 +405,6 @@
|
| RtpExtension(RtpExtension::kTransportSequenceNumber,
|
| test::kTransportSequenceNumberExtensionId));
|
| }
|
| - (*receive_configs)[0].rtp.fec.red_payload_type =
|
| - send_config->rtp.fec.red_payload_type;
|
| - (*receive_configs)[0].rtp.fec.ulpfec_payload_type =
|
| - send_config->rtp.fec.ulpfec_payload_type;
|
| }
|
|
|
| void PerformTest() override {
|
| @@ -443,10 +412,6 @@
|
| }
|
|
|
| rtc::scoped_ptr<internal::TransportAdapter> transport_adapter_;
|
| - rtc::scoped_ptr<VideoEncoder> encoder_;
|
| - const std::string payload_name_;
|
| - const bool use_nack_;
|
| - const bool expect_red_;
|
| int send_count_;
|
| bool received_media_;
|
| bool received_fec_;
|
| @@ -455,37 +420,14 @@
|
| };
|
|
|
| TEST_F(VideoSendStreamTest, SupportsFecWithExtensions) {
|
| - FecObserver test(true, false, true, "VP8");
|
| + FecObserver test(true);
|
| +
|
| RunBaseTest(&test);
|
| }
|
|
|
| TEST_F(VideoSendStreamTest, SupportsFecWithoutExtensions) {
|
| - FecObserver test(false, false, true, "VP8");
|
| - RunBaseTest(&test);
|
| -}
|
| -
|
| -// The FEC scheme used is not efficient for H264, so we should not use RED/FEC
|
| -// since we'll still have to re-request FEC packets, effectively wasting
|
| -// bandwidth since the receiver has to wait for FEC retransmissions to determine
|
| -// that the received state is actually decodable.
|
| -TEST_F(VideoSendStreamTest, DoesNotUtilizeRedForH264WithNackEnabled) {
|
| - FecObserver test(false, true, false, "H264");
|
| - RunBaseTest(&test);
|
| -}
|
| -
|
| -// Without retransmissions FEC for H264 is fine.
|
| -TEST_F(VideoSendStreamTest, DoesUtilizeRedForH264WithoutNackEnabled) {
|
| - FecObserver test(false, false, true, "H264");
|
| - RunBaseTest(&test);
|
| -}
|
| -
|
| -TEST_F(VideoSendStreamTest, DoesUtilizeRedForVp8WithNackEnabled) {
|
| - FecObserver test(false, true, true, "VP8");
|
| - RunBaseTest(&test);
|
| -}
|
| -
|
| -TEST_F(VideoSendStreamTest, DoesUtilizeRedForVp9WithNackEnabled) {
|
| - FecObserver test(false, true, true, "VP9");
|
| + FecObserver test(false);
|
| +
|
| RunBaseTest(&test);
|
| }
|
|
|
|
|