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/codecs/av1/av1_svc_config.h"
12
13 #include "api/video_codecs/video_codec.h"
14 #include "test/gmock.h"
15 #include "test/gtest.h"
16
17 namespace webrtc {
18 namespace {
19 constexpr int kDontCare = 0;
20
TEST(Av1SvcConfigTest,TreatsEmptyAsL1T1)21 TEST(Av1SvcConfigTest, TreatsEmptyAsL1T1) {
22 VideoCodec video_codec;
23 video_codec.codecType = kVideoCodecAV1;
24
25 EXPECT_TRUE(SetAv1SvcConfig(video_codec, /*num_temporal_layers=*/kDontCare,
26 /*num_spatial_layers=*/kDontCare));
27
28 EXPECT_TRUE(video_codec.spatialLayers[0].active);
29 EXPECT_EQ(video_codec.spatialLayers[0].numberOfTemporalLayers, 1);
30 EXPECT_FALSE(video_codec.spatialLayers[1].active);
31 }
32
TEST(Av1SvcConfigTest,ScalabilityModeFromNumberOfTemporalLayers)33 TEST(Av1SvcConfigTest, ScalabilityModeFromNumberOfTemporalLayers) {
34 VideoCodec video_codec;
35 video_codec.codecType = kVideoCodecAV1;
36
37 EXPECT_TRUE(SetAv1SvcConfig(video_codec, /*num_temporal_layers=*/3,
38 /*num_spatial_layers=*/1));
39 EXPECT_EQ(video_codec.spatialLayers[0].numberOfTemporalLayers, 3);
40 }
41
TEST(Av1SvcConfigTest,ScalabilityModeFromNumberOfSpatialLayers)42 TEST(Av1SvcConfigTest, ScalabilityModeFromNumberOfSpatialLayers) {
43 VideoCodec video_codec;
44 video_codec.codecType = kVideoCodecAV1;
45
46 EXPECT_TRUE(SetAv1SvcConfig(video_codec, /*num_temporal_layers=*/3,
47 /*num_spatial_layers=*/2));
48 EXPECT_EQ(video_codec.spatialLayers[0].numberOfTemporalLayers, 3);
49 EXPECT_TRUE(video_codec.spatialLayers[0].active);
50 EXPECT_TRUE(video_codec.spatialLayers[1].active);
51 EXPECT_FALSE(video_codec.spatialLayers[2].active);
52 }
53
TEST(Av1SvcConfigTest,SetsActiveSpatialLayersFromScalabilityMode)54 TEST(Av1SvcConfigTest, SetsActiveSpatialLayersFromScalabilityMode) {
55 VideoCodec video_codec;
56 video_codec.codecType = kVideoCodecAV1;
57 video_codec.SetScalabilityMode(ScalabilityMode::kL2T1);
58
59 EXPECT_TRUE(SetAv1SvcConfig(video_codec, /*num_temporal_layers=*/kDontCare,
60 /*num_spatial_layers=*/kDontCare));
61
62 EXPECT_TRUE(video_codec.spatialLayers[0].active);
63 EXPECT_TRUE(video_codec.spatialLayers[1].active);
64 EXPECT_FALSE(video_codec.spatialLayers[2].active);
65 }
66
TEST(Av1SvcConfigTest,ConfiguresDobuleResolutionRatioFromScalabilityMode)67 TEST(Av1SvcConfigTest, ConfiguresDobuleResolutionRatioFromScalabilityMode) {
68 VideoCodec video_codec;
69 video_codec.codecType = kVideoCodecAV1;
70 video_codec.SetScalabilityMode(ScalabilityMode::kL2T1);
71 video_codec.width = 1200;
72 video_codec.height = 800;
73
74 EXPECT_TRUE(SetAv1SvcConfig(video_codec, /*num_temporal_layers=*/kDontCare,
75 /*num_spatial_layers=*/kDontCare));
76
77 EXPECT_EQ(video_codec.spatialLayers[0].width, 600);
78 EXPECT_EQ(video_codec.spatialLayers[0].height, 400);
79 EXPECT_EQ(video_codec.spatialLayers[1].width, 1200);
80 EXPECT_EQ(video_codec.spatialLayers[1].height, 800);
81 }
82
TEST(Av1SvcConfigTest,ConfiguresSmallResolutionRatioFromScalabilityMode)83 TEST(Av1SvcConfigTest, ConfiguresSmallResolutionRatioFromScalabilityMode) {
84 VideoCodec video_codec;
85 video_codec.codecType = kVideoCodecAV1;
86 // h mode uses 1.5:1 ratio
87 video_codec.SetScalabilityMode(ScalabilityMode::kL2T1h);
88 video_codec.width = 1500;
89 video_codec.height = 900;
90
91 EXPECT_TRUE(SetAv1SvcConfig(video_codec, /*num_temporal_layers=*/kDontCare,
92 /*num_spatial_layers=*/kDontCare));
93
94 EXPECT_EQ(video_codec.spatialLayers[0].width, 1000);
95 EXPECT_EQ(video_codec.spatialLayers[0].height, 600);
96 EXPECT_EQ(video_codec.spatialLayers[1].width, 1500);
97 EXPECT_EQ(video_codec.spatialLayers[1].height, 900);
98 }
99
TEST(Av1SvcConfigTest,CopiesFramrate)100 TEST(Av1SvcConfigTest, CopiesFramrate) {
101 VideoCodec video_codec;
102 video_codec.codecType = kVideoCodecAV1;
103 // h mode uses 1.5:1 ratio
104 video_codec.SetScalabilityMode(ScalabilityMode::kL2T1);
105 video_codec.maxFramerate = 27;
106
107 EXPECT_TRUE(SetAv1SvcConfig(video_codec, /*num_temporal_layers=*/kDontCare,
108 /*num_spatial_layers=*/kDontCare));
109
110 EXPECT_EQ(video_codec.spatialLayers[0].maxFramerate, 27);
111 EXPECT_EQ(video_codec.spatialLayers[1].maxFramerate, 27);
112 }
113
TEST(Av1SvcConfigTest,SetsNumberOfTemporalLayers)114 TEST(Av1SvcConfigTest, SetsNumberOfTemporalLayers) {
115 VideoCodec video_codec;
116 video_codec.codecType = kVideoCodecAV1;
117 video_codec.SetScalabilityMode(ScalabilityMode::kL1T3);
118
119 EXPECT_TRUE(SetAv1SvcConfig(video_codec, /*num_temporal_layers=*/kDontCare,
120 /*num_spatial_layers=*/kDontCare));
121
122 EXPECT_EQ(video_codec.spatialLayers[0].numberOfTemporalLayers, 3);
123 }
124
TEST(Av1SvcConfigTest,CopiesMinMaxBitrateForSingleSpatialLayer)125 TEST(Av1SvcConfigTest, CopiesMinMaxBitrateForSingleSpatialLayer) {
126 VideoCodec video_codec;
127 video_codec.codecType = kVideoCodecAV1;
128 video_codec.SetScalabilityMode(ScalabilityMode::kL1T3);
129 video_codec.minBitrate = 100;
130 video_codec.maxBitrate = 500;
131
132 EXPECT_TRUE(SetAv1SvcConfig(video_codec, /*num_temporal_layers=*/kDontCare,
133 /*num_spatial_layers=*/kDontCare));
134
135 EXPECT_EQ(video_codec.spatialLayers[0].minBitrate, 100u);
136 EXPECT_EQ(video_codec.spatialLayers[0].maxBitrate, 500u);
137 EXPECT_LE(video_codec.spatialLayers[0].minBitrate,
138 video_codec.spatialLayers[0].targetBitrate);
139 EXPECT_LE(video_codec.spatialLayers[0].targetBitrate,
140 video_codec.spatialLayers[0].maxBitrate);
141 }
142
TEST(Av1SvcConfigTest,SetsBitratesForMultipleSpatialLayers)143 TEST(Av1SvcConfigTest, SetsBitratesForMultipleSpatialLayers) {
144 VideoCodec video_codec;
145 video_codec.codecType = kVideoCodecAV1;
146 video_codec.SetScalabilityMode(ScalabilityMode::kL3T3);
147
148 EXPECT_TRUE(SetAv1SvcConfig(video_codec, /*num_temporal_layers=*/kDontCare,
149 /*num_spatial_layers=*/kDontCare));
150
151 EXPECT_GT(video_codec.spatialLayers[0].minBitrate, 0u);
152 EXPECT_LE(video_codec.spatialLayers[0].minBitrate,
153 video_codec.spatialLayers[0].targetBitrate);
154 EXPECT_LE(video_codec.spatialLayers[0].targetBitrate,
155 video_codec.spatialLayers[0].maxBitrate);
156
157 EXPECT_GT(video_codec.spatialLayers[1].minBitrate, 0u);
158 EXPECT_LE(video_codec.spatialLayers[1].minBitrate,
159 video_codec.spatialLayers[1].targetBitrate);
160 EXPECT_LE(video_codec.spatialLayers[1].targetBitrate,
161 video_codec.spatialLayers[1].maxBitrate);
162
163 EXPECT_GT(video_codec.spatialLayers[2].minBitrate, 0u);
164 EXPECT_LE(video_codec.spatialLayers[2].minBitrate,
165 video_codec.spatialLayers[2].targetBitrate);
166 EXPECT_LE(video_codec.spatialLayers[2].targetBitrate,
167 video_codec.spatialLayers[2].maxBitrate);
168 }
169
170 } // namespace
171 } // namespace webrtc
172