xref: /aosp_15_r20/external/webrtc/modules/video_coding/codecs/av1/av1_svc_config_unittest.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
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