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