1823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org/* 2823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. 3823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org * 4823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org * Use of this source code is governed by a BSD-style license 5823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org * that can be found in the LICENSE file in the root of the source 6823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org * tree. An additional intellectual property rights grant can be found 7823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org * in the file PATENTS. All contributing project authors may 8823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org */ 10823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org 11823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org#include "testing/gtest/include/gtest/gtest.h" 12823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org 137623ce4aeb9130c937ba5836490cbb3a35679e79Peter Boström#include "webrtc/video/report_block_stats.h" 14823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org 15823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.orgnamespace webrtc { 16823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org 17823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.orgclass ReportBlockStatsTest : public ::testing::Test { 18823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org protected: 19823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org ReportBlockStatsTest() : kSsrc1(0x12345), kSsrc2(0x23456) {} 20823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org 2114665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org void SetUp() override { 22823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org // kSsrc1: block 1-3. 23823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org block1_1_.cumulativeLost = 10; 24823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org block1_1_.fractionLost = 123; 25823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org block1_1_.extendedHighSeqNum = 24000; 26823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org block1_1_.jitter = 777; 27823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org block1_1_.sourceSSRC = kSsrc1; 28823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org block1_2_.cumulativeLost = 15; 29823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org block1_2_.fractionLost = 0; 30823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org block1_2_.extendedHighSeqNum = 24100; 31823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org block1_2_.jitter = 222; 32823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org block1_2_.sourceSSRC = kSsrc1; 33823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org block1_3_.cumulativeLost = 50; 34823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org block1_3_.fractionLost = 0; 35823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org block1_3_.extendedHighSeqNum = 24200; 36823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org block1_3_.jitter = 333; 37823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org block1_3_.sourceSSRC = kSsrc1; 38823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org // kSsrc2: block 1,2. 39823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org block2_1_.cumulativeLost = 111; 40823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org block2_1_.fractionLost = 222; 41823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org block2_1_.extendedHighSeqNum = 8500; 42823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org block2_1_.jitter = 555; 43823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org block2_1_.sourceSSRC = kSsrc2; 44823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org block2_2_.cumulativeLost = 136; 45823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org block2_2_.fractionLost = 0; 46823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org block2_2_.extendedHighSeqNum = 8800; 47823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org block2_2_.jitter = 888; 48823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org block2_2_.sourceSSRC = kSsrc2; 49823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org 50823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org ssrc1block1_.push_back(block1_1_); 51823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org ssrc1block2_.push_back(block1_2_); 52823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org ssrc12block1_.push_back(block1_1_); 53823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org ssrc12block1_.push_back(block2_1_); 54823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org ssrc12block2_.push_back(block1_2_); 55823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org ssrc12block2_.push_back(block2_2_); 56823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org } 57823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org 58823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org RtcpStatistics RtcpReportBlockToRtcpStatistics( 59823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org const RTCPReportBlock& stats) { 60823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org RtcpStatistics block; 61823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org block.cumulative_lost = stats.cumulativeLost; 62823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org block.fraction_lost = stats.fractionLost; 63823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org block.extended_max_sequence_number = stats.extendedHighSeqNum; 64823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org block.jitter = stats.jitter; 65823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org return block; 66823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org } 67823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org 68823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org const uint32_t kSsrc1; 69823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org const uint32_t kSsrc2; 70823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org RTCPReportBlock block1_1_; 71823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org RTCPReportBlock block1_2_; 72823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org RTCPReportBlock block1_3_; 73823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org RTCPReportBlock block2_1_; 74823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org RTCPReportBlock block2_2_; 75823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org std::vector<RTCPReportBlock> ssrc1block1_; 76823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org std::vector<RTCPReportBlock> ssrc1block2_; 77823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org std::vector<RTCPReportBlock> ssrc12block1_; 78823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org std::vector<RTCPReportBlock> ssrc12block2_; 79823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org}; 80823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org 81823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.orgTEST_F(ReportBlockStatsTest, AggregateAndStore_NoSsrc) { 82823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org ReportBlockStats stats; 83823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org std::vector<RTCPReportBlock> empty; 84823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org RTCPReportBlock aggregated = stats.AggregateAndStore(empty); 85823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org EXPECT_EQ(0U, aggregated.fractionLost); 86823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org EXPECT_EQ(0U, aggregated.cumulativeLost); 87823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org EXPECT_EQ(0U, aggregated.jitter); 88823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org EXPECT_EQ(0U, aggregated.extendedHighSeqNum); 89823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org} 90823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org 91823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.orgTEST_F(ReportBlockStatsTest, AggregateAndStore_OneSsrc) { 92823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org ReportBlockStats stats; 93823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org RTCPReportBlock aggregated = stats.AggregateAndStore(ssrc1block1_); 94823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org // One ssrc, no aggregation done. 95823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org EXPECT_EQ(123U, aggregated.fractionLost); 96823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org EXPECT_EQ(10U, aggregated.cumulativeLost); 97823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org EXPECT_EQ(777U, aggregated.jitter); 98823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org EXPECT_EQ(24000U, aggregated.extendedHighSeqNum); 99823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org 100823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org aggregated = stats.AggregateAndStore(ssrc1block2_); 101823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org EXPECT_EQ(0U, aggregated.fractionLost); 102823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org EXPECT_EQ(15U, aggregated.cumulativeLost); 103823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org EXPECT_EQ(222U, aggregated.jitter); 104823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org EXPECT_EQ(24100U, aggregated.extendedHighSeqNum); 105823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org 106823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org // fl: 100 * (15-10) / (24100-24000) = 5% 107823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org EXPECT_EQ(5, stats.FractionLostInPercent()); 108823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org} 109823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org 110823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.orgTEST_F(ReportBlockStatsTest, AggregateAndStore_TwoSsrcs) { 111823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org ReportBlockStats stats; 112823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org RTCPReportBlock aggregated = stats.AggregateAndStore(ssrc12block1_); 113823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org EXPECT_EQ(0U, aggregated.fractionLost); 114823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org EXPECT_EQ(10U + 111U, aggregated.cumulativeLost); 115823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org EXPECT_EQ((777U + 555U) / 2, aggregated.jitter); 116823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org EXPECT_EQ(0U, aggregated.extendedHighSeqNum); 117823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org 118823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org aggregated = stats.AggregateAndStore(ssrc12block2_); 119823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org // fl: 255 * ((15-10) + (136-111)) / ((24100-24000) + (8800-8500)) = 19 120823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org EXPECT_EQ(19U, aggregated.fractionLost); 121823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org EXPECT_EQ(15U + 136U, aggregated.cumulativeLost); 122823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org EXPECT_EQ((222U + 888U) / 2, aggregated.jitter); 123823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org EXPECT_EQ(0U, aggregated.extendedHighSeqNum); 124823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org 125823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org // fl: 100 * ((15-10) + (136-111)) / ((24100-24000) + (8800-8500)) = 7% 126823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org EXPECT_EQ(7, stats.FractionLostInPercent()); 127823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org} 128823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org 129823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.orgTEST_F(ReportBlockStatsTest, StoreAndGetFractionLost) { 130823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org const uint32_t kRemoteSsrc = 1; 131823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org ReportBlockStats stats; 132e7358eabbc9f7d0b774bbcaea35874668fc790edasapersson@webrtc.org EXPECT_EQ(-1, stats.FractionLostInPercent()); 133823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org 134e7358eabbc9f7d0b774bbcaea35874668fc790edasapersson@webrtc.org // First block. 135823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org stats.Store(RtcpReportBlockToRtcpStatistics(block1_1_), kRemoteSsrc, kSsrc1); 136e7358eabbc9f7d0b774bbcaea35874668fc790edasapersson@webrtc.org EXPECT_EQ(-1, stats.FractionLostInPercent()); 137823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org // fl: 100 * (15-10) / (24100-24000) = 5% 138823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org stats.Store(RtcpReportBlockToRtcpStatistics(block1_2_), kRemoteSsrc, kSsrc1); 139823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org EXPECT_EQ(5, stats.FractionLostInPercent()); 140823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org // fl: 100 * (50-10) / (24200-24000) = 20% 141823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org stats.Store(RtcpReportBlockToRtcpStatistics(block1_3_), kRemoteSsrc, kSsrc1); 142823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org EXPECT_EQ(20, stats.FractionLostInPercent()); 143823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org} 144823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org 145823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org} // namespace webrtc 146823c9b8e3604fcaa0db3c1d290728334d1535d82asapersson@webrtc.org 147