1 /*
2 * Android MediaCodec encoders
3 *
4 * Copyright (c) 2022 Zhao Zhili <zhilizhao@tencent.com>
5 *
6 * This file is part of FFmpeg.
7 *
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
12 *
13 * FFmpeg is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 */
22
23 #include "config_components.h"
24
33
44
45 #define INPUT_DEQUEUE_TIMEOUT_US 8000
46 #define OUTPUT_DEQUEUE_TIMEOUT_US 8000
47
49 /* Constant quality mode */
51 /* Variable bitrate mode */
53 /* Constant bitrate mode */
55 /* Constant bitrate mode with frame drops */
57 };
58
63
70
74
78
81
86 // Ref. MediaFormat KEY_OPERATING_RATE
89
93
98
106
107 enum {
111 };
112
113 static const struct {
120 };
121
127 };
128
131 {
133 const char *
name =
s->name;
135
139 }
140
142 {
145
150 }
151
153 {
155
156 if (!bsf) {
158 return 0;
159 }
160
163 return 1;
164 }
165
166 return 0;
167 }
168
170 {
172 char str[128] = {0};
174 int crop_right =
s->width - avctx->
width;
175 int crop_bottom =
s->height - avctx->
height;
176
177 /* Nothing can be done for this format now */
179 return 0;
180
183 if (!crop_right && !crop_bottom && !
s->extract_extradata)
184 return 0;
185
187 if (crop_right || crop_bottom) {
189 ret =
snprintf(str,
sizeof(str),
"h264_metadata=crop_right=%d:crop_bottom=%d",
190 crop_right, crop_bottom);
192 /* Encoder can use CTU size larger than 16x16, so the real crop
193 * margin can be larger than crop_right/crop_bottom. Let bsf figure
194 * out the real crop margin.
195 */
196 ret =
snprintf(str,
sizeof(str),
"hevc_metadata=width=%d:height=%d",
198 if (
ret >=
sizeof(str))
200 }
201
202 if (
s->extract_extradata) {
204 if (
ret >=
sizeof(str))
206 }
207
211
217
219 }
220
223 {
225 uint8_t *dst_data[4] = {};
226 int dst_linesize[4] = {};
227
230 dst_data[1] =
dst +
s->width *
s->height;
231 dst_data[2] = dst_data[1] +
s->width *
s->height / 4;
232
233 dst_linesize[0] =
s->width;
234 dst_linesize[1] = dst_linesize[2] =
s->width / 2;
237 dst_data[1] =
dst +
s->width *
s->height;
238
239 dst_linesize[0] =
s->width;
240 dst_linesize[1] =
s->width;
241 } else {
243 }
244
247 }
248
249
251 const char *detail)
252 {
255
257 return;
258
260
266
269 }
270
273 {
277
283
285 on_error(codec, userdata,
ret,
"av_fifo_write failed");
286 }
287
291 {
296 .buf_info = *out_info,
297 };
299
305
307 on_error(codec, userdata,
ret,
"av_fifo_write failed");
308 }
309
312 {
314 }
315
317 {
320
322 return 0;
323
326
329
333
334 if (!
s->input_index || !
s->async_output)
336
337 return 0;
338 }
339
341 {
343
345 return;
346
349
352
355
357 }
358
360
363 {
365
366 // Handle common options in AVCodecContext first.
367 if (avctx->
qmin >= 0) {
371 }
372
373 if (avctx->
qmax >= 0) {
377 }
378
379 if (
s->qp_i_min >= 0)
381 if (
s->qp_p_min >= 0)
383 if (
s->qp_b_min >= 0)
385
386 if (
s->qp_i_max >= 0)
388 if (
s->qp_p_max >= 0)
390 if (
s->qp_b_max >= 0)
392 }
393
395 {
396 const char *codec_mime =
NULL;
400 int gop;
401
402 // Init async state first, so we can do cleanup safely on error path.
406
407 if (
s->use_ndk_codec < 0)
409
412 codec_mime = "video/avc";
413 break;
415 codec_mime = "video/hevc";
416 break;
418 codec_mime = "video/x-vnd.on2.vp8";
419 break;
421 codec_mime = "video/x-vnd.on2.vp9";
422 break;
424 codec_mime = "video/mp4v-es";
425 break;
427 codec_mime = "video/av01";
428 break;
429 default:
431 }
432
435 else
439 codec_mime);
441 }
442
447 }
448
450 // Workaround the alignment requirement of mediacodec. We can't do it
451 // silently for AV_PIX_FMT_MEDIACODEC.
457 } else {
460 if (
s->width % 16 ||
s->height % 16)
462 "Video size %dx%d isn't align to 16, it may have device compatibility issue\n",
463 s->width,
s->height);
464 }
467
473
476 goto bailout;
477 }
478 dev_ctx = device_ctx->
hwctx;
480 }
481
482 if (!
s->window && user_ctx && user_ctx->
surface)
484
487 av_log(avctx,
AV_LOG_ERROR,
"Missing hw_device_ctx or hwaccel_context for AV_PIX_FMT_MEDIACODEC\n");
488 goto bailout;
489 }
490 /* Although there is a method ANativeWindow_toSurface() introduced in
491 * API level 26, it's easier and safe to always require a Surface for
492 * Java MediaCodec.
493 */
494 if (!
s->use_ndk_codec && !
s->window->surface) {
497 "Please note that Java MediaCodec doesn't work with ANativeWindow.\n");
498 goto bailout;
499 }
500 }
501
506 break;
507 }
508 }
509
519
522 if (
s->bitrate_mode >= 0) {
526 }
528
529 // frame-rate and i-frame-interval are required to configure codec
532 } else {
535 }
537 if (gop == 0) {
538 gop = 1;
540 "Use %d as the default MediaFormat i-frame-interval, "
541 "please set gop_size properly (>= fps)\n", gop);
542 } else {
544 }
545
548
553 }
557 }
561 "Enabling B frames will produce packets with no DTS. "
562 "Use -strict experimental to use it anyway.\n");
564 goto bailout;
565 }
567 }
568 if (
s->pts_as_dts == -1)
570 if (
s->operating_rate > 0)
572
579 "support yuv420p as encoder input format.\n");
580 goto bailout;
581 }
582
589 };
590
594 "Try MediaCodec async mode failed, %s, switch to sync mode\n",
597 }
598 }
599
602 goto bailout;
603
605
609 goto bailout;
610 }
611
616 goto bailout;
617 }
618
620
621 bailout:
625 }
626
629 {
635
636 if (!
s->async_mode) {
638 return 0;
639 }
640
642
643 while (!
s->encode_status) {
645 break;
646
647 // Only wait after signalEndOfInputStream
648 if (
s->eof_sent && !
s->encode_status)
650 else
651 break;
652 }
653
654 ret =
s->encode_status;
656
657 // Get output index success
660 *out_info =
output.buf_info;
661 return 0;
662 }
663
665 }
666
668 {
673 uint8_t *out_buf;
676 int extradata_size = 0;
677
681
684
688 }
689
693 }
694
697
700
702 if (!out_buf) {
704 goto bailout;
705 }
706
709 // Skip AV1CodecConfigurationRecord without configOBUs
710 if (out_info.
size <= 4) {
713 }
716 }
717
720 goto bailout;
721
722 s->extradata_size = out_info.
size;
723 memcpy(
s->extradata, out_buf + out_info.
offset, out_info.
size);
725 // try immediately
727 }
728
731 goto bailout;
732
733 if (
s->extradata_size) {
734 extradata_size =
s->extradata_size;
735 s->extradata_size = 0;
736 memcpy(
pkt->
data,
s->extradata, extradata_size);
737 }
745
747 " flags %d extradata %d\n",
749
750 bailout:
753 }
754
756 {
761
762 if (!
s->async_mode) {
764 return 0;
765 }
766
768
769 n = -1;
770 while (n < 0 && !s->encode_status) {
773 break;
774 }
775
776 if (n < 0 && !s->encode_status)
778 }
779
780 ret =
s->encode_status;
783
785 }
786
787
793 uint8_t *input_buf =
NULL;
794 size_t input_size = 0;
798
800 return 0;
801
806 }
807
810 return 0;
811 }
812
816
819
823 }
824
828
830 } else {
833 }
834
836 return 0;
837 }
838
840 {
843
844 // Return on three case:
845 // 1. Serious error
846 // 2. Got a packet success
847 // 3. No AVFrame is available yet (don't return if get_frame return EOF)
848 while (1) {
852 return 0;
855 }
856
861 } else {
863 return 0;
864 }
865
868
869 if (!
s->frame->buf[0]) {
873 }
874
880 }
881
882 return 0;
883 }
884
886 {
889
890 s->frame->width = avctx->
width;
891 s->frame->height = avctx->
height;
894
898
899 do {
903
906
911 }
912
913 return 0;
914 }
915
917 {
920
921 do {
924
927
928 do {
934
936 }
937
939 {
943 size_t side_size;
944 uint8_t *side;
945
947 return 0;
948
949 // Send dummy frame and receive a packet doesn't work in async mode
950 if (
s->async_mode || !
s->extract_extradata) {
952 "Mediacodec encoder doesn't support AV_CODEC_FLAG_GLOBAL_HEADER. "
953 "Use extract_extradata bsf when necessary.\n");
954 return 0;
955 }
956
960
963 goto bailout;
966 goto bailout;
967
969 if (side && side_size > 0) {
973 goto bailout;
974 }
975
976 memcpy(avctx->
extradata, side, side_size);
978 }
979
980 bailout:
984 }
988 }
989
991 {
997 }
998
1002 }
1003
1006
1008
1009 return 0;
1010 }
1011
1013 {
1019 }
1020
1028 },
1030 },
1032 };
1033
1035 {"qmin", "-1"},
1036 {"qmax", "-1"},
1038 };
1039
1040 #define OFFSET(x) offsetof(MediaCodecEncContext, x)
1041 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
1042 #define COMMON_OPTION \
1043 { "ndk_codec", "Use MediaCodec from NDK", \
1044 OFFSET(use_ndk_codec), AV_OPT_TYPE_BOOL, {.i64 = -1}, -1, 1, VE }, \
1045 { "ndk_async", "Try NDK MediaCodec in async mode", \
1046 OFFSET(async_mode), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, VE }, \
1047 { "codec_name", "Select codec by name", \
1048 OFFSET(name), AV_OPT_TYPE_STRING, {0}, 0, 0, VE }, \
1049 { "bitrate_mode", "Bitrate control method", \
1050 OFFSET(bitrate_mode), AV_OPT_TYPE_INT, {.i64 = -1}, -1, INT_MAX, VE, .unit = "bitrate_mode" }, \
1051 { "cq", "Constant quality mode", \
1052 0, AV_OPT_TYPE_CONST, {.i64 = BITRATE_MODE_CQ}, 0, 0, VE, .unit = "bitrate_mode" }, \
1053 { "vbr", "Variable bitrate mode", \
1054 0, AV_OPT_TYPE_CONST, {.i64 = BITRATE_MODE_VBR}, 0, 0, VE, .unit = "bitrate_mode" }, \
1055 { "cbr", "Constant bitrate mode", \
1056 0, AV_OPT_TYPE_CONST, {.i64 = BITRATE_MODE_CBR}, 0, 0, VE, .unit = "bitrate_mode" }, \
1057 { "cbr_fd", "Constant bitrate mode with frame drops", \
1058 0, AV_OPT_TYPE_CONST, {.i64 = BITRATE_MODE_CBR_FD}, 0, 0, VE, .unit = "bitrate_mode" }, \
1059 { "pts_as_dts", "Use PTS as DTS. It is enabled automatically if avctx max_b_frames <= 0, " \
1060 "since most of Android devices don't output B frames by default.", \
1061 OFFSET(pts_as_dts), AV_OPT_TYPE_BOOL, {.i64 = -1}, -1, 1, VE }, \
1062 { "operating_rate", "The desired operating rate that the codec will need to operate at, zero for unspecified", \
1063 OFFSET(operating_rate), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, VE }, \
1064 { "qp_i_min", "minimum quantization parameter for I frame", \
1065 OFFSET(qp_i_min), AV_OPT_TYPE_INT, {.i64 = -1}, -1, INT_MAX, VE }, \
1066 { "qp_p_min", "minimum quantization parameter for P frame", \
1067 OFFSET(qp_p_min), AV_OPT_TYPE_INT, {.i64 = -1}, -1, INT_MAX, VE }, \
1068 { "qp_b_min", "minimum quantization parameter for B frame", \
1069 OFFSET(qp_b_min), AV_OPT_TYPE_INT, {.i64 = -1}, -1, INT_MAX, VE }, \
1070 { "qp_i_max", "maximum quantization parameter for I frame", \
1071 OFFSET(qp_i_max), AV_OPT_TYPE_INT, {.i64 = -1}, -1, INT_MAX, VE }, \
1072 { "qp_p_max", "maximum quantization parameter for P frame", \
1073 OFFSET(qp_p_max), AV_OPT_TYPE_INT, {.i64 = -1}, -1, INT_MAX, VE }, \
1074 { "qp_b_max", "maximum quantization parameter for B frame", \
1075 OFFSET(qp_b_max), AV_OPT_TYPE_INT, {.i64 = -1}, -1, INT_MAX, VE }, \
1076
1077
1078 #define MEDIACODEC_ENCODER_CLASS(name) \
1079 static const AVClass name ## _mediacodec_class = { \
1080 .class_name = #name "_mediacodec", \
1081 .item_name = av_default_item_name, \
1082 .option = name ## _options, \
1083 .version = LIBAVUTIL_VERSION_INT, \
1084 }; \
1085
1086 #define DECLARE_MEDIACODEC_ENCODER(short_name, long_name, codec_id) \
1087 MEDIACODEC_ENCODER_CLASS(short_name) \
1088 const FFCodec ff_ ## short_name ## _mediacodec_encoder = { \
1089 .p.name = #short_name "_mediacodec", \
1090 CODEC_LONG_NAME(long_name " Android MediaCodec encoder"), \
1091 .p.type = AVMEDIA_TYPE_VIDEO, \
1092 .p.id = codec_id, \
1093 .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY | \
1094 AV_CODEC_CAP_HARDWARE | \
1095 AV_CODEC_CAP_ENCODER_FLUSH, \
1096 .priv_data_size = sizeof(MediaCodecEncContext), \
1097 CODEC_PIXFMTS_ARRAY(avc_pix_fmts), \
1098 .color_ranges = AVCOL_RANGE_MPEG | AVCOL_RANGE_JPEG, \
1099 .defaults = mediacodec_defaults, \
1100 .init = mediacodec_init, \
1101 FF_CODEC_RECEIVE_PACKET_CB(mediacodec_encode), \
1102 .close = mediacodec_close, \
1103 .flush = mediacodec_flush, \
1104 .p.priv_class = &short_name ## _mediacodec_class, \
1105 .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, \
1106 .p.wrapper_name = "mediacodec", \
1107 .hw_configs = mediacodec_hw_configs, \
1108 }; \
1109
1110 #if CONFIG_H264_MEDIACODEC_ENCODER
1111
1112 enum MediaCodecAvcLevel {
1113 AVCLevel1 = 0x01,
1114 AVCLevel1b = 0x02,
1115 AVCLevel11 = 0x04,
1116 AVCLevel12 = 0x08,
1117 AVCLevel13 = 0x10,
1118 AVCLevel2 = 0x20,
1119 AVCLevel21 = 0x40,
1120 AVCLevel22 = 0x80,
1121 AVCLevel3 = 0x100,
1122 AVCLevel31 = 0x200,
1123 AVCLevel32 = 0x400,
1124 AVCLevel4 = 0x800,
1125 AVCLevel41 = 0x1000,
1126 AVCLevel42 = 0x2000,
1127 AVCLevel5 = 0x4000,
1128 AVCLevel51 = 0x8000,
1129 AVCLevel52 = 0x10000,
1130 AVCLevel6 = 0x20000,
1131 AVCLevel61 = 0x40000,
1132 AVCLevel62 = 0x80000,
1133 };
1134
1137
1146
1147 { "level", "Specify level",
1170 };
1171
1173
1174 #endif // CONFIG_H264_MEDIACODEC_ENCODER
1175
1176 #if CONFIG_HEVC_MEDIACODEC_ENCODER
1177
1178 enum MediaCodecHevcLevel {
1179 HEVCMainTierLevel1 = 0x1,
1180 HEVCHighTierLevel1 = 0x2,
1181 HEVCMainTierLevel2 = 0x4,
1182 HEVCHighTierLevel2 = 0x8,
1183 HEVCMainTierLevel21 = 0x10,
1184 HEVCHighTierLevel21 = 0x20,
1185 HEVCMainTierLevel3 = 0x40,
1186 HEVCHighTierLevel3 = 0x80,
1187 HEVCMainTierLevel31 = 0x100,
1188 HEVCHighTierLevel31 = 0x200,
1189 HEVCMainTierLevel4 = 0x400,
1190 HEVCHighTierLevel4 = 0x800,
1191 HEVCMainTierLevel41 = 0x1000,
1192 HEVCHighTierLevel41 = 0x2000,
1193 HEVCMainTierLevel5 = 0x4000,
1194 HEVCHighTierLevel5 = 0x8000,
1195 HEVCMainTierLevel51 = 0x10000,
1196 HEVCHighTierLevel51 = 0x20000,
1197 HEVCMainTierLevel52 = 0x40000,
1198 HEVCHighTierLevel52 = 0x80000,
1199 HEVCMainTierLevel6 = 0x100000,
1200 HEVCHighTierLevel6 = 0x200000,
1201 HEVCMainTierLevel61 = 0x400000,
1202 HEVCHighTierLevel61 = 0x800000,
1203 HEVCMainTierLevel62 = 0x1000000,
1204 HEVCHighTierLevel62 = 0x2000000,
1205 };
1206
1209
1212
1213 { "level", "Specify tier and level",
1215 { "m1", "Main tier level 1",
1217 { "h1", "High tier level 1",
1219 { "m2", "Main tier level 2",
1221 { "h2", "High tier level 2",
1223 { "m2.1", "Main tier level 2.1",
1225 { "h2.1", "High tier level 2.1",
1227 { "m3", "Main tier level 3",
1229 { "h3", "High tier level 3",
1231 { "m3.1", "Main tier level 3.1",
1233 { "h3.1", "High tier level 3.1",
1235 { "m4", "Main tier level 4",
1237 { "h4", "High tier level 4",
1239 { "m4.1", "Main tier level 4.1",
1241 { "h4.1", "High tier level 4.1",
1243 { "m5", "Main tier level 5",
1245 { "h5", "High tier level 5",
1247 { "m5.1", "Main tier level 5.1",
1249 { "h5.1", "High tier level 5.1",
1251 { "m5.2", "Main tier level 5.2",
1253 { "h5.2", "High tier level 5.2",
1255 { "m6", "Main tier level 6",
1257 { "h6", "High tier level 6",
1259 { "m6.1", "Main tier level 6.1",
1261 { "h6.1", "High tier level 6.1",
1263 { "m6.2", "Main tier level 6.2",
1265 { "h6.2", "High tier level 6.2",
1268 };
1269
1271
1272 #endif // CONFIG_HEVC_MEDIACODEC_ENCODER
1273
1274 #if CONFIG_VP8_MEDIACODEC_ENCODER
1275
1276 enum MediaCodecVP8Level {
1277 VP8Level_Version0 = 0x01,
1278 VP8Level_Version1 = 0x02,
1279 VP8Level_Version2 = 0x04,
1280 VP8Level_Version3 = 0x08,
1281 };
1282
1283 static const AVOption vp8_options[] = {
1285 { "level", "Specify tier and level",
1287 { "V0", "Level Version 0",
1289 { "V1", "Level Version 1",
1291 { "V2", "Level Version 2",
1293 { "V3", "Level Version 3",
1296 };
1297
1299
1300 #endif // CONFIG_VP8_MEDIACODEC_ENCODER
1301
1302 #if CONFIG_VP9_MEDIACODEC_ENCODER
1303
1304 enum MediaCodecVP9Level {
1305 VP9Level1 = 0x1,
1306 VP9Level11 = 0x2,
1307 VP9Level2 = 0x4,
1308 VP9Level21 = 0x8,
1309 VP9Level3 = 0x10,
1310 VP9Level31 = 0x20,
1311 VP9Level4 = 0x40,
1312 VP9Level41 = 0x80,
1313 VP9Level5 = 0x100,
1314 VP9Level51 = 0x200,
1315 VP9Level52 = 0x400,
1316 VP9Level6 = 0x800,
1317 VP9Level61 = 0x1000,
1318 VP9Level62 = 0x2000,
1319 };
1320
1321 static const AVOption vp9_options[] = {
1323
1328
1329 { "level", "Specify tier and level",
1331 { "1", "Level 1",
1333 { "1.1", "Level 1.1",
1335 { "2", "Level 2",
1337 { "2.1", "Level 2.1",
1339 { "3", "Level 3",
1341 { "3.1", "Level 3.1",
1343 { "4", "Level 4",
1345 { "4.1", "Level 4.1",
1347 { "5", "Level 5",
1349 { "5.1", "Level 5.1",
1351 { "5.2", "Level 5.2",
1353 { "6", "Level 6",
1355 { "6.1", "Level 6.1",
1357 { "6.2", "Level 6.2",
1360 };
1361
1363
1364 #endif // CONFIG_VP9_MEDIACODEC_ENCODER
1365
1366 #if CONFIG_MPEG4_MEDIACODEC_ENCODER
1367
1368 enum MediaCodecMpeg4Level {
1369 MPEG4Level0 = 0x01,
1370 MPEG4Level0b = 0x02,
1371 MPEG4Level1 = 0x04,
1372 MPEG4Level2 = 0x08,
1373 MPEG4Level3 = 0x10,
1374 MPEG4Level3b = 0x18,
1375 MPEG4Level4 = 0x20,
1376 MPEG4Level4a = 0x40,
1377 MPEG4Level5 = 0x80,
1378 MPEG4Level6 = 0x100,
1379 };
1380
1383
1385
1386 { "level", "Specify tier and level",
1388 { "0", "Level 0",
1390 { "0b", "Level 0b",
1392 { "1", "Level 1",
1394 { "2", "Level 2",
1396 { "3", "Level 3",
1398 { "3b", "Level 3b",
1400 { "4", "Level 4",
1402 { "4a", "Level 4a",
1404 { "5", "Level 5",
1406 { "6", "Level 6",
1409 };
1410
1412
1413 #endif // CONFIG_MPEG4_MEDIACODEC_ENCODER
1414
1415 #if CONFIG_AV1_MEDIACODEC_ENCODER
1416
1417 enum MediaCodecAV1Level {
1418 AV1Level2 = 0x1,
1419 AV1Level21 = 0x2,
1420 AV1Level22 = 0x4,
1421 AV1Level23 = 0x8,
1422 AV1Level3 = 0x10,
1423 AV1Level31 = 0x20,
1424 AV1Level32 = 0x40,
1425 AV1Level33 = 0x80,
1426 AV1Level4 = 0x100,
1427 AV1Level41 = 0x200,
1428 AV1Level42 = 0x400,
1429 AV1Level43 = 0x800,
1430 AV1Level5 = 0x1000,
1431 AV1Level51 = 0x2000,
1432 AV1Level52 = 0x4000,
1433 AV1Level53 = 0x8000,
1434 AV1Level6 = 0x10000,
1435 AV1Level61 = 0x20000,
1436 AV1Level62 = 0x40000,
1437 AV1Level63 = 0x80000,
1438 AV1Level7 = 0x100000,
1439 AV1Level71 = 0x200000,
1440 AV1Level72 = 0x400000,
1441 AV1Level73 = 0x800000,
1442 };
1443
1446
1448
1449 { "level", "Specify tier and level",
1451 { "2", "Level 2",
1453 { "2.1", "Level 2.1",
1455 { "2.2", "Level 2.2",
1457 { "2.3", "Level 2.3",
1459 { "3", "Level 3",
1461 { "3.1", "Level 3.1",
1463 { "3.2", "Level 3.2",
1465 { "3.3", "Level 3.3",
1467 { "4", "Level 4",
1469 { "4.1", "Level 4.1",
1471 { "4.2", "Level 4.2",
1473 { "4.3", "Level 4.3",
1475 { "5", "Level 5",
1477 { "5.1", "Level 5.1",
1479 { "5.2", "Level 5.2",
1481 { "5.3", "Level 5.3",
1483 { "6", "Level 6",
1485 { "6.1", "Level 6.1",
1487 { "6.2", "Level 6.2",
1489 { "6.3", "Level 6.3",
1491 { "7", "Level 7",
1493 { "7.1", "Level 7.1",
1495 { "7.2", "Level 7.2",
1497 { "7.3", "Level 7.3",
1500 };
1501
1503
1504 #endif // CONFIG_AV1_MEDIACODEC_ENCODER