chain_diff_calculator_unittest.cc (4952B)
1 /* 2 * Copyright (c) 2020 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #include "modules/video_coding/chain_diff_calculator.h" 12 13 #include "test/gmock.h" 14 #include "test/gtest.h" 15 16 namespace webrtc { 17 namespace { 18 19 using ::testing::ElementsAre; 20 using ::testing::SizeIs; 21 22 TEST(ChainDiffCalculatorTest, SingleChain) { 23 // Simulate a stream with 2 temporal layer where chain 24 // protects temporal layer 0. 25 ChainDiffCalculator calculator; 26 // Key frame. 27 calculator.Reset({true}); 28 EXPECT_THAT(calculator.From(1, {true}), ElementsAre(0)); 29 // T1 delta frame. 30 EXPECT_THAT(calculator.From(2, {false}), ElementsAre(1)); 31 // T0 delta frame. 32 EXPECT_THAT(calculator.From(3, {true}), ElementsAre(2)); 33 } 34 35 TEST(ChainDiffCalculatorTest, TwoChainsFullSvc) { 36 // Simulate a full svc stream with 2 spatial and 2 temporal layers. 37 // chains are protecting temporal layers 0. 38 ChainDiffCalculator calculator; 39 // S0 Key frame. 40 calculator.Reset({true, true}); 41 EXPECT_THAT(calculator.From(1, {true, true}), ElementsAre(0, 0)); 42 // S1 Key frame. 43 EXPECT_THAT(calculator.From(2, {false, true}), ElementsAre(1, 1)); 44 // S0T1 delta frame. 45 EXPECT_THAT(calculator.From(3, {false, false}), ElementsAre(2, 1)); 46 // S1T1 delta frame. 47 EXPECT_THAT(calculator.From(4, {false, false}), ElementsAre(3, 2)); 48 // S0T0 delta frame. 49 EXPECT_THAT(calculator.From(5, {true, true}), ElementsAre(4, 3)); 50 // S1T0 delta frame. 51 EXPECT_THAT(calculator.From(6, {false, true}), ElementsAre(1, 1)); 52 } 53 54 TEST(ChainDiffCalculatorTest, TwoChainsKSvc) { 55 // Simulate a k-svc stream with 2 spatial and 2 temporal layers. 56 // chains are protecting temporal layers 0. 57 ChainDiffCalculator calculator; 58 // S0 Key frame. 59 calculator.Reset({true, true}); 60 EXPECT_THAT(calculator.From(1, {true, true}), ElementsAre(0, 0)); 61 // S1 Key frame. 62 EXPECT_THAT(calculator.From(2, {false, true}), ElementsAre(1, 1)); 63 // S0T1 delta frame. 64 EXPECT_THAT(calculator.From(3, {false, false}), ElementsAre(2, 1)); 65 // S1T1 delta frame. 66 EXPECT_THAT(calculator.From(4, {false, false}), ElementsAre(3, 2)); 67 // S0T0 delta frame. 68 EXPECT_THAT(calculator.From(5, {true, false}), ElementsAre(4, 3)); 69 // S1T0 delta frame. 70 EXPECT_THAT(calculator.From(6, {false, true}), ElementsAre(1, 4)); 71 } 72 73 TEST(ChainDiffCalculatorTest, TwoChainsSimulcast) { 74 // Simulate a k-svc stream with 2 spatial and 2 temporal layers. 75 // chains are protecting temporal layers 0. 76 ChainDiffCalculator calculator; 77 // S0 Key frame. 78 calculator.Reset({true, false}); 79 EXPECT_THAT(calculator.From(1, {true, false}), ElementsAre(0, 0)); 80 // S1 Key frame. 81 calculator.Reset({false, true}); 82 EXPECT_THAT(calculator.From(2, {false, true}), ElementsAre(1, 0)); 83 // S0T1 delta frame. 84 EXPECT_THAT(calculator.From(3, {false, false}), ElementsAre(2, 1)); 85 // S1T1 delta frame. 86 EXPECT_THAT(calculator.From(4, {false, false}), ElementsAre(3, 2)); 87 // S0T0 delta frame. 88 EXPECT_THAT(calculator.From(5, {true, false}), ElementsAre(4, 3)); 89 // S1T0 delta frame. 90 EXPECT_THAT(calculator.From(6, {false, true}), ElementsAre(1, 4)); 91 } 92 93 TEST(ChainDiffCalculatorTest, ResilentToAbsentChainConfig) { 94 ChainDiffCalculator calculator; 95 // Key frame. 96 calculator.Reset({true, false}); 97 EXPECT_THAT(calculator.From(1, {true, false}), ElementsAre(0, 0)); 98 // Forgot to set chains. should still return 2 chain_diffs. 99 EXPECT_THAT(calculator.From(2, {}), ElementsAre(1, 0)); 100 // chain diffs for next frame(s) are undefined, but still there should be 101 // correct number of them. 102 EXPECT_THAT(calculator.From(3, {true, false}), SizeIs(2)); 103 EXPECT_THAT(calculator.From(4, {false, true}), SizeIs(2)); 104 // Since previous two frames updated all the chains, can expect what 105 // chain_diffs would be. 106 EXPECT_THAT(calculator.From(5, {false, false}), ElementsAre(2, 1)); 107 } 108 109 TEST(ChainDiffCalculatorTest, ResilentToTooMainChains) { 110 ChainDiffCalculator calculator; 111 // Key frame. 112 calculator.Reset({true, false}); 113 EXPECT_THAT(calculator.From(1, {true, false}), ElementsAre(0, 0)); 114 // Set wrong number of chains. Expect number of chain_diffs is not changed. 115 EXPECT_THAT(calculator.From(2, {true, true, true}), ElementsAre(1, 0)); 116 // chain diffs for next frame(s) are undefined, but still there should be 117 // correct number of them. 118 EXPECT_THAT(calculator.From(3, {true, false}), SizeIs(2)); 119 EXPECT_THAT(calculator.From(4, {false, true}), SizeIs(2)); 120 // Since previous two frames updated all the chains, can expect what 121 // chain_diffs would be. 122 EXPECT_THAT(calculator.From(5, {false, false}), ElementsAre(2, 1)); 123 } 124 125 } // namespace 126 } // namespace webrtc