frame_dependencies_calculator_unittest.cc (4891B)
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/frame_dependencies_calculator.h" 12 13 #include "common_video/generic_frame_descriptor/generic_frame_info.h" 14 #include "test/gmock.h" 15 #include "test/gtest.h" 16 17 namespace webrtc { 18 namespace { 19 20 using ::testing::ElementsAre; 21 using ::testing::IsEmpty; 22 using ::testing::UnorderedElementsAre; 23 24 constexpr CodecBufferUsage ReferenceAndUpdate(int id) { 25 return CodecBufferUsage(id, /*referenced=*/true, /*updated=*/true); 26 } 27 constexpr CodecBufferUsage Reference(int id) { 28 return CodecBufferUsage(id, /*referenced=*/true, /*updated=*/false); 29 } 30 constexpr CodecBufferUsage Update(int id) { 31 return CodecBufferUsage(id, /*referenced=*/false, /*updated=*/true); 32 } 33 34 TEST(FrameDependenciesCalculatorTest, SingleLayer) { 35 CodecBufferUsage pattern[] = {ReferenceAndUpdate(0)}; 36 FrameDependenciesCalculator calculator; 37 38 EXPECT_THAT(calculator.FromBuffersUsage(/*frame_id=*/1, pattern), IsEmpty()); 39 EXPECT_THAT(calculator.FromBuffersUsage(/*frame_id=*/3, pattern), 40 ElementsAre(1)); 41 EXPECT_THAT(calculator.FromBuffersUsage(/*frame_id=*/6, pattern), 42 ElementsAre(3)); 43 } 44 45 TEST(FrameDependenciesCalculatorTest, TwoTemporalLayers) { 46 // Shortened 4-frame pattern: 47 // T1: 2---4 6---8 ... 48 // / / / / 49 // T0: 1---3---5---7 ... 50 CodecBufferUsage pattern0[] = {ReferenceAndUpdate(0)}; 51 CodecBufferUsage pattern1[] = {Reference(0), Update(1)}; 52 CodecBufferUsage pattern2[] = {ReferenceAndUpdate(0)}; 53 CodecBufferUsage pattern3[] = {Reference(0), Reference(1)}; 54 FrameDependenciesCalculator calculator; 55 56 EXPECT_THAT(calculator.FromBuffersUsage(/*frame_id=*/1, pattern0), IsEmpty()); 57 EXPECT_THAT(calculator.FromBuffersUsage(/*frame_id=*/2, pattern1), 58 ElementsAre(1)); 59 EXPECT_THAT(calculator.FromBuffersUsage(/*frame_id=*/3, pattern2), 60 ElementsAre(1)); 61 EXPECT_THAT(calculator.FromBuffersUsage(/*frame_id=*/4, pattern3), 62 UnorderedElementsAre(2, 3)); 63 EXPECT_THAT(calculator.FromBuffersUsage(/*frame_id=*/5, pattern0), 64 ElementsAre(3)); 65 EXPECT_THAT(calculator.FromBuffersUsage(/*frame_id=*/6, pattern1), 66 ElementsAre(5)); 67 EXPECT_THAT(calculator.FromBuffersUsage(/*frame_id=*/7, pattern2), 68 ElementsAre(5)); 69 EXPECT_THAT(calculator.FromBuffersUsage(/*frame_id=*/8, pattern3), 70 UnorderedElementsAre(6, 7)); 71 } 72 73 TEST(FrameDependenciesCalculatorTest, ThreeTemporalLayers4FramePattern) { 74 // T2: 2---4 6---8 ... 75 // / / / / 76 // T1: | 3 | 7 ... 77 // /_/ /_/ 78 // T0: 1-------5----- ... 79 CodecBufferUsage pattern0[] = {ReferenceAndUpdate(0)}; 80 CodecBufferUsage pattern1[] = {Reference(0), Update(2)}; 81 CodecBufferUsage pattern2[] = {Reference(0), Update(1)}; 82 CodecBufferUsage pattern3[] = {Reference(0), Reference(1), Reference(2)}; 83 FrameDependenciesCalculator calculator; 84 85 EXPECT_THAT(calculator.FromBuffersUsage(/*frame_id=*/1, pattern0), IsEmpty()); 86 EXPECT_THAT(calculator.FromBuffersUsage(/*frame_id=*/2, pattern1), 87 ElementsAre(1)); 88 EXPECT_THAT(calculator.FromBuffersUsage(/*frame_id=*/3, pattern2), 89 ElementsAre(1)); 90 // Note that frame#4 references buffer#0 that is updated by frame#1, 91 // yet there is no direct dependency from frame#4 to frame#1. 92 EXPECT_THAT(calculator.FromBuffersUsage(/*frame_id=*/4, pattern3), 93 UnorderedElementsAre(2, 3)); 94 EXPECT_THAT(calculator.FromBuffersUsage(/*frame_id=*/5, pattern0), 95 ElementsAre(1)); 96 EXPECT_THAT(calculator.FromBuffersUsage(/*frame_id=*/6, pattern1), 97 ElementsAre(5)); 98 } 99 100 TEST(FrameDependenciesCalculatorTest, SimulcastWith2Layers) { 101 // S1: 2---4---6- ... 102 // 103 // S0: 1---3---5- ... 104 CodecBufferUsage pattern0[] = {ReferenceAndUpdate(0)}; 105 CodecBufferUsage pattern1[] = {ReferenceAndUpdate(1)}; 106 FrameDependenciesCalculator calculator; 107 108 EXPECT_THAT(calculator.FromBuffersUsage(/*frame_id=*/1, pattern0), IsEmpty()); 109 EXPECT_THAT(calculator.FromBuffersUsage(/*frame_id=*/2, pattern1), IsEmpty()); 110 EXPECT_THAT(calculator.FromBuffersUsage(/*frame_id=*/3, pattern0), 111 ElementsAre(1)); 112 EXPECT_THAT(calculator.FromBuffersUsage(/*frame_id=*/4, pattern1), 113 ElementsAre(2)); 114 EXPECT_THAT(calculator.FromBuffersUsage(/*frame_id=*/5, pattern0), 115 ElementsAre(3)); 116 EXPECT_THAT(calculator.FromBuffersUsage(/*frame_id=*/6, pattern1), 117 ElementsAre(4)); 118 } 119 120 } // namespace 121 } // namespace webrtc