1 /*
2 * Copyright 2022 Rockchip Electronics Co. LTD
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #define MODULE_TAG "vepu5xx_common"
18
19 #include <string.h>
20
21 #include "mpp_debug.h"
22 #include "mpp_common.h"
23 #include "vepu5xx_common.h"
24
25 const VepuRgb2YuvCfg vepu_rgb2limit_yuv_cfg_set[] = {
26 /* MPP_BT601_FULL_RGB_TO_LIMIT_YUV */
27 {
28 .color = MPP_FRAME_SPC_RGB, .dst_range = MPP_FRAME_RANGE_UNSPECIFIED,
29 ._2y = {.r_coeff = 66, .g_coeff = 129, .b_coeff = 25, .offset = 16},
30 ._2u = {.r_coeff = -38, .g_coeff = -74, .b_coeff = 112, .offset = 128},
31 ._2v = {.r_coeff = 112, .g_coeff = -94, .b_coeff = -18, .offset = 128},
32 },
33 /* MPP_BT709_FULL_RGB_TO_LIMIT_YUV */
34 {
35 .color = MPP_FRAME_SPC_BT709, .dst_range = MPP_FRAME_RANGE_UNSPECIFIED,
36 ._2y = {.r_coeff = 47, .g_coeff = 157, .b_coeff = 16, .offset = 16},
37 ._2u = {.r_coeff = -26, .g_coeff = -87, .b_coeff = 112, .offset = 128},
38 ._2v = {.r_coeff = 112, .g_coeff = -102, .b_coeff = -10, .offset = 128},
39 },
40 };
41
42 const VepuRgb2YuvCfg vepu_rgb2full_yuv_cfg_set[] = {
43 /* MPP_BT601_FULL_RGB_TO_FULL_YUV */
44 {
45 .color = MPP_FRAME_SPC_RGB, .dst_range = MPP_FRAME_RANGE_JPEG,
46 ._2y = {.r_coeff = 77, .g_coeff = 150, .b_coeff = 29, .offset = 0},
47 ._2u = {.r_coeff = -43, .g_coeff = -85, .b_coeff = 128, .offset = 128},
48 ._2v = {.r_coeff = 128, .g_coeff = -107, .b_coeff = -21, .offset = 128},
49 },
50 /* MPP_BT709_FULL_RGB_TO_FULL_YUV */
51 {
52 .color = MPP_FRAME_SPC_BT709, .dst_range = MPP_FRAME_RANGE_JPEG,
53 ._2y = {.r_coeff = 54, .g_coeff = 183, .b_coeff = 18, .offset = 0},
54 ._2u = {.r_coeff = -29, .g_coeff = -99, .b_coeff = 128, .offset = 128},
55 ._2v = {.r_coeff = 128, .g_coeff = -116, .b_coeff = -12, .offset = 128},
56 },
57 };
58
get_rgb2yuv_cfg(MppFrameColorRange range,MppFrameColorSpace color)59 const VepuRgb2YuvCfg *get_rgb2yuv_cfg(MppFrameColorRange range, MppFrameColorSpace color)
60 {
61 const VepuRgb2YuvCfg *cfg;
62 RK_U32 size;
63 RK_U32 i;
64
65 /* only jpeg full range, others limit range */
66 if (range == MPP_FRAME_RANGE_JPEG) {
67 /* set default cfg BT.601 */
68 cfg = &vepu_rgb2full_yuv_cfg_set[0];
69 size = MPP_ARRAY_ELEMS(vepu_rgb2full_yuv_cfg_set);
70 } else {
71 /* set default cfg BT.601 */
72 cfg = &vepu_rgb2limit_yuv_cfg_set[0];
73 size = MPP_ARRAY_ELEMS(vepu_rgb2limit_yuv_cfg_set);
74 }
75
76 for (i = 0; i < size; i++)
77 if (cfg[i].color == color)
78 return &cfg[i];
79
80 return cfg;
81 }
82
83 const RK_U32 vepu580_540_h264_flat_scl_tab[576] = {
84 /* 0x2200 */
85 0x2fbe3333, 0x2fbe4189, 0x2fbe3333, 0x2fbe4189, 0x2ca42fbe, 0x2ca43c79, 0x2ca42fbe, 0x2ca43c79,
86 0x3c794189, 0x3c7951ec, 0x3c794189, 0x3c7951ec, 0x2ca42fbe, 0x2ca43c79, 0x2ca42fbe, 0x2ca43c79,
87 0x2fbe3333, 0x2fbe4189, 0x2fbe3333, 0x2fbe4189, 0x2ca42fbe, 0x2ca43c79, 0x2ca42fbe, 0x2ca43c79,
88 0x3c794189, 0x3c7951ec, 0x3c794189, 0x3c7951ec, 0x2ca42fbe, 0x2ca43c79, 0x2ca42fbe, 0x2ca43c79,
89 0x2b322e8c, 0x2b323a84, 0x2b322e8c, 0x2b323a84, 0x2a4a2b32, 0x2a4a37d2, 0x2a4a2b32, 0x2a4a37d2,
90 0x37d23a84, 0x37d24ae6, 0x37d23a84, 0x37d24ae6, 0x2a4a2b32, 0x2a4a37d2, 0x2a4a2b32, 0x2a4a37d2,
91 0x2b322e8c, 0x2b323a84, 0x2b322e8c, 0x2b323a84, 0x2a4a2b32, 0x2a4a37d2, 0x2a4a2b32, 0x2a4a37d2,
92 0x37d23a84, 0x37d24ae6, 0x37d23a84, 0x37d24ae6, 0x2a4a2b32, 0x2a4a37d2, 0x2a4a2b32, 0x2a4a37d2,
93 0x25cb2762, 0x25cb31a6, 0x25cb2762, 0x25cb31a6, 0x22ef25cb, 0x22ef2ed1, 0x22ef25cb, 0x22ef2ed1,
94 0x2ed131a6, 0x2ed13e6a, 0x2ed131a6, 0x2ed13e6a, 0x22ef25cb, 0x22ef2ed1, 0x22ef25cb, 0x22ef2ed1,
95 0x25cb2762, 0x25cb31a6, 0x25cb2762, 0x25cb31a6, 0x22ef25cb, 0x22ef2ed1, 0x22ef25cb, 0x22ef2ed1,
96 0x2ed131a6, 0x2ed13e6a, 0x2ed131a6, 0x2ed13e6a, 0x22ef25cb, 0x22ef2ed1, 0x22ef25cb, 0x22ef2ed1,
97 0x22e32492, 0x22e32ed0, 0x22e32492, 0x22e32ed0, 0x202422e3, 0x20242bfb, 0x202422e3, 0x20242bfb,
98 0x2bfb2ed0, 0x2bfb3a41, 0x2bfb2ed0, 0x2bfb3a41, 0x202422e3, 0x20242bfb, 0x202422e3, 0x20242bfb,
99 0x22e32492, 0x22e32ed0, 0x22e32492, 0x22e32ed0, 0x202422e3, 0x20242bfb, 0x202422e3, 0x20242bfb,
100 0x2bfb2ed0, 0x2bfb3a41, 0x2bfb2ed0, 0x2bfb3a41, 0x202422e3, 0x20242bfb, 0x202422e3, 0x20242bfb,
101 0x1e3c2000, 0x1e3c28f6, 0x1e3c2000, 0x1e3c28f6, 0x1cb21e3c, 0x1cb22631, 0x1cb21e3c, 0x1cb22631,
102 0x263128f6, 0x26313367, 0x263128f6, 0x26313367, 0x1cb21e3c, 0x1cb22631, 0x1cb21e3c, 0x1cb22631,
103 0x1e3c2000, 0x1e3c28f6, 0x1e3c2000, 0x1e3c28f6, 0x1cb21e3c, 0x1cb22631, 0x1cb21e3c, 0x1cb22631,
104 0x263128f6, 0x26313367, 0x263128f6, 0x26313367, 0x1cb21e3c, 0x1cb22631, 0x1cb21e3c, 0x1cb22631,
105 0x1aae1c72, 0x1aae239e, 0x1aae1c72, 0x1aae239e, 0x191c1aae, 0x191c21c0, 0x191c1aae, 0x191c21c0,
106 0x21c0239e, 0x21c02d32, 0x21c0239e, 0x21c02d32, 0x191c1aae, 0x191c21c0, 0x191c1aae, 0x191c21c0,
107 0x1aae1c72, 0x1aae239e, 0x1aae1c72, 0x1aae239e, 0x191c1aae, 0x191c21c0, 0x191c1aae, 0x191c21c0,
108 0x21c0239e, 0x21c02d32, 0x21c0239e, 0x21c02d32, 0x191c1aae, 0x191c21c0, 0x191c1aae, 0x191c21c0,
109 0x00be0033, 0x00be0089, 0x00be0033, 0x00be0089, 0x00a400be, 0x00a40079, 0x00a400be, 0x00a40079,
110 0x00790089, 0x007900ec, 0x00790089, 0x007900ec, 0x00a400be, 0x00a40079, 0x00a400be, 0x00a40079,
111 0x00be0033, 0x00be0089, 0x00be0033, 0x00be0089, 0x00a400be, 0x00a40079, 0x00a400be, 0x00a40079,
112 0x00790089, 0x007900ec, 0x00790089, 0x007900ec, 0x00a400be, 0x00a40079, 0x00a400be, 0x00a40079,
113 0x0032008c, 0x00320084, 0x0032008c, 0x00320084, 0x004a0032, 0x004a00d2, 0x004a0032, 0x004a00d2,
114 0x00d20084, 0x00d200e6, 0x00d20084, 0x00d200e6, 0x004a0032, 0x004a00d2, 0x004a0032, 0x004a00d2,
115 0x0032008c, 0x00320084, 0x0032008c, 0x00320084, 0x004a0032, 0x004a00d2, 0x004a0032, 0x004a00d2,
116 0x00d20084, 0x00d200e6, 0x00d20084, 0x00d200e6, 0x004a0032, 0x004a00d2, 0x004a0032, 0x004a00d2,
117 0x00cb0062, 0x00cb00a6, 0x00cb0062, 0x00cb00a6, 0x00ef00cb, 0x00ef00d1, 0x00ef00cb, 0x00ef00d1,
118 0x00d100a6, 0x00d1006a, 0x00d100a6, 0x00d1006a, 0x00ef00cb, 0x00ef00d1, 0x00ef00cb, 0x00ef00d1,
119 0x00cb0062, 0x00cb00a6, 0x00cb0062, 0x00cb00a6, 0x00ef00cb, 0x00ef00d1, 0x00ef00cb, 0x00ef00d1,
120 0x00d100a6, 0x00d1006a, 0x00d100a6, 0x00d1006a, 0x00ef00cb, 0x00ef00d1, 0x00ef00cb, 0x00ef00d1,
121 0x00e30092, 0x00e300d0, 0x00e30092, 0x00e300d0, 0x002400e3, 0x002400fb, 0x002400e3, 0x002400fb,
122 0x00fb00d0, 0x00fb0041, 0x00fb00d0, 0x00fb0041, 0x002400e3, 0x002400fb, 0x002400e3, 0x002400fb,
123 0x00e30092, 0x00e300d0, 0x00e30092, 0x00e300d0, 0x002400e3, 0x002400fb, 0x002400e3, 0x002400fb,
124 0x00fb00d0, 0x00fb0041, 0x00fb00d0, 0x00fb0041, 0x002400e3, 0x002400fb, 0x002400e3, 0x002400fb,
125 0x003c0000, 0x003c00f6, 0x003c0000, 0x003c00f6, 0x00b2003c, 0x00b20031, 0x00b2003c, 0x00b20031,
126 0x003100f6, 0x00310067, 0x003100f6, 0x00310067, 0x00b2003c, 0x00b20031, 0x00b2003c, 0x00b20031,
127 0x003c0000, 0x003c00f6, 0x003c0000, 0x003c00f6, 0x00b2003c, 0x00b20031, 0x00b2003c, 0x00b20031,
128 0x003100f6, 0x00310067, 0x003100f6, 0x00310067, 0x00b2003c, 0x00b20031, 0x00b2003c, 0x00b20031,
129 0x00ae0072, 0x00ae009e, 0x00ae0072, 0x00ae009e, 0x001c00ae, 0x001c00c0, 0x001c00ae, 0x001c00c0,
130 0x00c0009e, 0x00c00032, 0x00c0009e, 0x00c00032, 0x001c00ae, 0x001c00c0, 0x001c00ae, 0x001c00c0,
131 0x00ae0072, 0x00ae009e, 0x00ae0072, 0x00ae009e, 0x001c00ae, 0x001c00c0, 0x001c00ae, 0x001c00c0,
132 0x00c0009e, 0x00c00032, 0x00c0009e, 0x00c00032, 0x001c00ae, 0x001c00c0, 0x001c00ae, 0x001c00c0,
133 0x002f0033, 0x002f0041, 0x002f0033, 0x002f0041, 0x002c002f, 0x002c003c, 0x002c002f, 0x002c003c,
134 0x003c0041, 0x003c0051, 0x003c0041, 0x003c0051, 0x002c002f, 0x002c003c, 0x002c002f, 0x002c003c,
135 0x002f0033, 0x002f0041, 0x002f0033, 0x002f0041, 0x002c002f, 0x002c003c, 0x002c002f, 0x002c003c,
136 0x003c0041, 0x003c0051, 0x003c0041, 0x003c0051, 0x002c002f, 0x002c003c, 0x002c002f, 0x002c003c,
137 0x002b002e, 0x002b003a, 0x002b002e, 0x002b003a, 0x002a002b, 0x002a0037, 0x002a002b, 0x002a0037,
138 0x0037003a, 0x0037004a, 0x0037003a, 0x0037004a, 0x002a002b, 0x002a0037, 0x002a002b, 0x002a0037,
139 0x002b002e, 0x002b003a, 0x002b002e, 0x002b003a, 0x002a002b, 0x002a0037, 0x002a002b, 0x002a0037,
140 0x0037003a, 0x0037004a, 0x0037003a, 0x0037004a, 0x002a002b, 0x002a0037, 0x002a002b, 0x002a0037,
141 0x01250127, 0x01250131, 0x01250127, 0x01250131, 0x01220125, 0x0122012e, 0x01220125, 0x0122012e,
142 0x012e0131, 0x012e013e, 0x012e0131, 0x012e013e, 0x01220125, 0x0122012e, 0x01220125, 0x0122012e,
143 0x01250127, 0x01250131, 0x01250127, 0x01250131, 0x01220125, 0x0122012e, 0x01220125, 0x0122012e,
144 0x012e0131, 0x012e013e, 0x012e0131, 0x012e013e, 0x01220125, 0x0122012e, 0x01220125, 0x0122012e,
145 0x01220124, 0x0122012e, 0x01220124, 0x0122012e, 0x01200122, 0x0120012b, 0x01200122, 0x0120012b,
146 0x012b012e, 0x012b013a, 0x012b012e, 0x012b013a, 0x01200122, 0x0120012b, 0x01200122, 0x0120012b,
147 0x01220124, 0x0122012e, 0x01220124, 0x0122012e, 0x01200122, 0x0120012b, 0x01200122, 0x0120012b,
148 0x012b012e, 0x012b013a, 0x012b012e, 0x012b013a, 0x01200122, 0x0120012b, 0x01200122, 0x0120012b,
149 0x001e0020, 0x001e0028, 0x001e0020, 0x001e0028, 0x001c001e, 0x001c0026, 0x001c001e, 0x001c0026,
150 0x00260028, 0x00260033, 0x00260028, 0x00260033, 0x001c001e, 0x001c0026, 0x001c001e, 0x001c0026,
151 0x001e0020, 0x001e0028, 0x001e0020, 0x001e0028, 0x001c001e, 0x001c0026, 0x001c001e, 0x001c0026,
152 0x00260028, 0x00260033, 0x00260028, 0x00260033, 0x001c001e, 0x001c0026, 0x001c001e, 0x001c0026,
153 0x001a001c, 0x001a0023, 0x001a001c, 0x001a0023, 0x0019001a, 0x00190021, 0x0019001a, 0x00190021,
154 0x00210023, 0x0021002d, 0x00210023, 0x0021002d, 0x0019001a, 0x00190021, 0x0019001a, 0x00190021,
155 0x001a001c, 0x001a0023, 0x001a001c, 0x001a0023, 0x0019001a, 0x00190021, 0x0019001a, 0x00190021,
156 0x00210023, 0x0021002d, 0x00210023, 0x0021002d, 0x0019001a, 0x00190021, 0x0019001a, 0x00190021,
157 };
158
159 const RK_U32 klut_weight[24] = {
160 0x50800080, 0x00330000, 0xA1000100, 0x00660000, 0x42000200, 0x00CC0001,
161 0x84000400, 0x01980002, 0x08000800, 0x03300005, 0x10001000, 0x0660000A,
162 0x20002000, 0x0CC00014, 0x40004000, 0x19800028, 0x80008000, 0x33000050,
163 0x00010000, 0x660000A1, 0x00020000, 0xCC000142, 0xFF83FFFF, 0x000001FF
164 };
165
166 const RK_U32 lamd_satd_qp[52] = {
167 0x00000183, 0x000001b2, 0x000001e7, 0x00000223, 0x00000266, 0x000002b1, 0x00000305, 0x00000364,
168 0x000003ce, 0x00000445, 0x000004cb, 0x00000562, 0x0000060a, 0x000006c8, 0x0000079c, 0x0000088b,
169 0x00000996, 0x00000ac3, 0x00000c14, 0x00000d8f, 0x00000f38, 0x00001115, 0x0000132d, 0x00001586,
170 0x00001829, 0x00001b1e, 0x00001e70, 0x0000222b, 0x0000265a, 0x00002b0c, 0x00003052, 0x0000363c,
171 0x00003ce1, 0x00004455, 0x00004cb4, 0x00005618, 0x000060a3, 0x00006c79, 0x000079c2, 0x000088ab,
172 0x00009967, 0x0000ac30, 0x0000c147, 0x0000d8f2, 0x0000f383, 0x00011155, 0x000132ce, 0x00015861,
173 0x0001828d, 0x0001b1e4, 0x0001e706, 0x000222ab
174 };
175
176 const RK_U32 lamd_moda_qp[52] = {
177 0x00000049, 0x0000005c, 0x00000074, 0x00000092, 0x000000b8, 0x000000e8, 0x00000124, 0x00000170,
178 0x000001cf, 0x00000248, 0x000002df, 0x0000039f, 0x0000048f, 0x000005bf, 0x0000073d, 0x0000091f,
179 0x00000b7e, 0x00000e7a, 0x0000123d, 0x000016fb, 0x00001cf4, 0x0000247b, 0x00002df6, 0x000039e9,
180 0x000048f6, 0x00005bed, 0x000073d1, 0x000091ec, 0x0000b7d9, 0x0000e7a2, 0x000123d7, 0x00016fb2,
181 0x0001cf44, 0x000247ae, 0x0002df64, 0x00039e89, 0x00048f5c, 0x0005bec8, 0x00073d12, 0x00091eb8,
182 0x000b7d90, 0x000e7a23, 0x00123d71, 0x0016fb20, 0x001cf446, 0x00247ae1, 0x002df640, 0x0039e88c,
183 0x0048f5c3, 0x005bec81, 0x0073d119, 0x0091eb85
184 };
185
186 const RK_U32 lamd_modb_qp[52] = {
187 0x00000070, 0x00000089, 0x000000b0, 0x000000e0, 0x00000112, 0x00000160, 0x000001c0, 0x00000224,
188 0x000002c0, 0x00000380, 0x00000448, 0x00000580, 0x00000700, 0x00000890, 0x00000b00, 0x00000e00,
189 0x00001120, 0x00001600, 0x00001c00, 0x00002240, 0x00002c00, 0x00003800, 0x00004480, 0x00005800,
190 0x00007000, 0x00008900, 0x0000b000, 0x0000e000, 0x00011200, 0x00016000, 0x0001c000, 0x00022400,
191 0x0002c000, 0x00038000, 0x00044800, 0x00058000, 0x00070000, 0x00089000, 0x000b0000, 0x000e0000,
192 0x00112000, 0x00160000, 0x001c0000, 0x00224000, 0x002c0000, 0x00380000, 0x00448000, 0x00580000,
193 0x00700000, 0x00890000, 0x00b00000, 0x00e00000
194 };
195
196 const RK_U32 lamd_satd_qp_510[52] = {
197 0x00000243, 0x00000289, 0x000002DA, 0x00000333, 0x00000397, 0x00000408, 0x00000487, 0x00000514,
198 0x000005B5, 0x00000667, 0x000007C9, 0x000008BD, 0x00000B52, 0x00000CB5, 0x00000E44, 0x00001002,
199 0x000011F9, 0x0000142D, 0x00001523, 0x000017BA, 0x00001AA2, 0x0000199F, 0x00001CC2, 0x00002049,
200 0x0000243C, 0x000032D8, 0x00002DA8, 0x0000333F, 0x00003985, 0x00004092, 0x00004879, 0x000065B0,
201 0x000062EC, 0x000088AA, 0x00007CA2, 0x0000AC30, 0x00009D08, 0x0000B043, 0x0000C5D9, 0x0000EF29,
202 0x00010C74, 0x00012D54, 0x000121E9, 0x00014569, 0x00018BB4, 0x0001BC2A, 0x0001F28E, 0x00020490,
203 0x000243D3, 0x00028AD4, 0x0002DA89, 0x000333FF,
204 };
205
206 static const RK_S32 zeros[9] = { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
207
208 static VepuFmtCfg vepu5xx_yuv_cfg[MPP_FMT_YUV_BUTT] = {
209 { /* MPP_FMT_YUV420SP */
210 .format = VEPU5xx_FMT_YUV420SP,
211 .alpha_swap = 0,
212 .rbuv_swap = 0,
213 .src_range = 0,
214 .src_endian = 0,
215 .weight = zeros,
216 .offset = zeros,
217 },
218 { /* MPP_FMT_YUV420SP_10BIT */
219 .format = VEPU5xx_FMT_BUTT,
220 .alpha_swap = 0,
221 .rbuv_swap = 0,
222 .src_range = 0,
223 .src_endian = 0,
224 .weight = zeros,
225 .offset = zeros,
226 },
227 { /* MPP_FMT_YUV422SP */
228 .format = VEPU5xx_FMT_YUV422SP,
229 .alpha_swap = 0,
230 .rbuv_swap = 0,
231 .src_range = 0,
232 .src_endian = 0,
233 .weight = zeros,
234 .offset = zeros,
235 },
236 { /* MPP_FMT_YUV422SP_10BIT */
237 .format = VEPU5xx_FMT_BUTT,
238 .alpha_swap = 0,
239 .rbuv_swap = 0,
240 .src_range = 0,
241 .src_endian = 0,
242 .weight = zeros,
243 .offset = zeros,
244 },
245 { /* MPP_FMT_YUV420P */
246 .format = VEPU5xx_FMT_YUV420P,
247 .alpha_swap = 0,
248 .rbuv_swap = 0,
249 .src_range = 0,
250 .src_endian = 0,
251 .weight = zeros,
252 .offset = zeros,
253 },
254 { /* MPP_FMT_YUV420SP_VU */
255 .format = VEPU5xx_FMT_YUV420SP,
256 .alpha_swap = 0,
257 .rbuv_swap = 1,
258 .src_range = 0,
259 .src_endian = 0,
260 .weight = zeros,
261 .offset = zeros,
262 },
263 { /* MPP_FMT_YUV422P */
264 .format = VEPU5xx_FMT_YUV422P,
265 .alpha_swap = 0,
266 .rbuv_swap = 0,
267 .src_range = 0,
268 .src_endian = 0,
269 .weight = zeros,
270 .offset = zeros,
271 },
272 { /* MPP_FMT_YUV422SP_VU */
273 .format = VEPU5xx_FMT_YUV422SP,
274 .alpha_swap = 0,
275 .rbuv_swap = 0,
276 .src_range = 0,
277 .src_endian = 0,
278 .weight = zeros,
279 .offset = zeros,
280 },
281 { /* MPP_FMT_YUV422_YUYV */
282 .format = VEPU5xx_FMT_YUYV422,
283 .alpha_swap = 0,
284 .rbuv_swap = 0,
285 .src_range = 0,
286 .src_endian = 0,
287 .weight = zeros,
288 .offset = zeros,
289 },
290 { /* MPP_FMT_YUV422_YVYU */
291 .format = VEPU5xx_FMT_YUYV422,
292 .alpha_swap = 0,
293 .rbuv_swap = 1,
294 .src_range = 0,
295 .src_endian = 0,
296 .weight = zeros,
297 .offset = zeros,
298 },
299 { /* MPP_FMT_YUV422_UYVY */
300 .format = VEPU5xx_FMT_UYVY422,
301 .alpha_swap = 0,
302 .rbuv_swap = 0,
303 .src_range = 0,
304 .src_endian = 0,
305 .weight = zeros,
306 .offset = zeros,
307 },
308 { /* MPP_FMT_YUV422_VYUY */
309 .format = VEPU5xx_FMT_UYVY422,
310 .alpha_swap = 0,
311 .rbuv_swap = 1,
312 .src_range = 0,
313 .src_endian = 0,
314 .weight = zeros,
315 .offset = zeros,
316 },
317 { /* MPP_FMT_YUV400 */
318 .format = VEPU5xx_FMT_YUV400,
319 .alpha_swap = 0,
320 .rbuv_swap = 0,
321 .src_range = 0,
322 .src_endian = 0,
323 .weight = zeros,
324 .offset = zeros,
325 },
326 { /* MPP_FMT_YUV440SP */
327 .format = VEPU5xx_FMT_BUTT,
328 .alpha_swap = 0,
329 .rbuv_swap = 0,
330 .src_range = 0,
331 .src_endian = 0,
332 .weight = zeros,
333 .offset = zeros,
334 },
335 { /* MPP_FMT_YUV411SP */
336 .format = VEPU5xx_FMT_BUTT,
337 .alpha_swap = 0,
338 .rbuv_swap = 0,
339 .src_range = 0,
340 .src_endian = 0,
341 .weight = zeros,
342 .offset = zeros,
343 },
344 { /* MPP_FMT_YUV444SP */
345 .format = VEPU5xx_FMT_YUV444SP,
346 .alpha_swap = 0,
347 .rbuv_swap = 0,
348 .src_range = 0,
349 .src_endian = 0,
350 .weight = zeros,
351 .offset = zeros,
352 },
353
354 { /* MPP_FMT_YUV444P */
355 .format = VEPU5xx_FMT_YUV444P,
356 .alpha_swap = 0,
357 .rbuv_swap = 1,
358 .src_range = 0,
359 .src_endian = 0,
360 .weight = zeros,
361 .offset = zeros,
362 },
363
364 { /* MPP_FMT_YUV444SP_10BIT */
365 .format = VEPU5xx_FMT_BUTT,
366 .alpha_swap = 0,
367 .rbuv_swap = 0,
368 .src_range = 0,
369 .src_endian = 0,
370 .weight = zeros,
371 .offset = zeros,
372 },
373
374 { /* MPP_FMT_AYUV2BPP */
375 .format = VEPU5xx_FMT_AYUV2BPP,
376 .alpha_swap = 0,
377 .rbuv_swap = 0,
378 .src_range = 0,
379 .src_endian = 0,
380 .weight = zeros,
381 .offset = zeros,
382 },
383
384 { /* MPP_FMT_AYUV1BPP */
385 .format = VEPU5xx_FMT_AYUV1BPP,
386 .alpha_swap = 0,
387 .rbuv_swap = 0,
388 .src_range = 0,
389 .src_endian = 0,
390 .weight = zeros,
391 .offset = zeros,
392 },
393 };
394
395 static VepuFmtCfg vepu5xx_rgb_cfg[MPP_FMT_RGB_BUTT - MPP_FRAME_FMT_RGB] = {
396 { /* MPP_FMT_RGB565 */
397 .format = VEPU5xx_FMT_BGR565,
398 .alpha_swap = 0,
399 .rbuv_swap = 1,
400 .src_range = 0,
401 .src_endian = 1,
402 .weight = zeros,
403 .offset = zeros,
404 },
405 { /* MPP_FMT_BGR565 */
406 .format = VEPU5xx_FMT_BGR565,
407 .alpha_swap = 0,
408 .rbuv_swap = 0,
409 .src_range = 0,
410 .src_endian = 1,
411 .weight = zeros,
412 .offset = zeros,
413 },
414 { /* MPP_FMT_RGB555 */
415 .format = VEPU5xx_FMT_BUTT,
416 .alpha_swap = 0,
417 .rbuv_swap = 0,
418 .src_range = 0,
419 .src_endian = 0,
420 .weight = zeros,
421 .offset = zeros,
422 },
423 { /* MPP_FMT_BGR555 */
424 .format = VEPU5xx_FMT_BUTT,
425 .alpha_swap = 0,
426 .rbuv_swap = 0,
427 .src_range = 0,
428 .src_endian = 0,
429 .weight = zeros,
430 .offset = zeros,
431 },
432 { /* MPP_FMT_RGB444 */
433 .format = VEPU5xx_FMT_BUTT,
434 .alpha_swap = 0,
435 .rbuv_swap = 0,
436 .src_range = 0,
437 .src_endian = 0,
438 .weight = zeros,
439 .offset = zeros,
440 },
441 { /* MPP_FMT_BGR444 */
442 .format = VEPU5xx_FMT_BUTT,
443 .alpha_swap = 0,
444 .rbuv_swap = 0,
445 .src_range = 0,
446 .src_endian = 0,
447 .weight = zeros,
448 .offset = zeros,
449 },
450 { /* MPP_FMT_RGB888 */
451 .format = VEPU5xx_FMT_BGR888,
452 .alpha_swap = 0,
453 .rbuv_swap = 0,
454 .src_range = 0,
455 .src_endian = 0,
456 .weight = zeros,
457 .offset = zeros,
458 },
459 { /* MPP_FMT_BGR888 */
460 .format = VEPU5xx_FMT_BGR888,
461 .alpha_swap = 0,
462 .rbuv_swap = 1,
463 .src_range = 0,
464 .src_endian = 0,
465 .weight = zeros,
466 .offset = zeros,
467 },
468 { /* MPP_FMT_RGB101010 */
469 .format = VEPU5xx_FMT_BUTT,
470 .alpha_swap = 0,
471 .rbuv_swap = 0,
472 .src_range = 0,
473 .src_endian = 0,
474 .weight = zeros,
475 .offset = zeros,
476 },
477 { /* MPP_FMT_BGR101010 */
478 .format = VEPU5xx_FMT_BUTT,
479 .alpha_swap = 0,
480 .rbuv_swap = 0,
481 .src_range = 0,
482 .src_endian = 0,
483 .weight = zeros,
484 .offset = zeros,
485 },
486 { /* MPP_FMT_ARGB8888 */
487 .format = VEPU5xx_FMT_BGRA8888,
488 .alpha_swap = 1,
489 .rbuv_swap = 1,
490 .src_range = 0,
491 .src_endian = 0,
492 .weight = zeros,
493 .offset = zeros,
494 },
495 { /* MPP_FMT_ABGR8888 */
496 .format = VEPU5xx_FMT_BGRA8888,
497 .alpha_swap = 1,
498 .rbuv_swap = 0,
499 .src_range = 0,
500 .src_endian = 0,
501 .weight = zeros,
502 .offset = zeros,
503 },
504 { /* MPP_FMT_BGRA8888 */
505 .format = VEPU5xx_FMT_BGRA8888,
506 .alpha_swap = 0,
507 .rbuv_swap = 0,
508 .src_range = 0,
509 .src_endian = 0,
510 .weight = zeros,
511 .offset = zeros,
512 },
513 { /* MPP_FMT_RGBA8888 */
514 .format = VEPU5xx_FMT_BGRA8888,
515 .alpha_swap = 0,
516 .rbuv_swap = 1,
517 .src_endian = 0,
518 .src_range = 0,
519 .weight = zeros,
520 .offset = zeros,
521 },
522 { /* MPP_FMT_ARGB4444 */
523 .format = VEPU5xx_FMT_ARGB4444,
524 .alpha_swap = 0,
525 .rbuv_swap = 1,
526 .src_endian = 0,
527 .src_range = 0,
528 .weight = zeros,
529 .offset = zeros,
530 },
531 { /* MPP_FMT_ARGB1555 */
532 .format = VEPU5xx_FMT_ARGB1555,
533 .alpha_swap = 0,
534 .rbuv_swap = 1,
535 .src_endian = 0,
536 .src_range = 0,
537 .weight = zeros,
538 .offset = zeros,
539 },
540 };
541
copy2osd2(MppEncOSDData2 * dst,MppEncOSDData * src1,MppEncOSDData2 * src2)542 MPP_RET copy2osd2(MppEncOSDData2* dst, MppEncOSDData *src1, MppEncOSDData2 *src2)
543 {
544 MPP_RET ret = MPP_OK;
545 RK_U32 i = 0;
546
547 if (src1) {
548 dst->num_region = src1->num_region;
549 for (i = 0; i < src1->num_region; i++) {
550 dst->region[i].enable = src1->region[i].enable;
551 dst->region[i].inverse = src1->region[i].inverse;
552 dst->region[i].start_mb_x = src1->region[i].start_mb_x;
553 dst->region[i].start_mb_y = src1->region[i].start_mb_y;
554 dst->region[i].num_mb_x = src1->region[i].num_mb_x;
555 dst->region[i].num_mb_y = src1->region[i].num_mb_y;
556 dst->region[i].buf_offset = src1->region[i].buf_offset;
557 dst->region[i].buf = src1->buf;
558 }
559 ret = MPP_OK;
560 } else if (src2) {
561 memcpy(dst, src2, sizeof(MppEncOSDData2));
562 ret = MPP_OK;
563 } else {
564 ret = MPP_NOK;
565 }
566 return ret;
567 }
568
vepu5xx_set_fmt(VepuFmtCfg * cfg,MppFrameFormat format)569 MPP_RET vepu5xx_set_fmt(VepuFmtCfg * cfg, MppFrameFormat format)
570 {
571 VepuFmtCfg *fmt = NULL;
572 MPP_RET ret = MPP_OK;
573
574 format &= MPP_FRAME_FMT_MASK;
575
576 if (MPP_FRAME_FMT_IS_YUV(format))
577 fmt = &vepu5xx_yuv_cfg[format - MPP_FRAME_FMT_YUV];
578 else if (MPP_FRAME_FMT_IS_RGB(format))
579 fmt = &vepu5xx_rgb_cfg[format - MPP_FRAME_FMT_RGB];
580 else {
581 memset(cfg, 0, sizeof(*cfg));
582 cfg->format = VEPU5xx_FMT_BUTT;
583 }
584
585 if (fmt && fmt->format != VEPU5xx_FMT_BUTT)
586 memcpy(cfg, fmt, sizeof(*cfg));
587 else {
588 mpp_err_f("unsupport frame format %x\n", format);
589 cfg->format = VEPU5xx_FMT_BUTT;
590 ret = MPP_NOK;
591 }
592
593 return ret;
594 }