blob: 39a4f1fd1e7d5ea822cd24eeafa3919502c50ce5 [file] [log] [blame]
Niels Möller79d566b2022-04-29 11:03:13 +02001/*
2 * Copyright (c) 2022 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/svc/scalability_mode_util.h"
12
13#include "absl/strings/string_view.h"
14#include "absl/types/optional.h"
15#include "api/video_codecs/scalability_mode.h"
16#include "rtc_base/checks.h"
17
18namespace webrtc {
19
20absl::optional<ScalabilityMode> ScalabilityModeFromString(
21 absl::string_view mode_string) {
22 if (mode_string == "L1T1")
23 return ScalabilityMode::kL1T1;
24 if (mode_string == "L1T2")
25 return ScalabilityMode::kL1T2;
26 if (mode_string == "L1T3")
27 return ScalabilityMode::kL1T3;
28
29 if (mode_string == "L2T1")
30 return ScalabilityMode::kL2T1;
31 if (mode_string == "L2T1h")
32 return ScalabilityMode::kL2T1h;
33 if (mode_string == "L2T1_KEY")
34 return ScalabilityMode::kL2T1_KEY;
35
36 if (mode_string == "L2T2")
37 return ScalabilityMode::kL2T2;
Niels Möller3b048132022-05-05 14:37:05 +020038 if (mode_string == "L2T2h")
39 return ScalabilityMode::kL2T2h;
Niels Möller79d566b2022-04-29 11:03:13 +020040 if (mode_string == "L2T2_KEY")
41 return ScalabilityMode::kL2T2_KEY;
42 if (mode_string == "L2T2_KEY_SHIFT")
43 return ScalabilityMode::kL2T2_KEY_SHIFT;
Niels Möller3b048132022-05-05 14:37:05 +020044 if (mode_string == "L2T3")
45 return ScalabilityMode::kL2T3;
46 if (mode_string == "L2T3h")
47 return ScalabilityMode::kL2T3h;
Niels Möller79d566b2022-04-29 11:03:13 +020048 if (mode_string == "L2T3_KEY")
49 return ScalabilityMode::kL2T3_KEY;
50
51 if (mode_string == "L3T1")
52 return ScalabilityMode::kL3T1;
Niels Möller3b048132022-05-05 14:37:05 +020053 if (mode_string == "L3T1h")
54 return ScalabilityMode::kL3T1h;
55 if (mode_string == "L3T1_KEY")
56 return ScalabilityMode::kL3T1_KEY;
57
58 if (mode_string == "L3T2")
59 return ScalabilityMode::kL3T2;
60 if (mode_string == "L3T2h")
61 return ScalabilityMode::kL3T2h;
62 if (mode_string == "L3T2_KEY")
63 return ScalabilityMode::kL3T2_KEY;
64
Niels Möller79d566b2022-04-29 11:03:13 +020065 if (mode_string == "L3T3")
66 return ScalabilityMode::kL3T3;
Niels Möller3b048132022-05-05 14:37:05 +020067 if (mode_string == "L3T3h")
68 return ScalabilityMode::kL3T3h;
Niels Möller79d566b2022-04-29 11:03:13 +020069 if (mode_string == "L3T3_KEY")
70 return ScalabilityMode::kL3T3_KEY;
71
72 if (mode_string == "S2T1")
73 return ScalabilityMode::kS2T1;
Åsa Perssonecfe8da2022-08-31 09:46:41 +020074 if (mode_string == "S2T1h")
75 return ScalabilityMode::kS2T1h;
Åsa Persson6d051642022-08-29 09:05:00 +020076 if (mode_string == "S2T2")
77 return ScalabilityMode::kS2T2;
Åsa Perssonecfe8da2022-08-31 09:46:41 +020078 if (mode_string == "S2T2h")
79 return ScalabilityMode::kS2T2h;
Niels Möller3c24c092022-06-30 15:42:51 +020080 if (mode_string == "S2T3")
81 return ScalabilityMode::kS2T3;
Åsa Perssonecfe8da2022-08-31 09:46:41 +020082 if (mode_string == "S2T3h")
83 return ScalabilityMode::kS2T3h;
Åsa Persson6d051642022-08-29 09:05:00 +020084 if (mode_string == "S3T1")
85 return ScalabilityMode::kS3T1;
Åsa Perssonecfe8da2022-08-31 09:46:41 +020086 if (mode_string == "S3T1h")
87 return ScalabilityMode::kS3T1h;
Åsa Persson6d051642022-08-29 09:05:00 +020088 if (mode_string == "S3T2")
89 return ScalabilityMode::kS3T2;
Åsa Perssonecfe8da2022-08-31 09:46:41 +020090 if (mode_string == "S3T2h")
91 return ScalabilityMode::kS3T2h;
Niels Möller79d566b2022-04-29 11:03:13 +020092 if (mode_string == "S3T3")
93 return ScalabilityMode::kS3T3;
Åsa Perssonecfe8da2022-08-31 09:46:41 +020094 if (mode_string == "S3T3h")
95 return ScalabilityMode::kS3T3h;
Niels Möller79d566b2022-04-29 11:03:13 +020096
97 return absl::nullopt;
98}
99
Asa Perssoncde992d2022-05-16 22:37:34 +0200100InterLayerPredMode ScalabilityModeToInterLayerPredMode(
101 ScalabilityMode scalability_mode) {
102 switch (scalability_mode) {
103 case ScalabilityMode::kL1T1:
104 case ScalabilityMode::kL1T2:
Asa Perssoncde992d2022-05-16 22:37:34 +0200105 case ScalabilityMode::kL1T3:
Asa Perssoncde992d2022-05-16 22:37:34 +0200106 case ScalabilityMode::kL2T1:
107 case ScalabilityMode::kL2T1h:
108 return InterLayerPredMode::kOn;
109 case ScalabilityMode::kL2T1_KEY:
110 return InterLayerPredMode::kOnKeyPic;
111 case ScalabilityMode::kL2T2:
112 case ScalabilityMode::kL2T2h:
113 return InterLayerPredMode::kOn;
114 case ScalabilityMode::kL2T2_KEY:
115 case ScalabilityMode::kL2T2_KEY_SHIFT:
116 return InterLayerPredMode::kOnKeyPic;
117 case ScalabilityMode::kL2T3:
118 case ScalabilityMode::kL2T3h:
119 return InterLayerPredMode::kOn;
120 case ScalabilityMode::kL2T3_KEY:
121 return InterLayerPredMode::kOnKeyPic;
122 case ScalabilityMode::kL3T1:
123 case ScalabilityMode::kL3T1h:
124 return InterLayerPredMode::kOn;
125 case ScalabilityMode::kL3T1_KEY:
126 return InterLayerPredMode::kOnKeyPic;
127 case ScalabilityMode::kL3T2:
128 case ScalabilityMode::kL3T2h:
129 return InterLayerPredMode::kOn;
130 case ScalabilityMode::kL3T2_KEY:
131 return InterLayerPredMode::kOnKeyPic;
132 case ScalabilityMode::kL3T3:
133 case ScalabilityMode::kL3T3h:
134 return InterLayerPredMode::kOn;
135 case ScalabilityMode::kL3T3_KEY:
136 return InterLayerPredMode::kOnKeyPic;
137 case ScalabilityMode::kS2T1:
Åsa Perssonecfe8da2022-08-31 09:46:41 +0200138 case ScalabilityMode::kS2T1h:
Åsa Persson6d051642022-08-29 09:05:00 +0200139 case ScalabilityMode::kS2T2:
Åsa Perssonecfe8da2022-08-31 09:46:41 +0200140 case ScalabilityMode::kS2T2h:
Niels Möller3c24c092022-06-30 15:42:51 +0200141 case ScalabilityMode::kS2T3:
Åsa Perssonecfe8da2022-08-31 09:46:41 +0200142 case ScalabilityMode::kS2T3h:
Åsa Persson6d051642022-08-29 09:05:00 +0200143 case ScalabilityMode::kS3T1:
Åsa Perssonecfe8da2022-08-31 09:46:41 +0200144 case ScalabilityMode::kS3T1h:
Åsa Persson6d051642022-08-29 09:05:00 +0200145 case ScalabilityMode::kS3T2:
Åsa Perssonecfe8da2022-08-31 09:46:41 +0200146 case ScalabilityMode::kS3T2h:
Asa Perssoncde992d2022-05-16 22:37:34 +0200147 case ScalabilityMode::kS3T3:
Åsa Perssonecfe8da2022-08-31 09:46:41 +0200148 case ScalabilityMode::kS3T3h:
Asa Perssoncde992d2022-05-16 22:37:34 +0200149 return InterLayerPredMode::kOff;
150 }
151 RTC_CHECK_NOTREACHED();
152}
153
Asa Persson26983532022-05-13 16:24:22 +0200154int ScalabilityModeToNumSpatialLayers(ScalabilityMode scalability_mode) {
155 switch (scalability_mode) {
156 case ScalabilityMode::kL1T1:
157 case ScalabilityMode::kL1T2:
Asa Persson26983532022-05-13 16:24:22 +0200158 case ScalabilityMode::kL1T3:
Asa Persson26983532022-05-13 16:24:22 +0200159 return 1;
160 case ScalabilityMode::kL2T1:
161 case ScalabilityMode::kL2T1h:
162 case ScalabilityMode::kL2T1_KEY:
163 case ScalabilityMode::kL2T2:
164 case ScalabilityMode::kL2T2h:
165 case ScalabilityMode::kL2T2_KEY:
166 case ScalabilityMode::kL2T2_KEY_SHIFT:
167 case ScalabilityMode::kL2T3:
168 case ScalabilityMode::kL2T3h:
169 case ScalabilityMode::kL2T3_KEY:
170 return 2;
171 case ScalabilityMode::kL3T1:
172 case ScalabilityMode::kL3T1h:
173 case ScalabilityMode::kL3T1_KEY:
174 case ScalabilityMode::kL3T2:
175 case ScalabilityMode::kL3T2h:
176 case ScalabilityMode::kL3T2_KEY:
177 case ScalabilityMode::kL3T3:
178 case ScalabilityMode::kL3T3h:
179 case ScalabilityMode::kL3T3_KEY:
180 return 3;
181 case ScalabilityMode::kS2T1:
Åsa Perssonecfe8da2022-08-31 09:46:41 +0200182 case ScalabilityMode::kS2T1h:
Åsa Persson6d051642022-08-29 09:05:00 +0200183 case ScalabilityMode::kS2T2:
Åsa Perssonecfe8da2022-08-31 09:46:41 +0200184 case ScalabilityMode::kS2T2h:
Niels Möller3c24c092022-06-30 15:42:51 +0200185 case ScalabilityMode::kS2T3:
Åsa Perssonecfe8da2022-08-31 09:46:41 +0200186 case ScalabilityMode::kS2T3h:
Asa Persson26983532022-05-13 16:24:22 +0200187 return 2;
Åsa Persson6d051642022-08-29 09:05:00 +0200188 case ScalabilityMode::kS3T1:
Åsa Perssonecfe8da2022-08-31 09:46:41 +0200189 case ScalabilityMode::kS3T1h:
Åsa Persson6d051642022-08-29 09:05:00 +0200190 case ScalabilityMode::kS3T2:
Åsa Perssonecfe8da2022-08-31 09:46:41 +0200191 case ScalabilityMode::kS3T2h:
Asa Persson26983532022-05-13 16:24:22 +0200192 case ScalabilityMode::kS3T3:
Åsa Perssonecfe8da2022-08-31 09:46:41 +0200193 case ScalabilityMode::kS3T3h:
Asa Persson26983532022-05-13 16:24:22 +0200194 return 3;
195 }
196 RTC_CHECK_NOTREACHED();
197}
198
Niels Möller05954892022-05-13 13:34:37 +0200199int ScalabilityModeToNumTemporalLayers(ScalabilityMode scalability_mode) {
200 switch (scalability_mode) {
201 case ScalabilityMode::kL1T1:
202 return 1;
203 case ScalabilityMode::kL1T2:
Niels Möller05954892022-05-13 13:34:37 +0200204 return 2;
205 case ScalabilityMode::kL1T3:
Niels Möller05954892022-05-13 13:34:37 +0200206 return 3;
207 case ScalabilityMode::kL2T1:
208 case ScalabilityMode::kL2T1h:
209 case ScalabilityMode::kL2T1_KEY:
210 return 1;
211 case ScalabilityMode::kL2T2:
212 case ScalabilityMode::kL2T2h:
213 case ScalabilityMode::kL2T2_KEY:
214 case ScalabilityMode::kL2T2_KEY_SHIFT:
215 return 2;
216 case ScalabilityMode::kL2T3:
217 case ScalabilityMode::kL2T3h:
218 case ScalabilityMode::kL2T3_KEY:
219 return 3;
220 case ScalabilityMode::kL3T1:
221 case ScalabilityMode::kL3T1h:
222 case ScalabilityMode::kL3T1_KEY:
223 return 1;
224 case ScalabilityMode::kL3T2:
225 case ScalabilityMode::kL3T2h:
226 case ScalabilityMode::kL3T2_KEY:
227 return 2;
228 case ScalabilityMode::kL3T3:
229 case ScalabilityMode::kL3T3h:
230 case ScalabilityMode::kL3T3_KEY:
231 return 3;
232 case ScalabilityMode::kS2T1:
Åsa Perssonecfe8da2022-08-31 09:46:41 +0200233 case ScalabilityMode::kS2T1h:
Åsa Persson6d051642022-08-29 09:05:00 +0200234 case ScalabilityMode::kS3T1:
Åsa Perssonecfe8da2022-08-31 09:46:41 +0200235 case ScalabilityMode::kS3T1h:
Niels Möller05954892022-05-13 13:34:37 +0200236 return 1;
Åsa Persson6d051642022-08-29 09:05:00 +0200237 case ScalabilityMode::kS2T2:
Åsa Perssonecfe8da2022-08-31 09:46:41 +0200238 case ScalabilityMode::kS2T2h:
Åsa Persson6d051642022-08-29 09:05:00 +0200239 case ScalabilityMode::kS3T2:
Åsa Perssonecfe8da2022-08-31 09:46:41 +0200240 case ScalabilityMode::kS3T2h:
Åsa Persson6d051642022-08-29 09:05:00 +0200241 return 2;
Niels Möller3c24c092022-06-30 15:42:51 +0200242 case ScalabilityMode::kS2T3:
Åsa Perssonecfe8da2022-08-31 09:46:41 +0200243 case ScalabilityMode::kS2T3h:
Niels Möller05954892022-05-13 13:34:37 +0200244 case ScalabilityMode::kS3T3:
Åsa Perssonecfe8da2022-08-31 09:46:41 +0200245 case ScalabilityMode::kS3T3h:
Niels Möller05954892022-05-13 13:34:37 +0200246 return 3;
247 }
248 RTC_CHECK_NOTREACHED();
249}
250
Byoungchan Lee2d7db712022-08-30 19:07:17 +0900251absl::optional<ScalabilityModeResolutionRatio> ScalabilityModeToResolutionRatio(
252 ScalabilityMode scalability_mode) {
253 switch (scalability_mode) {
254 case ScalabilityMode::kL1T1:
255 case ScalabilityMode::kL1T2:
Byoungchan Lee2d7db712022-08-30 19:07:17 +0900256 case ScalabilityMode::kL1T3:
Byoungchan Lee2d7db712022-08-30 19:07:17 +0900257 return absl::nullopt;
258 case ScalabilityMode::kL2T1:
259 case ScalabilityMode::kL2T1_KEY:
260 case ScalabilityMode::kL2T2:
261 case ScalabilityMode::kL2T2_KEY:
262 case ScalabilityMode::kL2T2_KEY_SHIFT:
263 case ScalabilityMode::kL2T3:
264 case ScalabilityMode::kL2T3_KEY:
265 case ScalabilityMode::kL3T1:
266 case ScalabilityMode::kL3T1_KEY:
267 case ScalabilityMode::kL3T2:
268 case ScalabilityMode::kL3T2_KEY:
269 case ScalabilityMode::kL3T3:
270 case ScalabilityMode::kL3T3_KEY:
271 case ScalabilityMode::kS2T1:
272 case ScalabilityMode::kS2T2:
273 case ScalabilityMode::kS2T3:
274 case ScalabilityMode::kS3T1:
275 case ScalabilityMode::kS3T2:
276 case ScalabilityMode::kS3T3:
277 return ScalabilityModeResolutionRatio::kTwoToOne;
278 case ScalabilityMode::kL2T1h:
279 case ScalabilityMode::kL2T2h:
280 case ScalabilityMode::kL2T3h:
281 case ScalabilityMode::kL3T1h:
282 case ScalabilityMode::kL3T2h:
283 case ScalabilityMode::kL3T3h:
Åsa Perssonecfe8da2022-08-31 09:46:41 +0200284 case ScalabilityMode::kS2T1h:
285 case ScalabilityMode::kS2T2h:
286 case ScalabilityMode::kS2T3h:
287 case ScalabilityMode::kS3T1h:
288 case ScalabilityMode::kS3T2h:
289 case ScalabilityMode::kS3T3h:
Byoungchan Lee2d7db712022-08-30 19:07:17 +0900290 return ScalabilityModeResolutionRatio::kThreeToTwo;
291 }
292 RTC_CHECK_NOTREACHED();
293}
294
Niels Möller79d566b2022-04-29 11:03:13 +0200295} // namespace webrtc