1a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org/*
2a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
3a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org *
4a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org *  Use of this source code is governed by a BSD-style license
5a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org *  that can be found in the LICENSE file in the root of the source
6a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org *  tree. An additional intellectual property rights grant can be found
7a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org *  in the file PATENTS.  All contributing project authors may
8a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org */
10a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org
11a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org#include "testing/gmock/include/gmock/gmock.h"
12a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org#include "testing/gtest/include/gtest/gtest.h"
13a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org
14a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org#include "webrtc/common_types.h"
157e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org#include "webrtc/modules/pacing/include/mock/mock_paced_sender.h"
167e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org#include "webrtc/modules/rtp_rtcp/interface/rtp_header_parser.h"
17a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org#include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp_defines.h"
1874257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org#include "webrtc/modules/rtp_rtcp/source/rtcp_packet.h"
19a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org#include "webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.h"
207e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org#include "webrtc/system_wrappers/interface/scoped_vector.h"
217e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org
227e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.orgusing ::testing::_;
237e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.orgusing ::testing::NiceMock;
247e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.orgusing ::testing::Return;
257e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.orgusing ::testing::SaveArg;
26a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org
27a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.orgnamespace webrtc {
28a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.orgnamespace {
2901d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.orgconst uint32_t kSenderSsrc = 0x12345;
3001d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.orgconst uint32_t kReceiverSsrc = 0x23456;
317e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.orgconst uint32_t kSenderRtxSsrc = 0x32345;
3201d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.orgconst uint32_t kOneWayNetworkDelayMs = 100;
3374257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.orgconst uint8_t kBaseLayerTid = 0;
3474257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.orgconst uint8_t kHigherLayerTid = 1;
3574257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.orgconst uint16_t kSequenceNumber = 100;
36a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org
37c4af4cf7814bb773d838aefa476c196e5f1bc360asapersson@webrtc.orgclass RtcpRttStatsTestImpl : public RtcpRttStats {
3872cc32a68bcb9b2aa32f751dc6d120716d220a10asapersson@webrtc.org public:
3972cc32a68bcb9b2aa32f751dc6d120716d220a10asapersson@webrtc.org  RtcpRttStatsTestImpl() : rtt_ms_(0) {}
4072cc32a68bcb9b2aa32f751dc6d120716d220a10asapersson@webrtc.org  virtual ~RtcpRttStatsTestImpl() {}
4172cc32a68bcb9b2aa32f751dc6d120716d220a10asapersson@webrtc.org
4272cc32a68bcb9b2aa32f751dc6d120716d220a10asapersson@webrtc.org  virtual void OnRttUpdate(uint32_t rtt_ms) {
4372cc32a68bcb9b2aa32f751dc6d120716d220a10asapersson@webrtc.org    rtt_ms_ = rtt_ms;
4472cc32a68bcb9b2aa32f751dc6d120716d220a10asapersson@webrtc.org  }
45c4af4cf7814bb773d838aefa476c196e5f1bc360asapersson@webrtc.org  virtual uint32_t LastProcessedRtt() const {
46c4af4cf7814bb773d838aefa476c196e5f1bc360asapersson@webrtc.org    return rtt_ms_;
47c4af4cf7814bb773d838aefa476c196e5f1bc360asapersson@webrtc.org  }
4872cc32a68bcb9b2aa32f751dc6d120716d220a10asapersson@webrtc.org  uint32_t rtt_ms_;
4972cc32a68bcb9b2aa32f751dc6d120716d220a10asapersson@webrtc.org};
5072cc32a68bcb9b2aa32f751dc6d120716d220a10asapersson@webrtc.org
51a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.orgclass SendTransport : public Transport,
52a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org                      public NullRtpData {
53a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org public:
5474257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org  SendTransport()
5574257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org      : receiver_(NULL),
5674257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org        clock_(NULL),
5774257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org        delay_ms_(0),
5874257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org        rtp_packets_sent_(0) {
5974257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org  }
60a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org
6101d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org  void SetRtpRtcpModule(ModuleRtpRtcpImpl* receiver) {
6201d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org    receiver_ = receiver;
63a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org  }
6401d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org  void SimulateNetworkDelay(uint32_t delay_ms, SimulatedClock* clock) {
65a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org    clock_ = clock;
66a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org    delay_ms_ = delay_ms;
67a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org  }
6874257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org  virtual int SendPacket(int /*ch*/, const void* data, int len) {
6974257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org    RTPHeader header;
7074257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org    scoped_ptr<RtpHeaderParser> parser(RtpHeaderParser::Create());
7174257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org    EXPECT_TRUE(parser->Parse(static_cast<const uint8_t*>(data),
7274257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org                              static_cast<size_t>(len),
7374257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org                              &header));
7474257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org    ++rtp_packets_sent_;
7574257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org    last_rtp_header_ = header;
7674257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org    return len;
77a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org  }
78a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org  virtual int SendRTCPPacket(int /*ch*/, const void *data, int len) {
79a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org    if (clock_) {
80a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org      clock_->AdvanceTimeMilliseconds(delay_ms_);
81a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org    }
8201d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org    EXPECT_TRUE(receiver_ != NULL);
8301d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org    EXPECT_EQ(0, receiver_->IncomingRtcpPacket(
84a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org        static_cast<const uint8_t*>(data), len));
85a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org    return len;
86a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org  }
8701d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org  ModuleRtpRtcpImpl* receiver_;
88a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org  SimulatedClock* clock_;
8901d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org  uint32_t delay_ms_;
9074257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org  int rtp_packets_sent_;
9174257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org  RTPHeader last_rtp_header_;
9201d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org};
9301d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org
9401d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.orgclass RtpRtcpModule {
9501d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org public:
9601d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org  RtpRtcpModule(SimulatedClock* clock)
9701d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org      : receive_statistics_(ReceiveStatistics::Create(clock)) {
9801d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org    RtpRtcp::Configuration config;
9901d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org    config.audio = false;
10001d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org    config.clock = clock;
10101d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org    config.outgoing_transport = &transport_;
10201d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org    config.receive_statistics = receive_statistics_.get();
10301d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org    config.rtt_stats = &rtt_stats_;
10401d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org
10501d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org    impl_.reset(new ModuleRtpRtcpImpl(config));
10601d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org    EXPECT_EQ(0, impl_->SetRTCPStatus(kRtcpCompound));
10701d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org
10801d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org    transport_.SimulateNetworkDelay(kOneWayNetworkDelayMs, clock);
10901d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org  }
1104a1556017653ef7702585897b071872e83bd95b9asapersson@webrtc.org
1114a1556017653ef7702585897b071872e83bd95b9asapersson@webrtc.org  RtcpPacketTypeCounter packets_sent_;
1124a1556017653ef7702585897b071872e83bd95b9asapersson@webrtc.org  RtcpPacketTypeCounter packets_received_;
11301d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org  scoped_ptr<ReceiveStatistics> receive_statistics_;
11401d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org  SendTransport transport_;
11501d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org  RtcpRttStatsTestImpl rtt_stats_;
11601d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org  scoped_ptr<ModuleRtpRtcpImpl> impl_;
1174a1556017653ef7702585897b071872e83bd95b9asapersson@webrtc.org
1184a1556017653ef7702585897b071872e83bd95b9asapersson@webrtc.org  RtcpPacketTypeCounter RtcpSent() {
1194a1556017653ef7702585897b071872e83bd95b9asapersson@webrtc.org    impl_->GetRtcpPacketTypeCounters(&packets_sent_, &packets_received_);
1204a1556017653ef7702585897b071872e83bd95b9asapersson@webrtc.org    return packets_sent_;
1214a1556017653ef7702585897b071872e83bd95b9asapersson@webrtc.org  }
1224a1556017653ef7702585897b071872e83bd95b9asapersson@webrtc.org  RtcpPacketTypeCounter RtcpReceived() {
1234a1556017653ef7702585897b071872e83bd95b9asapersson@webrtc.org    impl_->GetRtcpPacketTypeCounters(&packets_sent_, &packets_received_);
1244a1556017653ef7702585897b071872e83bd95b9asapersson@webrtc.org    return packets_received_;
1254a1556017653ef7702585897b071872e83bd95b9asapersson@webrtc.org  }
12674257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org  int RtpSent() {
12774257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org    return transport_.rtp_packets_sent_;
12874257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org  }
12974257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org  uint16_t LastRtpSequenceNumber() {
13074257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org    return transport_.last_rtp_header_.sequenceNumber;
13174257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org  }
132a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org};
133a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org}  // namespace
134a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org
135a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.orgclass RtpRtcpImplTest : public ::testing::Test {
136a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org protected:
137a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org  RtpRtcpImplTest()
138a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org      : clock_(1335900000),
13901d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org        sender_(&clock_),
14001d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org        receiver_(&clock_) {
14101d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org    // Send module.
14201d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org    EXPECT_EQ(0, sender_.impl_->SetSendingStatus(true));
14374257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org    EXPECT_EQ(0, sender_.impl_->SetSendingMediaStatus(true));
144903e746cc9a73da17bfa3f6110293582fa6ee3bestefan@webrtc.org    sender_.impl_->SetSSRC(kSenderSsrc);
14501d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org    sender_.impl_->SetRemoteSSRC(kReceiverSsrc);
14674257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org    sender_.impl_->SetSequenceNumber(kSequenceNumber);
14774257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org    sender_.impl_->SetStorePacketsStatus(true, 100);
14874257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org
14974257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org    memset(&codec_, 0, sizeof(VideoCodec));
15074257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org    codec_.plType = 100;
15174257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org    strncpy(codec_.plName, "VP8", 3);
15274257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org    codec_.width = 320;
15374257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org    codec_.height = 180;
15474257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org    EXPECT_EQ(0, sender_.impl_->RegisterSendPayload(codec_));
15574257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org
15601d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org    // Receive module.
15701d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org    EXPECT_EQ(0, receiver_.impl_->SetSendingStatus(false));
15874257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org    EXPECT_EQ(0, receiver_.impl_->SetSendingMediaStatus(false));
159903e746cc9a73da17bfa3f6110293582fa6ee3bestefan@webrtc.org    receiver_.impl_->SetSSRC(kReceiverSsrc);
16001d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org    receiver_.impl_->SetRemoteSSRC(kSenderSsrc);
16101d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org    // Transport settings.
16201d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org    sender_.transport_.SetRtpRtcpModule(receiver_.impl_.get());
16301d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org    receiver_.transport_.SetRtpRtcpModule(sender_.impl_.get());
164a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org  }
165a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org  SimulatedClock clock_;
16601d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org  RtpRtcpModule sender_;
16701d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org  RtpRtcpModule receiver_;
16874257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org  VideoCodec codec_;
16974257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org
17074257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org  void SendFrame(const RtpRtcpModule* module, uint8_t tid) {
17174257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org    RTPVideoHeaderVP8 vp8_header = {};
17274257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org    vp8_header.temporalIdx = tid;
17374257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org    RTPVideoHeader rtp_video_header = {
17474257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org        codec_.width, codec_.height, true, 0, kRtpVideoVp8, {vp8_header}};
17574257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org
17674257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org    const uint8_t payload[100] = {0};
17774257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org    EXPECT_EQ(0, module->impl_->SendOutgoingData(kVideoFrameKey,
17874257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org                                                 codec_.plType,
17974257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org                                                 0,
18074257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org                                                 0,
18174257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org                                                 payload,
18274257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org                                                 sizeof(payload),
18374257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org                                                 NULL,
18474257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org                                                 &rtp_video_header));
18574257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org  }
18674257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org
18774257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org  void IncomingRtcpNack(const RtpRtcpModule* module, uint16_t sequence_number) {
18874257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org    rtcp::Nack nack;
18974257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org    uint16_t list[1];
19074257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org    list[0] = sequence_number;
19174257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org    const uint16_t kListLength = sizeof(list) / sizeof(list[0]);
19274257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org    nack.From(kReceiverSsrc);
19374257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org    nack.To(kSenderSsrc);
19474257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org    nack.WithList(list, kListLength);
19574257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org    rtcp::RawPacket packet = nack.Build();
19674257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org    EXPECT_EQ(0, module->impl_->IncomingRtcpPacket(packet.buffer(),
19774257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org                                                   packet.buffer_length()));
19874257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org  }
199a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org};
200a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org
20174257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.orgTEST_F(RtpRtcpImplTest, SetSelectiveRetransmissions_BaseLayer) {
20274257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org  sender_.impl_->SetSelectiveRetransmissions(kRetransmitBaseLayer);
20374257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org  EXPECT_EQ(kRetransmitBaseLayer, sender_.impl_->SelectiveRetransmissions());
20474257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org
20574257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org  // Send frames.
20674257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org  EXPECT_EQ(0, sender_.RtpSent());
20774257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org  SendFrame(&sender_, kBaseLayerTid);    // kSequenceNumber
20874257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org  SendFrame(&sender_, kHigherLayerTid);  // kSequenceNumber + 1
20974257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org  SendFrame(&sender_, kNoTemporalIdx);   // kSequenceNumber + 2
21074257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org  EXPECT_EQ(3, sender_.RtpSent());
21174257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org  EXPECT_EQ(kSequenceNumber + 2, sender_.LastRtpSequenceNumber());
21274257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org
21374257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org  // Frame with kBaseLayerTid re-sent.
21474257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org  IncomingRtcpNack(&sender_, kSequenceNumber);
21574257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org  EXPECT_EQ(4, sender_.RtpSent());
21674257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org  EXPECT_EQ(kSequenceNumber, sender_.LastRtpSequenceNumber());
21774257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org  // Frame with kHigherLayerTid not re-sent.
21874257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org  IncomingRtcpNack(&sender_, kSequenceNumber + 1);
21974257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org  EXPECT_EQ(4, sender_.RtpSent());
22074257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org  // Frame with kNoTemporalIdx re-sent.
22174257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org  IncomingRtcpNack(&sender_, kSequenceNumber + 2);
22274257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org  EXPECT_EQ(5, sender_.RtpSent());
22374257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org  EXPECT_EQ(kSequenceNumber + 2, sender_.LastRtpSequenceNumber());
22474257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org}
22574257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org
22674257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.orgTEST_F(RtpRtcpImplTest, SetSelectiveRetransmissions_HigherLayers) {
22774257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org  const uint8_t kSetting = kRetransmitBaseLayer + kRetransmitHigherLayers;
22874257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org  sender_.impl_->SetSelectiveRetransmissions(kSetting);
22974257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org  EXPECT_EQ(kSetting, sender_.impl_->SelectiveRetransmissions());
23074257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org
23174257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org  // Send frames.
23274257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org  EXPECT_EQ(0, sender_.RtpSent());
23374257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org  SendFrame(&sender_, kBaseLayerTid);    // kSequenceNumber
23474257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org  SendFrame(&sender_, kHigherLayerTid);  // kSequenceNumber + 1
23574257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org  SendFrame(&sender_, kNoTemporalIdx);   // kSequenceNumber + 2
23674257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org  EXPECT_EQ(3, sender_.RtpSent());
23774257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org  EXPECT_EQ(kSequenceNumber + 2, sender_.LastRtpSequenceNumber());
23874257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org
23974257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org  // Frame with kBaseLayerTid re-sent.
24074257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org  IncomingRtcpNack(&sender_, kSequenceNumber);
24174257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org  EXPECT_EQ(4, sender_.RtpSent());
24274257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org  EXPECT_EQ(kSequenceNumber, sender_.LastRtpSequenceNumber());
24374257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org  // Frame with kHigherLayerTid re-sent.
24474257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org  IncomingRtcpNack(&sender_, kSequenceNumber + 1);
24574257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org  EXPECT_EQ(5, sender_.RtpSent());
24674257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org  EXPECT_EQ(kSequenceNumber + 1, sender_.LastRtpSequenceNumber());
24774257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org  // Frame with kNoTemporalIdx re-sent.
24874257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org  IncomingRtcpNack(&sender_, kSequenceNumber + 2);
24974257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org  EXPECT_EQ(6, sender_.RtpSent());
25074257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org  EXPECT_EQ(kSequenceNumber + 2, sender_.LastRtpSequenceNumber());
25174257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org}
25274257108b4a17f3aeff1756b1f5bf45f971b6caeasapersson@webrtc.org
253a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.orgTEST_F(RtpRtcpImplTest, Rtt) {
254fec6b6e5999edec8c90efae54357f1aae6a4c7ddsolenberg@webrtc.org  RTPHeader header;
255a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org  header.timestamp = 1;
256a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org  header.sequenceNumber = 123;
25701d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org  header.ssrc = kSenderSsrc;
258a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org  header.headerLength = 12;
25901d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org  receiver_.receive_statistics_->IncomingPacket(header, 100, false);
260a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org
26101d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org  // Sender module should send a SR.
26201d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org  EXPECT_EQ(0, sender_.impl_->SendRTCP(kRtcpReport));
263a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org
26401d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org  // Receiver module should send a RR with a response to the last received SR.
265a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org  clock_.AdvanceTimeMilliseconds(1000);
26601d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org  EXPECT_EQ(0, receiver_.impl_->SendRTCP(kRtcpReport));
267a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org
268a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org  // Verify RTT.
269a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org  uint16_t rtt;
270a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org  uint16_t avg_rtt;
271a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org  uint16_t min_rtt;
272a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org  uint16_t max_rtt;
27301d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org  EXPECT_EQ(0,
27401d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org      sender_.impl_->RTT(kReceiverSsrc, &rtt, &avg_rtt, &min_rtt, &max_rtt));
27501d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org  EXPECT_EQ(2 * kOneWayNetworkDelayMs, rtt);
27601d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org  EXPECT_EQ(2 * kOneWayNetworkDelayMs, avg_rtt);
27701d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org  EXPECT_EQ(2 * kOneWayNetworkDelayMs, min_rtt);
27801d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org  EXPECT_EQ(2 * kOneWayNetworkDelayMs, max_rtt);
279a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org
280a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org  // No RTT from other ssrc.
281a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org  EXPECT_EQ(-1,
28201d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org      sender_.impl_->RTT(kReceiverSsrc+1, &rtt, &avg_rtt, &min_rtt, &max_rtt));
2835041831648212bfd5b68e91e1ff39e2b420f679easapersson@webrtc.org
2845041831648212bfd5b68e91e1ff39e2b420f679easapersson@webrtc.org  // Verify RTT from rtt_stats config.
28501d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org  EXPECT_EQ(0U, sender_.rtt_stats_.LastProcessedRtt());
28601d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org  EXPECT_EQ(0U, sender_.impl_->rtt_ms());
28701d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org  sender_.impl_->Process();
28801d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org  EXPECT_EQ(2 * kOneWayNetworkDelayMs, sender_.rtt_stats_.LastProcessedRtt());
28901d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org  EXPECT_EQ(2 * kOneWayNetworkDelayMs, sender_.impl_->rtt_ms());
290a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org}
291a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org
2923dc7ff30185a2d7a597acb69183fca73bd1004d8asapersson@webrtc.orgTEST_F(RtpRtcpImplTest, SetRtcpXrRrtrStatus) {
29301d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org  EXPECT_FALSE(receiver_.impl_->RtcpXrRrtrStatus());
29401d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org  receiver_.impl_->SetRtcpXrRrtrStatus(true);
29501d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org  EXPECT_TRUE(receiver_.impl_->RtcpXrRrtrStatus());
2963dc7ff30185a2d7a597acb69183fca73bd1004d8asapersson@webrtc.org}
2973dc7ff30185a2d7a597acb69183fca73bd1004d8asapersson@webrtc.org
29872cc32a68bcb9b2aa32f751dc6d120716d220a10asapersson@webrtc.orgTEST_F(RtpRtcpImplTest, RttForReceiverOnly) {
29901d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org  receiver_.impl_->SetRtcpXrRrtrStatus(true);
30072cc32a68bcb9b2aa32f751dc6d120716d220a10asapersson@webrtc.org
30101d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org  // Receiver module should send a Receiver time reference report (RTRR).
30201d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org  EXPECT_EQ(0, receiver_.impl_->SendRTCP(kRtcpReport));
30372cc32a68bcb9b2aa32f751dc6d120716d220a10asapersson@webrtc.org
30401d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org  // Sender module should send a response to the last received RTRR (DLRR).
30572cc32a68bcb9b2aa32f751dc6d120716d220a10asapersson@webrtc.org  clock_.AdvanceTimeMilliseconds(1000);
30601d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org  EXPECT_EQ(0, sender_.impl_->SendRTCP(kRtcpReport));
30772cc32a68bcb9b2aa32f751dc6d120716d220a10asapersson@webrtc.org
30872cc32a68bcb9b2aa32f751dc6d120716d220a10asapersson@webrtc.org  // Verify RTT.
30901d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org  EXPECT_EQ(0U, receiver_.rtt_stats_.LastProcessedRtt());
31001d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org  EXPECT_EQ(0U, receiver_.impl_->rtt_ms());
31101d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org  receiver_.impl_->Process();
31201d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org  EXPECT_EQ(2 * kOneWayNetworkDelayMs, receiver_.rtt_stats_.LastProcessedRtt());
31301d06c859328f3fb8c8521eede87063b05583208asapersson@webrtc.org  EXPECT_EQ(2 * kOneWayNetworkDelayMs, receiver_.impl_->rtt_ms());
31472cc32a68bcb9b2aa32f751dc6d120716d220a10asapersson@webrtc.org}
3154a1556017653ef7702585897b071872e83bd95b9asapersson@webrtc.org
3164a1556017653ef7702585897b071872e83bd95b9asapersson@webrtc.orgTEST_F(RtpRtcpImplTest, RtcpPacketTypeCounter_Nack) {
3174a1556017653ef7702585897b071872e83bd95b9asapersson@webrtc.org  EXPECT_EQ(0U, sender_.RtcpReceived().nack_packets);
3184a1556017653ef7702585897b071872e83bd95b9asapersson@webrtc.org  EXPECT_EQ(0U, receiver_.RtcpSent().nack_packets);
3194a1556017653ef7702585897b071872e83bd95b9asapersson@webrtc.org  // Receive module sends a NACK.
3204a1556017653ef7702585897b071872e83bd95b9asapersson@webrtc.org  const uint16_t kNackLength = 1;
3214a1556017653ef7702585897b071872e83bd95b9asapersson@webrtc.org  uint16_t nack_list[kNackLength] = {123};
3224a1556017653ef7702585897b071872e83bd95b9asapersson@webrtc.org  EXPECT_EQ(0, receiver_.impl_->SendNACK(nack_list, kNackLength));
3234a1556017653ef7702585897b071872e83bd95b9asapersson@webrtc.org  EXPECT_EQ(1U, receiver_.RtcpSent().nack_packets);
3244a1556017653ef7702585897b071872e83bd95b9asapersson@webrtc.org
3254a1556017653ef7702585897b071872e83bd95b9asapersson@webrtc.org  // Send module receives the NACK.
3264a1556017653ef7702585897b071872e83bd95b9asapersson@webrtc.org  EXPECT_EQ(1U, sender_.RtcpReceived().nack_packets);
3274a1556017653ef7702585897b071872e83bd95b9asapersson@webrtc.org}
3284a1556017653ef7702585897b071872e83bd95b9asapersson@webrtc.org
3294a1556017653ef7702585897b071872e83bd95b9asapersson@webrtc.orgTEST_F(RtpRtcpImplTest, RtcpPacketTypeCounter_FirAndPli) {
3304a1556017653ef7702585897b071872e83bd95b9asapersson@webrtc.org  EXPECT_EQ(0U, sender_.RtcpReceived().fir_packets);
3314a1556017653ef7702585897b071872e83bd95b9asapersson@webrtc.org  EXPECT_EQ(0U, receiver_.RtcpSent().fir_packets);
3324a1556017653ef7702585897b071872e83bd95b9asapersson@webrtc.org  // Receive module sends a FIR.
3334a1556017653ef7702585897b071872e83bd95b9asapersson@webrtc.org  EXPECT_EQ(0, receiver_.impl_->SendRTCP(kRtcpFir));
3344a1556017653ef7702585897b071872e83bd95b9asapersson@webrtc.org  EXPECT_EQ(1U, receiver_.RtcpSent().fir_packets);
3354a1556017653ef7702585897b071872e83bd95b9asapersson@webrtc.org  // Send module receives the FIR.
3364a1556017653ef7702585897b071872e83bd95b9asapersson@webrtc.org  EXPECT_EQ(1U, sender_.RtcpReceived().fir_packets);
3374a1556017653ef7702585897b071872e83bd95b9asapersson@webrtc.org
3384a1556017653ef7702585897b071872e83bd95b9asapersson@webrtc.org  // Receive module sends a FIR and PLI.
3394a1556017653ef7702585897b071872e83bd95b9asapersson@webrtc.org  EXPECT_EQ(0, receiver_.impl_->SendRTCP(kRtcpFir | kRtcpPli));
3404a1556017653ef7702585897b071872e83bd95b9asapersson@webrtc.org  EXPECT_EQ(2U, receiver_.RtcpSent().fir_packets);
3414a1556017653ef7702585897b071872e83bd95b9asapersson@webrtc.org  EXPECT_EQ(1U, receiver_.RtcpSent().pli_packets);
3424a1556017653ef7702585897b071872e83bd95b9asapersson@webrtc.org  // Send module receives the FIR and PLI.
3434a1556017653ef7702585897b071872e83bd95b9asapersson@webrtc.org  EXPECT_EQ(2U, sender_.RtcpReceived().fir_packets);
3444a1556017653ef7702585897b071872e83bd95b9asapersson@webrtc.org  EXPECT_EQ(1U, sender_.RtcpReceived().pli_packets);
3454a1556017653ef7702585897b071872e83bd95b9asapersson@webrtc.org}
3467e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org
3477e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.orgclass RtpSendingTestTransport : public Transport {
3487e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org public:
3497e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  void ResetCounters() { bytes_received_.clear(); }
3507e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org
3517e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  virtual int SendPacket(int channel, const void* data, int length) {
3527e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    RTPHeader header;
3537e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    scoped_ptr<RtpHeaderParser> parser(RtpHeaderParser::Create());
3546aae61c2c693fa3425c73c420e7046e95486b592pbos@webrtc.org    EXPECT_TRUE(parser->Parse(static_cast<const uint8_t*>(data),
3556aae61c2c693fa3425c73c420e7046e95486b592pbos@webrtc.org                              static_cast<size_t>(length),
3566aae61c2c693fa3425c73c420e7046e95486b592pbos@webrtc.org                              &header));
3577e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    bytes_received_[header.ssrc] += length;
3587e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    ++packets_received_[header.ssrc];
3597e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    return length;
3607e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  }
3617e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org
3627e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  virtual int SendRTCPPacket(int channel, const void* data, int length) {
3637e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    return length;
3647e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  }
3657e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org
3667e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  int GetPacketsReceived(uint32_t ssrc) const {
3677e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    std::map<uint32_t, int>::const_iterator it = packets_received_.find(ssrc);
3687e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    if (it == packets_received_.end())
3697e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org      return 0;
3707e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    return it->second;
3717e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  }
3727e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org
3737e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  int GetBytesReceived(uint32_t ssrc) const {
3747e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    std::map<uint32_t, int>::const_iterator it = bytes_received_.find(ssrc);
3757e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    if (it == bytes_received_.end())
3767e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org      return 0;
3777e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    return it->second;
3787e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  }
3797e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org
3807e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  int GetTotalBytesReceived() const {
3817e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    int sum = 0;
3827e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    for (std::map<uint32_t, int>::const_iterator it = bytes_received_.begin();
3837e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org         it != bytes_received_.end();
3847e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org         ++it) {
3857e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org      sum += it->second;
3867e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    }
3877e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    return sum;
3887e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  }
3897e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org
3907e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org private:
3917e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  std::map<uint32_t, int> bytes_received_;
3927e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  std::map<uint32_t, int> packets_received_;
3937e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org};
3947e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org
3957e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.orgclass RtpSendingTest : public ::testing::Test {
3967e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org protected:
3977e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  // Map from SSRC to number of received packets and bytes.
3987e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  typedef std::map<uint32_t, std::pair<int, int> > PaddingMap;
3997e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org
4007e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  RtpSendingTest() {
4017e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    // Send module.
4027e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    RtpRtcp::Configuration config;
4037e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    config.audio = false;
4047e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    config.clock = Clock::GetRealTimeClock();
4057e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    config.outgoing_transport = &transport_;
4067e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    config.receive_statistics = receive_statistics_.get();
4077e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    config.rtt_stats = &rtt_stats_;
4087e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    config.paced_sender = &pacer_;
4097e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    memset(&codec_, 0, sizeof(VideoCodec));
4107e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    codec_.plType = 100;
4117e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    strncpy(codec_.plName, "VP8", 3);
4127e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    codec_.numberOfSimulcastStreams = 3;
4137e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    codec_.simulcastStream[0].width = 320;
4147e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    codec_.simulcastStream[0].height = 180;
4157e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    codec_.simulcastStream[0].maxBitrate = 300;
4167e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    codec_.simulcastStream[1].width = 640;
4177e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    codec_.simulcastStream[1].height = 360;
4187e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    codec_.simulcastStream[1].maxBitrate = 600;
4197e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    codec_.simulcastStream[2].width = 1280;
4207e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    codec_.simulcastStream[2].height = 720;
4217e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    codec_.simulcastStream[2].maxBitrate = 1200;
4227e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    // We need numberOfSimulcastStreams + 1 RTP modules since we need one
4237e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    // default module.
4247e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    for (int i = 0; i < codec_.numberOfSimulcastStreams + 1; ++i) {
4257e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org      RtpRtcp* sender = RtpRtcp::CreateRtpRtcp(config);
4267e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org      EXPECT_EQ(0, sender->RegisterSendPayload(codec_));
4277e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org      EXPECT_EQ(0, sender->SetSendingStatus(true));
4287e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org      EXPECT_EQ(0, sender->SetSendingMediaStatus(true));
4297e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org      sender->SetSSRC(kSenderSsrc + i);
4307e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org      sender->SetRemoteSSRC(kReceiverSsrc + i);
4317e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org      senders_.push_back(sender);
4327e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org      config.default_module = senders_[0];
4337e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    }
4347e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    std::vector<uint32_t> bitrates;
4357e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    bitrates.push_back(codec_.simulcastStream[0].maxBitrate);
4367e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    bitrates.push_back(codec_.simulcastStream[1].maxBitrate);
4377e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    bitrates.push_back(codec_.simulcastStream[2].maxBitrate);
4387e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    senders_[0]->SetTargetSendBitrate(bitrates);
4397e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  }
4407e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org
4417e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  ~RtpSendingTest() {
4427e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    for (int i = senders_.size() - 1; i >= 0; --i) {
4437e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org      delete senders_[i];
4447e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    }
4457e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  }
4467e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org
4477e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  void SendFrameOnSender(int sender_index,
4487e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org                         const uint8_t* payload,
4497e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org                         size_t length) {
4507e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    RTPVideoHeader rtp_video_header = {
4517e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org        codec_.simulcastStream[sender_index].width,
4527e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org        codec_.simulcastStream[sender_index].height,
4537e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org        true,
4547e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org        0,
4557e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org        kRtpVideoVp8,
4567e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org        {}};
4577e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    uint32_t seq_num = 0;
4587e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    uint32_t ssrc = 0;
4597e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    int64_t capture_time_ms = 0;
4607e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    bool retransmission = false;
4617e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    EXPECT_CALL(pacer_, SendPacket(_, _, _, _, _, _))
4627e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org        .WillRepeatedly(DoAll(SaveArg<1>(&ssrc),
4637e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org                              SaveArg<2>(&seq_num),
4647e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org                              SaveArg<3>(&capture_time_ms),
4657e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org                              SaveArg<5>(&retransmission),
4667e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org                              Return(true)));
4677e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    EXPECT_EQ(0,
4687e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org              senders_[sender_index]->SendOutgoingData(kVideoFrameKey,
4697e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org                                                       codec_.plType,
4707e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org                                                       0,
4717e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org                                                       0,
4727e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org                                                       payload,
4737e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org                                                       length,
4747e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org                                                       NULL,
4757e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org                                                       &rtp_video_header));
4767e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    EXPECT_TRUE(senders_[sender_index]->TimeToSendPacket(
4777e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org        ssrc, seq_num, capture_time_ms, retransmission));
4787e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  }
4797e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org
4807e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  void ExpectPadding(const PaddingMap& expected_padding) {
4817e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    int expected_total_bytes = 0;
4827e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    for (PaddingMap::const_iterator it = expected_padding.begin();
4837e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org         it != expected_padding.end();
4847e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org         ++it) {
4857e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org      int packets_received = transport_.GetBytesReceived(it->first);
4867e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org      if (it->second.first > 0) {
4877e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org        EXPECT_GE(packets_received, it->second.first)
4887e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org            << "On SSRC: " << it->first;
4897e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org      }
4907e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org      int bytes_received = transport_.GetBytesReceived(it->first);
4917e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org      expected_total_bytes += bytes_received;
4927e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org      if (it->second.second > 0) {
4937e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org        EXPECT_GE(bytes_received, it->second.second)
4947e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org            << "On SSRC: " << it->first;
4957e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org      } else {
4967e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org        EXPECT_EQ(0, bytes_received) << "On SSRC: " << it->first;
4977e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org      }
4987e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    }
4997e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    EXPECT_EQ(expected_total_bytes, transport_.GetTotalBytesReceived());
5007e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  }
5017e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org
5027e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  scoped_ptr<ReceiveStatistics> receive_statistics_;
5037e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  RtcpRttStatsTestImpl rtt_stats_;
5047e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  std::vector<RtpRtcp*> senders_;
5057e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  RtpSendingTestTransport transport_;
5067e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  NiceMock<MockPacedSender> pacer_;
5077e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  VideoCodec codec_;
5087e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org};
5097e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org
5104a1b3e3a69d349b0d3e91f607f24e02d8b975688mflodman@webrtc.orgTEST_F(RtpSendingTest, DISABLED_RoundRobinPadding) {
5117e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  // We have to send on an SSRC to be allowed to pad, since a marker bit must
5127e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  // be sent prior to padding packets.
5137e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  const uint8_t payload[200] = {0};
5147e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  for (int i = 0; i < codec_.numberOfSimulcastStreams; ++i) {
5157e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    SendFrameOnSender(i + 1, payload, sizeof(payload));
5167e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  }
5177e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  transport_.ResetCounters();
5187e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  senders_[0]->TimeToSendPadding(500);
5197e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  PaddingMap expected_padding;
5207e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  expected_padding[kSenderSsrc + 1] = std::make_pair(2, 500);
5217e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  expected_padding[kSenderSsrc + 2] = std::make_pair(0, 0);
5227e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  expected_padding[kSenderSsrc + 3] = std::make_pair(0, 0);
5237e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  ExpectPadding(expected_padding);
5247e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  senders_[0]->TimeToSendPadding(1000);
5257e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  expected_padding[kSenderSsrc + 2] = std::make_pair(4, 1000);
5267e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  ExpectPadding(expected_padding);
5277e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  senders_[0]->TimeToSendPadding(1500);
5287e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  expected_padding[kSenderSsrc + 3] = std::make_pair(6, 1500);
5297e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  ExpectPadding(expected_padding);
5307e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org}
5317e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org
5324a1b3e3a69d349b0d3e91f607f24e02d8b975688mflodman@webrtc.orgTEST_F(RtpSendingTest, DISABLED_RoundRobinPaddingRtx) {
5337e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  // Enable RTX to allow padding to be sent prior to media.
5347e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  for (int i = 1; i < codec_.numberOfSimulcastStreams + 1; ++i) {
535f147639fcf3f45fdf764480834a483eb88b1cf2astefan@webrtc.org    // Abs-send-time is needed to be allowed to send padding prior to media,
536f147639fcf3f45fdf764480834a483eb88b1cf2astefan@webrtc.org    // as otherwise the timestmap used for BWE will be broken.
537f147639fcf3f45fdf764480834a483eb88b1cf2astefan@webrtc.org    senders_[i]->RegisterSendRtpHeaderExtension(kRtpExtensionAbsoluteSendTime,
538f147639fcf3f45fdf764480834a483eb88b1cf2astefan@webrtc.org                                                1);
5397e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    senders_[i]->SetRtxSendPayloadType(96);
5407e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    senders_[i]->SetRtxSsrc(kSenderRtxSsrc + i);
5417e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    senders_[i]->SetRTXSendStatus(kRtxRetransmitted);
5427e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  }
5437e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  transport_.ResetCounters();
5447e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  senders_[0]->TimeToSendPadding(500);
5457e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  PaddingMap expected_padding;
5467e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  expected_padding[kSenderSsrc + 1] = std::make_pair(0, 0);
5477e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  expected_padding[kSenderSsrc + 2] = std::make_pair(0, 0);
5487e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  expected_padding[kSenderSsrc + 3] = std::make_pair(0, 0);
5497e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  expected_padding[kSenderRtxSsrc + 1] = std::make_pair(2, 500);
5507e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  expected_padding[kSenderRtxSsrc + 2] = std::make_pair(0, 0);
5517e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  expected_padding[kSenderRtxSsrc + 3] = std::make_pair(0, 0);
5527e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  ExpectPadding(expected_padding);
5537e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  senders_[0]->TimeToSendPadding(1000);
5547e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  expected_padding[kSenderRtxSsrc + 2] = std::make_pair(4, 500);
5557e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  ExpectPadding(expected_padding);
5567e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  senders_[0]->TimeToSendPadding(1500);
5577e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org
5587e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  expected_padding[kSenderRtxSsrc + 3] = std::make_pair(6, 500);
5597e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  ExpectPadding(expected_padding);
5607e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org}
5617e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org
5624a1b3e3a69d349b0d3e91f607f24e02d8b975688mflodman@webrtc.orgTEST_F(RtpSendingTest, DISABLED_RoundRobinPaddingRtxRedundantPayloads) {
5637e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  for (int i = 1; i < codec_.numberOfSimulcastStreams + 1; ++i) {
5647e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    senders_[i]->SetRtxSendPayloadType(96);
5657e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    senders_[i]->SetRtxSsrc(kSenderRtxSsrc + i);
5667e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    senders_[i]->SetRTXSendStatus(kRtxRetransmitted | kRtxRedundantPayloads);
5677e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    senders_[i]->SetStorePacketsStatus(true, 100);
5687e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  }
5697e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  // First send payloads so that we have something to retransmit.
5707e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  const size_t kPayloadSize = 500;
5717e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  const uint8_t payload[kPayloadSize] = {0};
5727e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  for (int i = 0; i < codec_.numberOfSimulcastStreams; ++i) {
5737e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org    SendFrameOnSender(i + 1, payload, sizeof(payload));
5747e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  }
5757e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  transport_.ResetCounters();
5767e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  senders_[0]->TimeToSendPadding(500);
5777e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  PaddingMap expected_padding;
5787e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  expected_padding[kSenderSsrc + 1] = std::make_pair<int, int>(0, 0);
5797e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  expected_padding[kSenderSsrc + 2] = std::make_pair<int, int>(0, 0);
5807e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  expected_padding[kSenderSsrc + 3] = std::make_pair<int, int>(0, 0);
5817e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  expected_padding[kSenderRtxSsrc + 1] = std::make_pair<int, int>(1, 500);
5827e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  expected_padding[kSenderRtxSsrc + 2] = std::make_pair<int, int>(0, 0);
5837e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  expected_padding[kSenderRtxSsrc + 3] = std::make_pair<int, int>(0, 0);
5847e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  ExpectPadding(expected_padding);
5857e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  senders_[0]->TimeToSendPadding(1000);
5867e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  expected_padding[kSenderRtxSsrc + 2] = std::make_pair<int, int>(2, 1000);
5877e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  ExpectPadding(expected_padding);
5887e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  senders_[0]->TimeToSendPadding(1500);
5897e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  expected_padding[kSenderRtxSsrc + 3] = std::make_pair<int, int>(3, 1500);
5907e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org  ExpectPadding(expected_padding);
5917e87822cf6f75bb60c3d47cfb7d76c98b0ad6d6astefan@webrtc.org}
592a2d942a1e99a150f42f23ef2d6342c91a756dbb0asapersson@webrtc.org}  // namespace webrtc
593