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

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: 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"
22 #include "webrtc/call.h" 23 #include "webrtc/call.h"
23 #include "webrtc/call/transport_adapter.h" 24 #include "webrtc/call/transport_adapter.h"
24 #include "webrtc/common_video/include/frame_callback.h" 25 #include "webrtc/common_video/include/frame_callback.h"
25 #include "webrtc/modules/include/module_common_types.h" 26 #include "webrtc/modules/include/module_common_types.h"
26 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h" 27 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h"
27 #include "webrtc/modules/rtp_rtcp/source/byte_io.h" 28 #include "webrtc/modules/rtp_rtcp/source/byte_io.h"
29 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/nack.h"
28 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/rapid_resync_request.h" 30 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/rapid_resync_request.h"
29 #include "webrtc/modules/rtp_rtcp/source/rtcp_utility.h" 31 #include "webrtc/modules/rtp_rtcp/source/rtcp_utility.h"
30 #include "webrtc/modules/rtp_rtcp/source/rtp_utility.h" 32 #include "webrtc/modules/rtp_rtcp/source/rtp_utility.h"
31 #include "webrtc/modules/video_coding/codecs/h264/include/h264.h" 33 #include "webrtc/modules/video_coding/codecs/h264/include/h264.h"
32 #include "webrtc/modules/video_coding/codecs/vp8/include/vp8.h" 34 #include "webrtc/modules/video_coding/codecs/vp8/include/vp8.h"
33 #include "webrtc/modules/video_coding/codecs/vp9/include/vp9.h" 35 #include "webrtc/modules/video_coding/codecs/vp9/include/vp9.h"
34 #include "webrtc/modules/video_coding/include/video_coding_defines.h" 36 #include "webrtc/modules/video_coding/include/video_coding_defines.h"
35 #include "webrtc/system_wrappers/include/metrics.h" 37 #include "webrtc/system_wrappers/include/metrics.h"
36 #include "webrtc/system_wrappers/include/metrics_default.h" 38 #include "webrtc/system_wrappers/include/metrics_default.h"
37 #include "webrtc/system_wrappers/include/sleep.h" 39 #include "webrtc/system_wrappers/include/sleep.h"
38 #include "webrtc/test/call_test.h" 40 #include "webrtc/test/call_test.h"
39 #include "webrtc/test/direct_transport.h" 41 #include "webrtc/test/direct_transport.h"
40 #include "webrtc/test/encoder_settings.h" 42 #include "webrtc/test/encoder_settings.h"
41 #include "webrtc/test/fake_decoder.h" 43 #include "webrtc/test/fake_decoder.h"
42 #include "webrtc/test/fake_encoder.h" 44 #include "webrtc/test/fake_encoder.h"
43 #include "webrtc/test/frame_generator.h" 45 #include "webrtc/test/frame_generator.h"
44 #include "webrtc/test/frame_generator_capturer.h" 46 #include "webrtc/test/frame_generator_capturer.h"
45 #include "webrtc/test/null_transport.h" 47 #include "webrtc/test/null_transport.h"
46 #include "webrtc/test/rtcp_packet_parser.h" 48 #include "webrtc/test/rtcp_packet_parser.h"
47 #include "webrtc/test/rtp_rtcp_observer.h" 49 #include "webrtc/test/rtp_rtcp_observer.h"
48 #include "webrtc/test/testsupport/fileutils.h" 50 #include "webrtc/test/testsupport/fileutils.h"
49 #include "webrtc/test/testsupport/perf_test.h" 51 #include "webrtc/test/testsupport/perf_test.h"
50 #include "webrtc/video_encoder.h" 52 #include "webrtc/video_encoder.h"
53 #include "webrtc/voice_engine/channel_proxy.h"
51 54
52 namespace webrtc { 55 namespace webrtc {
53 56
54 static const int kSilenceTimeoutMs = 2000; 57 static const int kSilenceTimeoutMs = 2000;
55 58
56 class EndToEndTest : public test::CallTest { 59 class EndToEndTest : public test::CallTest {
57 public: 60 public:
58 EndToEndTest() {} 61 EndToEndTest() {}
59 62
60 virtual ~EndToEndTest() { 63 virtual ~EndToEndTest() {
(...skipping 419 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) {
stefan-webrtc 2016/07/28 07:27:38 Is there any chance we could merge this test with
sprang_webrtc 2016/07/28 13:00:58 The big difference here is that for video, we drop
stefan-webrtc 2016/07/28 15:06:15 Acknowledged.
494 class NackObserver : public test::EndToEndTest {
495 public:
496 explicit NackObserver(std::unique_ptr<voe::ChannelProxy>* send_channel)
497 : EndToEndTest(kLongTimeoutMs),
498 local_ssrc_(0),
499 remote_ssrc_(0),
500 send_stream_(nullptr),
501 send_channel_(send_channel) {}
502
503 private:
504 void OnAudioStreamsCreated(
505 AudioSendStream* send_stream,
506 const std::vector<AudioReceiveStream*>& receive_streams) override {
507 send_stream_ = send_stream;
508 }
509
510 size_t GetNumVideoStreams() const override { return 0; }
511 size_t GetNumAudioStreams() const override { return 1; }
512
513 Action OnSendRtp(const uint8_t* packet, size_t length) override {
514 RTPHeader header;
515 EXPECT_TRUE(parser_->Parse(packet, length, &header));
516
517 if (!sequence_number_to_retransmit_) {
518 sequence_number_to_retransmit_ =
519 rtc::Optional<uint16_t>(header.sequenceNumber);
520
521 // Don't ask for retransmission straight away, may be deduped in pacer.
522 } else if (header.sequenceNumber == *sequence_number_to_retransmit_) {
523 observation_complete_.Set();
524 } else {
525 // Send a NACK as often as necessary until retransmission is received.
526 rtcp::Nack nack;
527 nack.From(local_ssrc_);
528 nack.To(remote_ssrc_);
529 uint16_t nack_list[] = {*sequence_number_to_retransmit_};
530 nack.WithList(nack_list, 1);
531 rtc::Buffer buffer = nack.Build();
532
533 EXPECT_TRUE(
534 (*send_channel_)->ReceivedRTCPPacket(buffer.data(), buffer.size()));
stefan-webrtc 2016/07/28 07:27:38 Why can't we insert the rtcp packet the regular wa
sprang_webrtc 2016/07/28 13:00:58 Yep. I had totally missed the Call::Receiver() met
535 }
536
537 return SEND_PACKET;
538 }
539
540 void ModifyAudioConfigs(
541 AudioSendStream::Config* send_config,
542 std::vector<AudioReceiveStream::Config>* receive_configs) override {
543 send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
544 (*receive_configs)[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
545 local_ssrc_ = (*receive_configs)[0].rtp.local_ssrc;
546 remote_ssrc_ = (*receive_configs)[0].rtp.remote_ssrc;
547 }
548
549 void PerformTest() override {
550 EXPECT_TRUE(Wait())
551 << "Timed out waiting for packets to be NACKed, retransmitted and "
552 "rendered.";
553 }
554
555 uint32_t local_ssrc_;
556 uint32_t remote_ssrc_;
557 AudioSendStream* send_stream_;
558 rtc::Optional<uint16_t> sequence_number_to_retransmit_;
559 std::unique_ptr<voe::ChannelProxy>* send_channel_;
560 } test(&audio_send_channel_proxy_);
561
562 RunBaseTest(&test);
563 }
564
490 TEST_F(EndToEndTest, CanReceiveFec) { 565 TEST_F(EndToEndTest, CanReceiveFec) {
491 class FecRenderObserver : public test::EndToEndTest, 566 class FecRenderObserver : public test::EndToEndTest,
492 public rtc::VideoSinkInterface<VideoFrame> { 567 public rtc::VideoSinkInterface<VideoFrame> {
493 public: 568 public:
494 FecRenderObserver() 569 FecRenderObserver()
495 : EndToEndTest(kDefaultTimeoutMs), state_(kFirstPacket) {} 570 : EndToEndTest(kDefaultTimeoutMs), state_(kFirstPacket) {}
496 571
497 private: 572 private:
498 Action OnSendRtp(const uint8_t* packet, size_t length) override { 573 Action OnSendRtp(const uint8_t* packet, size_t length) override {
499 rtc::CritScope lock(&crit_); 574 rtc::CritScope lock(&crit_);
(...skipping 3145 matching lines...) Expand 10 before | Expand all | Expand 10 after
3645 private: 3720 private:
3646 bool video_observed_; 3721 bool video_observed_;
3647 bool audio_observed_; 3722 bool audio_observed_;
3648 SequenceNumberUnwrapper unwrapper_; 3723 SequenceNumberUnwrapper unwrapper_;
3649 std::set<int64_t> received_packet_ids_; 3724 std::set<int64_t> received_packet_ids_;
3650 } test; 3725 } test;
3651 3726
3652 RunBaseTest(&test); 3727 RunBaseTest(&test);
3653 } 3728 }
3654 } // namespace webrtc 3729 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698