Chromium Code Reviews| 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 d0e99ab55df60e457ad2a75bbf09056dd2e83156..451417a45d57b9a0f258f246ce3679d6b8304754 100644 |
| --- a/webrtc/video/end_to_end_tests.cc |
| +++ b/webrtc/video/end_to_end_tests.cc |
| @@ -19,12 +19,15 @@ |
| #include "webrtc/base/checks.h" |
| #include "webrtc/base/event.h" |
| +#include "webrtc/base/optional.h" |
| +#include "webrtc/base/rate_limiter.h" |
| #include "webrtc/call.h" |
| #include "webrtc/call/transport_adapter.h" |
| #include "webrtc/common_video/include/frame_callback.h" |
| #include "webrtc/modules/include/module_common_types.h" |
| #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h" |
| #include "webrtc/modules/rtp_rtcp/source/byte_io.h" |
| +#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/nack.h" |
| #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/rapid_resync_request.h" |
| #include "webrtc/modules/rtp_rtcp/source/rtcp_utility.h" |
| #include "webrtc/modules/rtp_rtcp/source/rtp_utility.h" |
| @@ -487,6 +490,77 @@ TEST_F(EndToEndTest, ReceivesAndRetransmitsNack) { |
| RunBaseTest(&test); |
| } |
| +TEST_F(EndToEndTest, ReceivesNackAndRetransmitsAudio) { |
| + class NackObserver : public test::EndToEndTest { |
| + public: |
| + NackObserver() |
| + : EndToEndTest(kLongTimeoutMs), |
| + local_ssrc_(0), |
| + remote_ssrc_(0), |
| + receive_transport_(nullptr) {} |
| + |
| + private: |
| + size_t GetNumVideoStreams() const override { return 0; } |
| + size_t GetNumAudioStreams() const override { return 1; } |
| + |
| + test::PacketTransport* CreateReceiveTransport() override { |
| + test::PacketTransport* receive_transport = new test::PacketTransport( |
|
stefan-webrtc
2016/07/29 08:42:16
Directly assign to receive_transport_ here?
sprang_webrtc
2016/07/29 09:05:08
I'd prefer not, as that would mean that I need to
|
| + nullptr, this, test::PacketTransport::kReceiver, |
| + FakeNetworkPipe::Config()); |
| + receive_transport_ = receive_transport; |
| + return receive_transport; |
| + } |
| + |
| + Action OnSendRtp(const uint8_t* packet, size_t length) override { |
| + RTPHeader header; |
| + EXPECT_TRUE(parser_->Parse(packet, length, &header)); |
| + |
| + if (!sequence_number_to_retransmit_) { |
| + sequence_number_to_retransmit_ = |
| + rtc::Optional<uint16_t>(header.sequenceNumber); |
| + |
| + // Don't ask for retransmission straight away, may be deduped in pacer. |
| + } else if (header.sequenceNumber == *sequence_number_to_retransmit_) { |
| + observation_complete_.Set(); |
| + } else { |
| + // Send a NACK as often as necessary until retransmission is received. |
| + rtcp::Nack nack; |
| + nack.From(local_ssrc_); |
| + nack.To(remote_ssrc_); |
| + uint16_t nack_list[] = {*sequence_number_to_retransmit_}; |
| + nack.WithList(nack_list, 1); |
| + rtc::Buffer buffer = nack.Build(); |
| + |
| + EXPECT_TRUE(receive_transport_->SendRtcp(buffer.data(), buffer.size())); |
| + } |
| + |
| + return SEND_PACKET; |
| + } |
| + |
| + void ModifyAudioConfigs( |
| + AudioSendStream::Config* send_config, |
| + std::vector<AudioReceiveStream::Config>* receive_configs) override { |
| + send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs; |
| + (*receive_configs)[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs; |
| + local_ssrc_ = (*receive_configs)[0].rtp.local_ssrc; |
| + remote_ssrc_ = (*receive_configs)[0].rtp.remote_ssrc; |
| + } |
| + |
| + void PerformTest() override { |
| + EXPECT_TRUE(Wait()) |
| + << "Timed out waiting for packets to be NACKed, retransmitted and " |
| + "rendered."; |
| + } |
| + |
| + uint32_t local_ssrc_; |
| + uint32_t remote_ssrc_; |
| + Transport* receive_transport_; |
| + rtc::Optional<uint16_t> sequence_number_to_retransmit_; |
| + } test; |
| + |
| + RunBaseTest(&test); |
| +} |
| + |
| TEST_F(EndToEndTest, CanReceiveFec) { |
| class FecRenderObserver : public test::EndToEndTest, |
| public rtc::VideoSinkInterface<VideoFrame> { |
| @@ -1807,7 +1881,8 @@ TEST_F(EndToEndTest, RembWithSendSideBwe) { |
| poller_thread_(&BitrateStatsPollingThread, |
| this, |
| "BitrateStatsPollingThread"), |
| - state_(kWaitForFirstRampUp) {} |
| + state_(kWaitForFirstRampUp), |
| + retransmission_rate_limiter_(clock_, 1000) {} |
| ~BweObserver() {} |
| @@ -1847,6 +1922,7 @@ TEST_F(EndToEndTest, RembWithSendSideBwe) { |
| config.receiver_only = true; |
| config.clock = clock_; |
| config.outgoing_transport = receive_transport_; |
| + config.retransmission_rate_limiter = &retransmission_rate_limiter_; |
| rtp_rtcp_.reset(RtpRtcp::CreateRtpRtcp(config)); |
| rtp_rtcp_->SetRemoteSSRC((*receive_configs)[0].rtp.remote_ssrc); |
| rtp_rtcp_->SetSSRC((*receive_configs)[0].rtp.local_ssrc); |
| @@ -1919,6 +1995,7 @@ TEST_F(EndToEndTest, RembWithSendSideBwe) { |
| rtc::Event event_; |
| rtc::PlatformThread poller_thread_; |
| TestState state_; |
| + RateLimiter retransmission_rate_limiter_; |
| } test; |
| RunBaseTest(&test); |