xref: /rockchip-linux_mpp/mpp/hal/rkenc/common/vepu5xx_common.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
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 }