Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(153)

Side by Side Diff: webrtc/video/end_to_end_tests.cc

Issue 2181383002: Add NACK rate throttling for audio channels. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Fixed race in test Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 #include <algorithm> 10 #include <algorithm>
11 #include <list> 11 #include <list>
12 #include <map> 12 #include <map>
13 #include <memory> 13 #include <memory>
14 #include <sstream> 14 #include <sstream>
15 #include <string> 15 #include <string>
16 #include <vector> 16 #include <vector>
17 17
18 #include "testing/gtest/include/gtest/gtest.h" 18 #include "testing/gtest/include/gtest/gtest.h"
19 19
20 #include "webrtc/base/checks.h" 20 #include "webrtc/base/checks.h"
21 #include "webrtc/base/event.h" 21 #include "webrtc/base/event.h"
22 #include "webrtc/base/optional.h"
23 #include "webrtc/base/rate_limiter.h"
22 #include "webrtc/call.h" 24 #include "webrtc/call.h"
23 #include "webrtc/call/transport_adapter.h" 25 #include "webrtc/call/transport_adapter.h"
24 #include "webrtc/common_video/include/frame_callback.h" 26 #include "webrtc/common_video/include/frame_callback.h"
25 #include "webrtc/modules/include/module_common_types.h" 27 #include "webrtc/modules/include/module_common_types.h"
26 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h" 28 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h"
27 #include "webrtc/modules/rtp_rtcp/source/byte_io.h" 29 #include "webrtc/modules/rtp_rtcp/source/byte_io.h"
30 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/nack.h"
28 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/rapid_resync_request.h" 31 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/rapid_resync_request.h"
29 #include "webrtc/modules/rtp_rtcp/source/rtcp_utility.h" 32 #include "webrtc/modules/rtp_rtcp/source/rtcp_utility.h"
30 #include "webrtc/modules/rtp_rtcp/source/rtp_utility.h" 33 #include "webrtc/modules/rtp_rtcp/source/rtp_utility.h"
31 #include "webrtc/modules/video_coding/codecs/h264/include/h264.h" 34 #include "webrtc/modules/video_coding/codecs/h264/include/h264.h"
32 #include "webrtc/modules/video_coding/codecs/vp8/include/vp8.h" 35 #include "webrtc/modules/video_coding/codecs/vp8/include/vp8.h"
33 #include "webrtc/modules/video_coding/codecs/vp9/include/vp9.h" 36 #include "webrtc/modules/video_coding/codecs/vp9/include/vp9.h"
34 #include "webrtc/modules/video_coding/include/video_coding_defines.h" 37 #include "webrtc/modules/video_coding/include/video_coding_defines.h"
35 #include "webrtc/system_wrappers/include/metrics.h" 38 #include "webrtc/system_wrappers/include/metrics.h"
36 #include "webrtc/system_wrappers/include/metrics_default.h" 39 #include "webrtc/system_wrappers/include/metrics_default.h"
37 #include "webrtc/system_wrappers/include/sleep.h" 40 #include "webrtc/system_wrappers/include/sleep.h"
(...skipping 442 matching lines...) Expand 10 before | Expand all | Expand 10 after
480 std::set<uint16_t> dropped_packets_; 483 std::set<uint16_t> dropped_packets_;
481 std::set<uint16_t> retransmitted_packets_; 484 std::set<uint16_t> retransmitted_packets_;
482 uint64_t sent_rtp_packets_; 485 uint64_t sent_rtp_packets_;
483 int packets_left_to_drop_; 486 int packets_left_to_drop_;
484 int nacks_left_ GUARDED_BY(&crit_); 487 int nacks_left_ GUARDED_BY(&crit_);
485 } test; 488 } test;
486 489
487 RunBaseTest(&test); 490 RunBaseTest(&test);
488 } 491 }
489 492
493 TEST_F(EndToEndTest, ReceivesNackAndRetransmitsAudio) {
494 class NackObserver : public test::EndToEndTest {
495 public:
496 explicit NackObserver(
497 std::unique_ptr<test::PacketTransport>* send_transport)
498 : EndToEndTest(kLongTimeoutMs),
499 local_ssrc_(0),
500 remote_ssrc_(0),
501 send_transport_(send_transport) {}
502
503 private:
504 size_t GetNumVideoStreams() const override { return 0; }
505 size_t GetNumAudioStreams() const override { return 1; }
506
507 Action OnSendRtp(const uint8_t* packet, size_t length) override {
508 RTPHeader header;
509 EXPECT_TRUE(parser_->Parse(packet, length, &header));
510
511 if (!sequence_number_to_retransmit_) {
512 sequence_number_to_retransmit_ =
513 rtc::Optional<uint16_t>(header.sequenceNumber);
514
515 // Don't ask for retransmission straight away, may be deduped in pacer.
516 } else if (header.sequenceNumber == *sequence_number_to_retransmit_) {
517 observation_complete_.Set();
518 } else {
519 // Send a NACK as often as necessary until retransmission is received.
520 rtcp::Nack nack;
521 nack.From(local_ssrc_);
522 nack.To(remote_ssrc_);
523 uint16_t nack_list[] = {*sequence_number_to_retransmit_};
524 nack.WithList(nack_list, 1);
525 rtc::Buffer buffer = nack.Build();
526
527 Transport* transport = static_cast<Transport*>(send_transport_->get());
528 EXPECT_TRUE(transport->SendRtcp(buffer.data(), buffer.size()));
529 }
530
531 return SEND_PACKET;
532 }
533
534 void ModifyAudioConfigs(
535 AudioSendStream::Config* send_config,
536 std::vector<AudioReceiveStream::Config>* receive_configs) override {
537 send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
538 (*receive_configs)[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
539 local_ssrc_ = (*receive_configs)[0].rtp.local_ssrc;
540 remote_ssrc_ = (*receive_configs)[0].rtp.remote_ssrc;
541 }
542
543 void PerformTest() override {
544 EXPECT_TRUE(Wait())
545 << "Timed out waiting for packets to be NACKed, retransmitted and "
546 "rendered.";
547 }
548
549 uint32_t local_ssrc_;
550 uint32_t remote_ssrc_;
551 std::unique_ptr<test::PacketTransport>* const send_transport_;
stefan-webrtc 2016/07/28 15:06:15 Doesn't it make more sense to store a test::Packet
sprang_webrtc 2016/07/28 15:17:18 This is problematic, because this unique_ptr isn't
stefan-webrtc 2016/07/28 15:24:07 Ah... In that case I'd suggest creating your own t
sprang_webrtc 2016/07/29 08:00:05 Done.
552 rtc::Optional<uint16_t> sequence_number_to_retransmit_;
553 } test(&receive_transport_);
554
555 RunBaseTest(&test);
556 }
557
490 TEST_F(EndToEndTest, CanReceiveFec) { 558 TEST_F(EndToEndTest, CanReceiveFec) {
491 class FecRenderObserver : public test::EndToEndTest, 559 class FecRenderObserver : public test::EndToEndTest,
492 public rtc::VideoSinkInterface<VideoFrame> { 560 public rtc::VideoSinkInterface<VideoFrame> {
493 public: 561 public:
494 FecRenderObserver() 562 FecRenderObserver()
495 : EndToEndTest(kDefaultTimeoutMs), state_(kFirstPacket) {} 563 : EndToEndTest(kDefaultTimeoutMs), state_(kFirstPacket) {}
496 564
497 private: 565 private:
498 Action OnSendRtp(const uint8_t* packet, size_t length) override { 566 Action OnSendRtp(const uint8_t* packet, size_t length) override {
499 rtc::CritScope lock(&crit_); 567 rtc::CritScope lock(&crit_);
(...skipping 1300 matching lines...) Expand 10 before | Expand all | Expand 10 after
1800 : EndToEndTest(kDefaultTimeoutMs), 1868 : EndToEndTest(kDefaultTimeoutMs),
1801 sender_call_(nullptr), 1869 sender_call_(nullptr),
1802 clock_(Clock::GetRealTimeClock()), 1870 clock_(Clock::GetRealTimeClock()),
1803 sender_ssrc_(0), 1871 sender_ssrc_(0),
1804 remb_bitrate_bps_(1000000), 1872 remb_bitrate_bps_(1000000),
1805 receive_transport_(nullptr), 1873 receive_transport_(nullptr),
1806 event_(false, false), 1874 event_(false, false),
1807 poller_thread_(&BitrateStatsPollingThread, 1875 poller_thread_(&BitrateStatsPollingThread,
1808 this, 1876 this,
1809 "BitrateStatsPollingThread"), 1877 "BitrateStatsPollingThread"),
1810 state_(kWaitForFirstRampUp) {} 1878 state_(kWaitForFirstRampUp),
1879 retransmission_rate_limiter_(clock_, 1000) {}
stefan-webrtc 2016/07/28 15:06:15 Why is this needed in this test now?
sprang_webrtc 2016/07/28 15:17:17 Because I DCHECK in the RtpSender constructor that
stefan-webrtc 2016/07/28 15:24:07 I see, that's probably a good idea.
1811 1880
1812 ~BweObserver() {} 1881 ~BweObserver() {}
1813 1882
1814 test::PacketTransport* CreateReceiveTransport() override { 1883 test::PacketTransport* CreateReceiveTransport() override {
1815 receive_transport_ = new test::PacketTransport( 1884 receive_transport_ = new test::PacketTransport(
1816 nullptr, this, test::PacketTransport::kReceiver, 1885 nullptr, this, test::PacketTransport::kReceiver,
1817 FakeNetworkPipe::Config()); 1886 FakeNetworkPipe::Config());
1818 return receive_transport_; 1887 return receive_transport_;
1819 } 1888 }
1820 1889
(...skipping 19 matching lines...) Expand all
1840 encoder_config->streams[0].target_bitrate_bps = 2000000; 1909 encoder_config->streams[0].target_bitrate_bps = 2000000;
1841 1910
1842 ASSERT_EQ(1u, receive_configs->size()); 1911 ASSERT_EQ(1u, receive_configs->size());
1843 (*receive_configs)[0].rtp.remb = false; 1912 (*receive_configs)[0].rtp.remb = false;
1844 (*receive_configs)[0].rtp.transport_cc = true; 1913 (*receive_configs)[0].rtp.transport_cc = true;
1845 (*receive_configs)[0].rtp.extensions = send_config->rtp.extensions; 1914 (*receive_configs)[0].rtp.extensions = send_config->rtp.extensions;
1846 RtpRtcp::Configuration config; 1915 RtpRtcp::Configuration config;
1847 config.receiver_only = true; 1916 config.receiver_only = true;
1848 config.clock = clock_; 1917 config.clock = clock_;
1849 config.outgoing_transport = receive_transport_; 1918 config.outgoing_transport = receive_transport_;
1919 config.retransmission_rate_limiter = &retransmission_rate_limiter_;
1850 rtp_rtcp_.reset(RtpRtcp::CreateRtpRtcp(config)); 1920 rtp_rtcp_.reset(RtpRtcp::CreateRtpRtcp(config));
1851 rtp_rtcp_->SetRemoteSSRC((*receive_configs)[0].rtp.remote_ssrc); 1921 rtp_rtcp_->SetRemoteSSRC((*receive_configs)[0].rtp.remote_ssrc);
1852 rtp_rtcp_->SetSSRC((*receive_configs)[0].rtp.local_ssrc); 1922 rtp_rtcp_->SetSSRC((*receive_configs)[0].rtp.local_ssrc);
1853 rtp_rtcp_->SetREMBStatus(true); 1923 rtp_rtcp_->SetREMBStatus(true);
1854 rtp_rtcp_->SetSendingStatus(true); 1924 rtp_rtcp_->SetSendingStatus(true);
1855 rtp_rtcp_->SetRTCPStatus(RtcpMode::kReducedSize); 1925 rtp_rtcp_->SetRTCPStatus(RtcpMode::kReducedSize);
1856 } 1926 }
1857 1927
1858 void OnCallsCreated(Call* sender_call, Call* receiver_call) override { 1928 void OnCallsCreated(Call* sender_call, Call* receiver_call) override {
1859 sender_call_ = sender_call; 1929 sender_call_ = sender_call;
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
1912 1982
1913 Call* sender_call_; 1983 Call* sender_call_;
1914 Clock* const clock_; 1984 Clock* const clock_;
1915 uint32_t sender_ssrc_; 1985 uint32_t sender_ssrc_;
1916 int remb_bitrate_bps_; 1986 int remb_bitrate_bps_;
1917 std::unique_ptr<RtpRtcp> rtp_rtcp_; 1987 std::unique_ptr<RtpRtcp> rtp_rtcp_;
1918 test::PacketTransport* receive_transport_; 1988 test::PacketTransport* receive_transport_;
1919 rtc::Event event_; 1989 rtc::Event event_;
1920 rtc::PlatformThread poller_thread_; 1990 rtc::PlatformThread poller_thread_;
1921 TestState state_; 1991 TestState state_;
1992 RateLimiter retransmission_rate_limiter_;
1922 } test; 1993 } test;
1923 1994
1924 RunBaseTest(&test); 1995 RunBaseTest(&test);
1925 } 1996 }
1926 1997
1927 TEST_F(EndToEndTest, VerifyNackStats) { 1998 TEST_F(EndToEndTest, VerifyNackStats) {
1928 static const int kPacketNumberToDrop = 200; 1999 static const int kPacketNumberToDrop = 200;
1929 class NackObserver : public test::EndToEndTest { 2000 class NackObserver : public test::EndToEndTest {
1930 public: 2001 public:
1931 NackObserver() 2002 NackObserver()
(...skipping 1713 matching lines...) Expand 10 before | Expand all | Expand 10 after
3645 private: 3716 private:
3646 bool video_observed_; 3717 bool video_observed_;
3647 bool audio_observed_; 3718 bool audio_observed_;
3648 SequenceNumberUnwrapper unwrapper_; 3719 SequenceNumberUnwrapper unwrapper_;
3649 std::set<int64_t> received_packet_ids_; 3720 std::set<int64_t> received_packet_ids_;
3650 } test; 3721 } test;
3651 3722
3652 RunBaseTest(&test); 3723 RunBaseTest(&test);
3653 } 3724 }
3654 } // namespace webrtc 3725 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698