xref: /rockchip-linux_mpp/utils/osd3_test.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /* SPDX-License-Identifier: Apache-2.0 */
2*437bfbebSnyanmisaka /*
3*437bfbebSnyanmisaka  * Copyright (c) 2025 Rockchip Electronics Co., Ltd.
4*437bfbebSnyanmisaka  */
5*437bfbebSnyanmisaka 
6*437bfbebSnyanmisaka #define MODULE_TAG "OSD3_TEST"
7*437bfbebSnyanmisaka 
8*437bfbebSnyanmisaka #include "osd3_test.h"
9*437bfbebSnyanmisaka #include "mpp_common.h"
10*437bfbebSnyanmisaka #include "kmpp_buffer.h"
11*437bfbebSnyanmisaka 
12*437bfbebSnyanmisaka /**
13*437bfbebSnyanmisaka  * @brief Generate horizontal SMPTE test pattern in ARGB inteleaved format.
14*437bfbebSnyanmisaka  * Test pattern bar color:
15*437bfbebSnyanmisaka  *  {255, 255, 255},    // White
16*437bfbebSnyanmisaka  *  {254, 255, 0},      // Yelow
17*437bfbebSnyanmisaka  *  {0, 254, 255},      // Cyan
18*437bfbebSnyanmisaka  *  {255, 0, 0},        // Red
19*437bfbebSnyanmisaka  *  {0, 255, 0},        // Green
20*437bfbebSnyanmisaka  *  {0, 0, 255},        // Blue
21*437bfbebSnyanmisaka  *  {191, 191, 191},    // 75% White
22*437bfbebSnyanmisaka  *  {0, 0, 0,}          // Black
23*437bfbebSnyanmisaka  *  TODO Add RGB to YUV translation
24*437bfbebSnyanmisaka  *
25*437bfbebSnyanmisaka  * @param dst buffer should be at the size of (bar_width * bar_height * 8 * 4)
26*437bfbebSnyanmisaka  * @param bar_width each bar width
27*437bfbebSnyanmisaka  * @param bar_heigt each bar height
28*437bfbebSnyanmisaka  */
osd3_gen_smpte_bar_argb(RK_U8 ** dst)29*437bfbebSnyanmisaka MPP_RET osd3_gen_smpte_bar_argb(RK_U8 **dst)
30*437bfbebSnyanmisaka {
31*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
32*437bfbebSnyanmisaka     RK_U32 i, j, k = 0;
33*437bfbebSnyanmisaka     FILE *fp = NULL;
34*437bfbebSnyanmisaka     RK_U32 bar_width = OSD_PATTERN_WIDTH;
35*437bfbebSnyanmisaka     RK_U32 bar_height = OSD_PATTERN_HEIGHT / SMPTE_BAR_CNT;
36*437bfbebSnyanmisaka     RK_U8 smpte_bar[8][3] = {
37*437bfbebSnyanmisaka         {255, 255, 255},    // White
38*437bfbebSnyanmisaka         {254, 255, 0},      // Yelow
39*437bfbebSnyanmisaka         {0, 254, 255},      // Cyan
40*437bfbebSnyanmisaka         {255, 0, 0},        // Red
41*437bfbebSnyanmisaka         {0, 255, 0},        // Green
42*437bfbebSnyanmisaka         {0, 0, 255},        // Blue
43*437bfbebSnyanmisaka         {191, 191, 191},    // 75% White
44*437bfbebSnyanmisaka         {0, 0, 0,}          // Black
45*437bfbebSnyanmisaka     };
46*437bfbebSnyanmisaka     RK_U8 *base = malloc(bar_width * bar_height * SMPTE_BAR_CNT * 4);
47*437bfbebSnyanmisaka 
48*437bfbebSnyanmisaka     *dst = base;
49*437bfbebSnyanmisaka     fp = fopen("/userdata/wind_ABGR8888.ABGR8888", "rb");
50*437bfbebSnyanmisaka     if (!fp) {
51*437bfbebSnyanmisaka         for (k = 0; k < SMPTE_BAR_CNT; k++) {
52*437bfbebSnyanmisaka             for (j = 0; j < bar_height; j++) {
53*437bfbebSnyanmisaka                 for (i = 0; i < bar_width; i++) {
54*437bfbebSnyanmisaka                     base[i * 4] = 0xff;
55*437bfbebSnyanmisaka                     base[i * 4 + 1] = smpte_bar[k][0];
56*437bfbebSnyanmisaka                     base[i * 4 + 2] = smpte_bar[k][1];
57*437bfbebSnyanmisaka                     base[i * 4 + 3] = smpte_bar[k][2];
58*437bfbebSnyanmisaka                 }
59*437bfbebSnyanmisaka                 base += bar_width * 4;
60*437bfbebSnyanmisaka             }
61*437bfbebSnyanmisaka         }
62*437bfbebSnyanmisaka     } else {
63*437bfbebSnyanmisaka         size_t read_size = OSD_PATTERN_WIDTH * OSD_PATTERN_HEIGHT * 4;
64*437bfbebSnyanmisaka         size_t fp_size;
65*437bfbebSnyanmisaka 
66*437bfbebSnyanmisaka         fp_size = fread(base, 1, read_size, fp);
67*437bfbebSnyanmisaka         if (fp_size != read_size) {
68*437bfbebSnyanmisaka             mpp_err("fread failed, read_size: %zu, fp_size: %zu", read_size, fp_size);
69*437bfbebSnyanmisaka             free(base);
70*437bfbebSnyanmisaka             *dst = NULL;
71*437bfbebSnyanmisaka             ret = MPP_NOK;
72*437bfbebSnyanmisaka         }
73*437bfbebSnyanmisaka         fclose(fp);
74*437bfbebSnyanmisaka     }
75*437bfbebSnyanmisaka 
76*437bfbebSnyanmisaka     return ret;
77*437bfbebSnyanmisaka }
78*437bfbebSnyanmisaka 
translate_argb(RK_U8 * src,RK_U8 * dst,RK_U32 width,RK_U32 height,RK_U32 fmt_idx,MppEncOSDRegion3 * cfg)79*437bfbebSnyanmisaka static MPP_RET translate_argb(RK_U8 *src, RK_U8 *dst, RK_U32 width, RK_U32 height,
80*437bfbebSnyanmisaka                               RK_U32 fmt_idx, MppEncOSDRegion3 *cfg)
81*437bfbebSnyanmisaka {
82*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
83*437bfbebSnyanmisaka     RK_U32 i = 0;
84*437bfbebSnyanmisaka     RK_U32 j = 0;
85*437bfbebSnyanmisaka     RK_U16 *tmp_u16 = NULL;
86*437bfbebSnyanmisaka 
87*437bfbebSnyanmisaka     RK_U8 tmp_r = 0;
88*437bfbebSnyanmisaka     RK_U8 tmp_g = 0;
89*437bfbebSnyanmisaka     RK_U8 tmp_b = 0;
90*437bfbebSnyanmisaka 
91*437bfbebSnyanmisaka     if (fmt_idx == OSD_FMT_ARGB8888) {
92*437bfbebSnyanmisaka         cfg->fmt = MPP_FMT_ARGB8888;
93*437bfbebSnyanmisaka         cfg->alpha_cfg.alpha_swap = 1;
94*437bfbebSnyanmisaka         cfg->rbuv_swap = 1;
95*437bfbebSnyanmisaka         cfg->stride = width * 4;
96*437bfbebSnyanmisaka         memcpy(dst, src, width * height * 4);
97*437bfbebSnyanmisaka     } else if (fmt_idx == OSD_FMT_RGBA8888) {
98*437bfbebSnyanmisaka         cfg->fmt = MPP_FMT_RGBA8888;
99*437bfbebSnyanmisaka         cfg->alpha_cfg.alpha_swap = 1;
100*437bfbebSnyanmisaka         cfg->rbuv_swap = 0;
101*437bfbebSnyanmisaka         cfg->stride = width * 4;
102*437bfbebSnyanmisaka         for (j = 0; j < height; j++) {
103*437bfbebSnyanmisaka             for (i = 0; i < width; i++) {
104*437bfbebSnyanmisaka                 dst[j * width * 4 + i * 4 + 0] = src[j * width * 4 + i * 4 + 0];
105*437bfbebSnyanmisaka                 dst[j * width * 4 + i * 4 + 1] = src[j * width * 4 + i * 4 + 3];
106*437bfbebSnyanmisaka                 dst[j * width * 4 + i * 4 + 2] = src[j * width * 4 + i * 4 + 2];
107*437bfbebSnyanmisaka                 dst[j * width * 4 + i * 4 + 3] = src[j * width * 4 + i * 4 + 1];
108*437bfbebSnyanmisaka             }
109*437bfbebSnyanmisaka         }
110*437bfbebSnyanmisaka     } else if (fmt_idx == OSD_FMT_BGRA8888) {
111*437bfbebSnyanmisaka         cfg->fmt = MPP_FMT_ARGB8888;
112*437bfbebSnyanmisaka         cfg->alpha_cfg.alpha_swap = 1;
113*437bfbebSnyanmisaka         cfg->alpha_cfg.alpha_swap = 0;
114*437bfbebSnyanmisaka         cfg->rbuv_swap = 0;
115*437bfbebSnyanmisaka         cfg->stride = width * 4;
116*437bfbebSnyanmisaka         for (j = 0; j < height; j++) {
117*437bfbebSnyanmisaka             for (i = 0; i < width; i++) {
118*437bfbebSnyanmisaka                 dst[j * width * 4 + i * 4 + 0] = src[j * width * 4 + i * 4 + 3];
119*437bfbebSnyanmisaka                 dst[j * width * 4 + i * 4 + 1] = src[j * width * 4 + i * 4 + 2];
120*437bfbebSnyanmisaka                 dst[j * width * 4 + i * 4 + 2] = src[j * width * 4 + i * 4 + 1];
121*437bfbebSnyanmisaka                 dst[j * width * 4 + i * 4 + 3] = src[j * width * 4 + i * 4 + 0];
122*437bfbebSnyanmisaka             }
123*437bfbebSnyanmisaka         }
124*437bfbebSnyanmisaka     } else if (fmt_idx == OSD_FMT_ABGR8888) {
125*437bfbebSnyanmisaka         cfg->fmt = MPP_FMT_ABGR8888;
126*437bfbebSnyanmisaka         cfg->alpha_cfg.alpha_swap = 0;
127*437bfbebSnyanmisaka         cfg->rbuv_swap = 1;
128*437bfbebSnyanmisaka         cfg->stride = width * 4;
129*437bfbebSnyanmisaka         for (j = 0; j < height; j++) {
130*437bfbebSnyanmisaka             for (i = 0; i < width; i++) {
131*437bfbebSnyanmisaka                 dst[j * width * 4 + i * 4 + 0] = src[j * width * 4 + i * 4 + 1];
132*437bfbebSnyanmisaka                 dst[j * width * 4 + i * 4 + 1] = src[j * width * 4 + i * 4 + 2];
133*437bfbebSnyanmisaka                 dst[j * width * 4 + i * 4 + 2] = src[j * width * 4 + i * 4 + 3];
134*437bfbebSnyanmisaka                 dst[j * width * 4 + i * 4 + 3] = src[j * width * 4 + i * 4 + 0];
135*437bfbebSnyanmisaka             }
136*437bfbebSnyanmisaka         }
137*437bfbebSnyanmisaka     } else if (fmt_idx == OSD_FMT_BGRA5551) {
138*437bfbebSnyanmisaka         cfg->fmt = MPP_FMT_ARGB1555;
139*437bfbebSnyanmisaka         cfg->alpha_cfg.alpha_swap = 0;
140*437bfbebSnyanmisaka         cfg->rbuv_swap = 0;
141*437bfbebSnyanmisaka         cfg->stride = width * 2;
142*437bfbebSnyanmisaka         tmp_u16 = (RK_U16 *)dst;
143*437bfbebSnyanmisaka         for (j = 0; j < height; j++) {
144*437bfbebSnyanmisaka             for (i = 0; i < width; i++) {
145*437bfbebSnyanmisaka                 tmp_r = src[j * width * 4 + i * 4 + 1];
146*437bfbebSnyanmisaka                 tmp_g = src[j * width * 4 + i * 4 + 2];
147*437bfbebSnyanmisaka                 tmp_b = src[j * width * 4 + i * 4 + 3];
148*437bfbebSnyanmisaka                 tmp_u16[j * width + i] = ((tmp_r >> 3) << 10) +
149*437bfbebSnyanmisaka                                          ((tmp_g >> 3) << 5) +
150*437bfbebSnyanmisaka                                          ((tmp_b >> 3) | 0x8000);
151*437bfbebSnyanmisaka             }
152*437bfbebSnyanmisaka         }
153*437bfbebSnyanmisaka     } else if (fmt_idx == OSD_FMT_RGBA5551) {
154*437bfbebSnyanmisaka         cfg->fmt = MPP_FMT_ARGB1555;
155*437bfbebSnyanmisaka         cfg->alpha_cfg.alpha_swap = 0;
156*437bfbebSnyanmisaka         cfg->rbuv_swap = 1;
157*437bfbebSnyanmisaka         cfg->stride = width * 2;
158*437bfbebSnyanmisaka         tmp_u16 = (RK_U16 *)dst;
159*437bfbebSnyanmisaka         for (j = 0; j < height; j++) {
160*437bfbebSnyanmisaka             for (i = 0; i < width; i++) {
161*437bfbebSnyanmisaka                 tmp_r = src[j * width * 4 + i * 4 + 1];
162*437bfbebSnyanmisaka                 tmp_g = src[j * width * 4 + i * 4 + 2];
163*437bfbebSnyanmisaka                 tmp_b = src[j * width * 4 + i * 4 + 3];
164*437bfbebSnyanmisaka                 tmp_u16[j * width + i] = ((tmp_b >> 3) << 10) +
165*437bfbebSnyanmisaka                                          ((tmp_g >> 3) << 5) +
166*437bfbebSnyanmisaka                                          ((tmp_r >> 3) | 0x8000);
167*437bfbebSnyanmisaka             }
168*437bfbebSnyanmisaka         }
169*437bfbebSnyanmisaka     } else if (fmt_idx == OSD_FMT_ABGR1555) {
170*437bfbebSnyanmisaka         cfg->fmt = MPP_FMT_ARGB1555;
171*437bfbebSnyanmisaka         cfg->alpha_cfg.alpha_swap = 1;
172*437bfbebSnyanmisaka         cfg->rbuv_swap = 0;
173*437bfbebSnyanmisaka         cfg->stride = width * 2;
174*437bfbebSnyanmisaka         tmp_u16 = (RK_U16 *)dst;
175*437bfbebSnyanmisaka         for (j = 0; j < height; j++) {
176*437bfbebSnyanmisaka             for (i = 0; i < width; i++) {
177*437bfbebSnyanmisaka                 tmp_r = src[j * width * 4 + i * 4 + 1];
178*437bfbebSnyanmisaka                 tmp_g = src[j * width * 4 + i * 4 + 2];
179*437bfbebSnyanmisaka                 tmp_b = src[j * width * 4 + i * 4 + 3];
180*437bfbebSnyanmisaka                 tmp_u16[j * width + i] = ((tmp_r >> 3) << 11) +
181*437bfbebSnyanmisaka                                          ((tmp_g >> 3) << 6) +
182*437bfbebSnyanmisaka                                          ((tmp_b >> 3) << 1) + 1;
183*437bfbebSnyanmisaka             }
184*437bfbebSnyanmisaka         }
185*437bfbebSnyanmisaka     } else if (fmt_idx == OSD_FMT_ARGB1555) {
186*437bfbebSnyanmisaka         cfg->fmt = MPP_FMT_ARGB1555;
187*437bfbebSnyanmisaka         cfg->alpha_cfg.alpha_swap = 1;
188*437bfbebSnyanmisaka         cfg->rbuv_swap = 1;
189*437bfbebSnyanmisaka         cfg->stride = width * 2;
190*437bfbebSnyanmisaka         tmp_u16 = (RK_U16 *)dst;
191*437bfbebSnyanmisaka         for (j = 0; j < height; j++) {
192*437bfbebSnyanmisaka             for (i = 0; i < width; i++) {
193*437bfbebSnyanmisaka                 tmp_r = src[j * width * 4 + i * 4 + 1];
194*437bfbebSnyanmisaka                 tmp_g = src[j * width * 4 + i * 4 + 2];
195*437bfbebSnyanmisaka                 tmp_b = src[j * width * 4 + i * 4 + 3];
196*437bfbebSnyanmisaka                 tmp_u16[j * width + i] = ((tmp_b >> 3) << 11) +
197*437bfbebSnyanmisaka                                          ((tmp_g >> 3) << 6) +
198*437bfbebSnyanmisaka                                          ((tmp_r >> 3) << 1) + 1;
199*437bfbebSnyanmisaka             }
200*437bfbebSnyanmisaka         }
201*437bfbebSnyanmisaka     } else if (fmt_idx == OSD_FMT_BGRA4444) {
202*437bfbebSnyanmisaka         cfg->fmt = MPP_FMT_ARGB4444;
203*437bfbebSnyanmisaka         cfg->alpha_cfg.alpha_swap = 0;
204*437bfbebSnyanmisaka         cfg->rbuv_swap = 0;
205*437bfbebSnyanmisaka         cfg->stride = width * 2;
206*437bfbebSnyanmisaka         tmp_u16 = (RK_U16 *)dst;
207*437bfbebSnyanmisaka         for (j = 0; j < height; j++) {
208*437bfbebSnyanmisaka             for (i = 0; i < width; i++) {
209*437bfbebSnyanmisaka                 tmp_r = src[j * width * 4 + i * 4 + 1];
210*437bfbebSnyanmisaka                 tmp_g = src[j * width * 4 + i * 4 + 2];
211*437bfbebSnyanmisaka                 tmp_b = src[j * width * 4 + i * 4 + 3];
212*437bfbebSnyanmisaka                 tmp_u16[j * width + i] = ((tmp_r >> 4) << 8) +
213*437bfbebSnyanmisaka                                          ((tmp_g >> 4) << 4) +
214*437bfbebSnyanmisaka                                          ((tmp_b >> 4) | 0xf000);
215*437bfbebSnyanmisaka             }
216*437bfbebSnyanmisaka         }
217*437bfbebSnyanmisaka     } else if (fmt_idx == OSD_FMT_RGBA4444) {
218*437bfbebSnyanmisaka         cfg->fmt = MPP_FMT_ARGB4444;
219*437bfbebSnyanmisaka         cfg->alpha_cfg.alpha_swap = 0;
220*437bfbebSnyanmisaka         cfg->rbuv_swap = 1;
221*437bfbebSnyanmisaka         cfg->stride = width * 2;
222*437bfbebSnyanmisaka         tmp_u16 = (RK_U16 *)dst;
223*437bfbebSnyanmisaka         for (j = 0; j < height; j++) {
224*437bfbebSnyanmisaka             for (i = 0; i < width; i++) {
225*437bfbebSnyanmisaka                 tmp_r = src[j * width * 4 + i * 4 + 1];
226*437bfbebSnyanmisaka                 tmp_g = src[j * width * 4 + i * 4 + 2];
227*437bfbebSnyanmisaka                 tmp_b = src[j * width * 4 + i * 4 + 3];
228*437bfbebSnyanmisaka                 tmp_u16[j * width + i] = ((tmp_b >> 4) << 8) +
229*437bfbebSnyanmisaka                                          ((tmp_g >> 4) << 4) +
230*437bfbebSnyanmisaka                                          ((tmp_r >> 4) | 0xf000);
231*437bfbebSnyanmisaka             }
232*437bfbebSnyanmisaka         }
233*437bfbebSnyanmisaka     } else if (fmt_idx == OSD_FMT_ABGR4444) {
234*437bfbebSnyanmisaka         cfg->fmt = MPP_FMT_ARGB4444;
235*437bfbebSnyanmisaka         cfg->alpha_cfg.alpha_swap = 1;
236*437bfbebSnyanmisaka         cfg->rbuv_swap = 0;
237*437bfbebSnyanmisaka         cfg->stride = width * 2;
238*437bfbebSnyanmisaka         tmp_u16 = (RK_U16 *)dst;
239*437bfbebSnyanmisaka         for (j = 0; j < height; j++) {
240*437bfbebSnyanmisaka             for (i = 0; i < width; i++) {
241*437bfbebSnyanmisaka                 tmp_r = src[j * width * 4 + i * 4 + 1];
242*437bfbebSnyanmisaka                 tmp_g = src[j * width * 4 + i * 4 + 2];
243*437bfbebSnyanmisaka                 tmp_b = src[j * width * 4 + i * 4 + 3];
244*437bfbebSnyanmisaka                 tmp_u16[j * width + i] = ((tmp_r >> 4) << 12) +
245*437bfbebSnyanmisaka                                          ((tmp_g >> 4) << 8) +
246*437bfbebSnyanmisaka                                          ((tmp_b >> 4) << 4) + 0x0f;
247*437bfbebSnyanmisaka             }
248*437bfbebSnyanmisaka         }
249*437bfbebSnyanmisaka     } else if (fmt_idx == OSD_FMT_ARGB4444) {
250*437bfbebSnyanmisaka         cfg->fmt = MPP_FMT_ARGB4444;
251*437bfbebSnyanmisaka         cfg->alpha_cfg.alpha_swap = 1;
252*437bfbebSnyanmisaka         cfg->rbuv_swap = 1;
253*437bfbebSnyanmisaka         cfg->stride = width * 2;
254*437bfbebSnyanmisaka         tmp_u16 = (RK_U16 *)dst;
255*437bfbebSnyanmisaka         for (j = 0; j < height; j++) {
256*437bfbebSnyanmisaka             for (i = 0; i < width; i++) {
257*437bfbebSnyanmisaka                 tmp_r = src[j * width * 4 + i * 4 + 1];
258*437bfbebSnyanmisaka                 tmp_g = src[j * width * 4 + i * 4 + 2];
259*437bfbebSnyanmisaka                 tmp_b = src[j * width * 4 + i * 4 + 3];
260*437bfbebSnyanmisaka                 tmp_u16[j * width + i] = ((tmp_b >> 4) << 12) +
261*437bfbebSnyanmisaka                                          ((tmp_g >> 4) << 8) +
262*437bfbebSnyanmisaka                                          ((tmp_r >> 4) << 4) + 0x0f;
263*437bfbebSnyanmisaka             }
264*437bfbebSnyanmisaka         }
265*437bfbebSnyanmisaka     } else if (fmt_idx == OSD_FMT_AYUV2BPP) {
266*437bfbebSnyanmisaka         cfg->fmt = MPP_FMT_AYUV2BPP;
267*437bfbebSnyanmisaka         cfg->rbuv_swap = 0;
268*437bfbebSnyanmisaka         cfg->alpha_cfg.alpha_swap = 0;
269*437bfbebSnyanmisaka         cfg->stride = width / 4;
270*437bfbebSnyanmisaka         for (j = 0; j < height; j++) {
271*437bfbebSnyanmisaka             RK_U32 is_black;
272*437bfbebSnyanmisaka 
273*437bfbebSnyanmisaka             is_black = (j / SMPTE_BAR_CNT) % 2 ? 1 : 0;
274*437bfbebSnyanmisaka             for (i = 0; i < width; i++) {
275*437bfbebSnyanmisaka                 if (is_black)
276*437bfbebSnyanmisaka                     dst[j * width / 4 + i / 4] = (dst[j * width / 4 + i / 4] << 2) | 0;
277*437bfbebSnyanmisaka                 else
278*437bfbebSnyanmisaka                     dst[j * width / 4 + i / 4] = (dst[j * width / 4 + i / 4] << 2) | (1 << 1 | 1);
279*437bfbebSnyanmisaka             }
280*437bfbebSnyanmisaka         }
281*437bfbebSnyanmisaka     } else if (fmt_idx == OSD_FMT_AYUV1BPP) {
282*437bfbebSnyanmisaka         cfg->fmt = MPP_FMT_AYUV1BPP;
283*437bfbebSnyanmisaka         cfg->rbuv_swap = 0;
284*437bfbebSnyanmisaka         cfg->alpha_cfg.alpha_swap = 0;
285*437bfbebSnyanmisaka         cfg->stride = width / 8;
286*437bfbebSnyanmisaka         for (j = 0; j < height; j++) {
287*437bfbebSnyanmisaka             RK_U32 is_black;
288*437bfbebSnyanmisaka 
289*437bfbebSnyanmisaka             is_black = (j / SMPTE_BAR_CNT) % 2 ? 1 : 0;
290*437bfbebSnyanmisaka             for (i = 0; i < width; i++) {
291*437bfbebSnyanmisaka                 if (is_black)
292*437bfbebSnyanmisaka                     dst[j * width / 8 + i / 8] = (dst[j * width / 8 + i / 8] << 1) | 0;
293*437bfbebSnyanmisaka                 else
294*437bfbebSnyanmisaka                     dst[j * width / 8 + i / 8] = (dst[j * width / 8 + i / 8] << 1) | 1;
295*437bfbebSnyanmisaka             }
296*437bfbebSnyanmisaka         }
297*437bfbebSnyanmisaka     }
298*437bfbebSnyanmisaka 
299*437bfbebSnyanmisaka     return ret;
300*437bfbebSnyanmisaka }
301*437bfbebSnyanmisaka 
get_frame_size_by_format(OsdFmt fmt,RK_U32 width,RK_U32 height)302*437bfbebSnyanmisaka static RK_U32 get_frame_size_by_format(OsdFmt fmt, RK_U32 width, RK_U32 height)
303*437bfbebSnyanmisaka {
304*437bfbebSnyanmisaka     switch (fmt) {
305*437bfbebSnyanmisaka     case OSD_FMT_ARGB8888:
306*437bfbebSnyanmisaka     case OSD_FMT_RGBA8888:
307*437bfbebSnyanmisaka     case OSD_FMT_BGRA8888:
308*437bfbebSnyanmisaka     case OSD_FMT_ABGR8888:
309*437bfbebSnyanmisaka         return width * height * 4;
310*437bfbebSnyanmisaka     case OSD_FMT_ARGB1555:
311*437bfbebSnyanmisaka     case OSD_FMT_ABGR1555:
312*437bfbebSnyanmisaka     case OSD_FMT_RGBA5551:
313*437bfbebSnyanmisaka     case OSD_FMT_BGRA5551:
314*437bfbebSnyanmisaka     case OSD_FMT_ARGB4444:
315*437bfbebSnyanmisaka     case OSD_FMT_ABGR4444:
316*437bfbebSnyanmisaka     case OSD_FMT_RGBA4444:
317*437bfbebSnyanmisaka     case OSD_FMT_BGRA4444:
318*437bfbebSnyanmisaka         return width * height * 2;
319*437bfbebSnyanmisaka     case OSD_FMT_AYUV2BPP:
320*437bfbebSnyanmisaka         return width * height / 4;
321*437bfbebSnyanmisaka     case OSD_FMT_AYUV1BPP:
322*437bfbebSnyanmisaka         return width * height / 8;
323*437bfbebSnyanmisaka     default:
324*437bfbebSnyanmisaka         return 0;
325*437bfbebSnyanmisaka     }
326*437bfbebSnyanmisaka }
327*437bfbebSnyanmisaka 
osd3_test_case_fmt(MppEncOSDData3 * osd_data)328*437bfbebSnyanmisaka static MPP_RET osd3_test_case_fmt(MppEncOSDData3 *osd_data)
329*437bfbebSnyanmisaka {
330*437bfbebSnyanmisaka     MppEncOSDRegion3 *region = &osd_data->region[0];
331*437bfbebSnyanmisaka 
332*437bfbebSnyanmisaka     if (region->fmt == MPP_FMT_AYUV2BPP || region->fmt == MPP_FMT_AYUV1BPP)
333*437bfbebSnyanmisaka         region->alpha_cfg.fg_alpha_sel = FROM_LUT;
334*437bfbebSnyanmisaka     else
335*437bfbebSnyanmisaka         region->alpha_cfg.fg_alpha_sel = FROM_DDR;
336*437bfbebSnyanmisaka 
337*437bfbebSnyanmisaka     return MPP_OK;
338*437bfbebSnyanmisaka }
339*437bfbebSnyanmisaka 
osd3_test_case_fg_alpha_sel(MppEncOSDData3 * osd_data)340*437bfbebSnyanmisaka static MPP_RET osd3_test_case_fg_alpha_sel(MppEncOSDData3 *osd_data)
341*437bfbebSnyanmisaka {
342*437bfbebSnyanmisaka     MppEncOSDRegion3 *region = &osd_data->region[0];
343*437bfbebSnyanmisaka     RK_U32 region_width = OSD_PATTERN_WIDTH;
344*437bfbebSnyanmisaka 
345*437bfbebSnyanmisaka     region->alpha_cfg.fg_alpha_sel = FROM_DDR;
346*437bfbebSnyanmisaka 
347*437bfbebSnyanmisaka     region = &osd_data->region[1];
348*437bfbebSnyanmisaka     memcpy(region, &osd_data->region[0], sizeof(MppEncOSDRegion3));
349*437bfbebSnyanmisaka     region->lt_x = (region_width + 16);
350*437bfbebSnyanmisaka     region->rb_x = region->lt_x + region_width - 1;
351*437bfbebSnyanmisaka     region->alpha_cfg.fg_alpha_sel = FROM_LUT;
352*437bfbebSnyanmisaka 
353*437bfbebSnyanmisaka 
354*437bfbebSnyanmisaka     region = &osd_data->region[2];
355*437bfbebSnyanmisaka     memcpy(region, &osd_data->region[0], sizeof(MppEncOSDRegion3));
356*437bfbebSnyanmisaka     region->lt_x = (region_width + 16) * 2;
357*437bfbebSnyanmisaka     region->rb_x = region->lt_x + region_width - 1;
358*437bfbebSnyanmisaka     region->alpha_cfg.fg_alpha_sel = FROM_REG;
359*437bfbebSnyanmisaka     region->alpha_cfg.fg_alpha = 0x80;
360*437bfbebSnyanmisaka 
361*437bfbebSnyanmisaka     osd_data->num_region = 3;
362*437bfbebSnyanmisaka 
363*437bfbebSnyanmisaka     return MPP_OK;
364*437bfbebSnyanmisaka }
365*437bfbebSnyanmisaka 
osd3_test_case_ch_ds_mode(MppEncOSDData3 * osd_data)366*437bfbebSnyanmisaka static MPP_RET osd3_test_case_ch_ds_mode(MppEncOSDData3 *osd_data)
367*437bfbebSnyanmisaka {
368*437bfbebSnyanmisaka     MppEncOSDRegion3 *region = &osd_data->region[0];
369*437bfbebSnyanmisaka     RK_U32 region_width = OSD_PATTERN_WIDTH;
370*437bfbebSnyanmisaka 
371*437bfbebSnyanmisaka     region->ch_ds_mode = AVERAGE;
372*437bfbebSnyanmisaka 
373*437bfbebSnyanmisaka     region = &osd_data->region[1];
374*437bfbebSnyanmisaka     memcpy(region, &osd_data->region[0], sizeof(MppEncOSDRegion3));
375*437bfbebSnyanmisaka     region->lt_x = (region_width + 16);
376*437bfbebSnyanmisaka     region->rb_x = region->lt_x + region_width - 1;
377*437bfbebSnyanmisaka     region->ch_ds_mode = DROP;
378*437bfbebSnyanmisaka 
379*437bfbebSnyanmisaka     osd_data->num_region = 2;
380*437bfbebSnyanmisaka 
381*437bfbebSnyanmisaka     return MPP_OK;
382*437bfbebSnyanmisaka }
383*437bfbebSnyanmisaka 
osd3_test_case_range_trns_sel(MppEncOSDData3 * osd_data)384*437bfbebSnyanmisaka static MPP_RET osd3_test_case_range_trns_sel(MppEncOSDData3 *osd_data)
385*437bfbebSnyanmisaka {
386*437bfbebSnyanmisaka     MppEncOSDRegion3 *region = &osd_data->region[0];
387*437bfbebSnyanmisaka     RK_U32 region_width = OSD_PATTERN_WIDTH;
388*437bfbebSnyanmisaka 
389*437bfbebSnyanmisaka     region->range_trns_sel = FULL_TO_LIMIT;
390*437bfbebSnyanmisaka     region->range_trns_en = 1;
391*437bfbebSnyanmisaka 
392*437bfbebSnyanmisaka     region = &osd_data->region[1];
393*437bfbebSnyanmisaka     memcpy(region, &osd_data->region[0], sizeof(MppEncOSDRegion3));
394*437bfbebSnyanmisaka     region->lt_x = (region_width + 16);
395*437bfbebSnyanmisaka     region->rb_x = region->lt_x + region_width - 1;
396*437bfbebSnyanmisaka     region->range_trns_sel = LIMIT_TO_FULL;
397*437bfbebSnyanmisaka 
398*437bfbebSnyanmisaka     osd_data->num_region = 2;
399*437bfbebSnyanmisaka 
400*437bfbebSnyanmisaka     return MPP_OK;
401*437bfbebSnyanmisaka }
402*437bfbebSnyanmisaka 
osd3_test_case_max_reginon_num(MppEncOSDData3 * osd_data)403*437bfbebSnyanmisaka static MPP_RET osd3_test_case_max_reginon_num(MppEncOSDData3 *osd_data)
404*437bfbebSnyanmisaka {
405*437bfbebSnyanmisaka     MppEncOSDRegion3 *region = &osd_data->region[0];
406*437bfbebSnyanmisaka     RK_U32 region_width = OSD_PATTERN_WIDTH;
407*437bfbebSnyanmisaka     RK_U32 i;
408*437bfbebSnyanmisaka 
409*437bfbebSnyanmisaka     for (i = 1; i < 8; i++) {
410*437bfbebSnyanmisaka         region = &osd_data->region[i];
411*437bfbebSnyanmisaka         memcpy(region, &osd_data->region[0], sizeof(MppEncOSDRegion3));
412*437bfbebSnyanmisaka         region->lt_x = (region_width + 16) * i;
413*437bfbebSnyanmisaka         region->rb_x = region->lt_x + region_width - 1;
414*437bfbebSnyanmisaka     }
415*437bfbebSnyanmisaka 
416*437bfbebSnyanmisaka     osd_data->num_region = 8;
417*437bfbebSnyanmisaka 
418*437bfbebSnyanmisaka     return MPP_OK;
419*437bfbebSnyanmisaka }
420*437bfbebSnyanmisaka 
421*437bfbebSnyanmisaka static OsdCaseCfg osd3_test_cases[OSD_CASE_BUTT] = {
422*437bfbebSnyanmisaka     {
423*437bfbebSnyanmisaka         OSD_CASE_FMT_ARGB8888,
424*437bfbebSnyanmisaka         OSD_FMT_ARGB8888,
425*437bfbebSnyanmisaka         "osd argb8888",
426*437bfbebSnyanmisaka         osd3_test_case_fmt,
427*437bfbebSnyanmisaka     },
428*437bfbebSnyanmisaka     {
429*437bfbebSnyanmisaka         OSD_CASE_FMT_RGBA8888,
430*437bfbebSnyanmisaka         OSD_FMT_RGBA8888,
431*437bfbebSnyanmisaka         "osd rgba8888",
432*437bfbebSnyanmisaka         osd3_test_case_fmt,
433*437bfbebSnyanmisaka     },
434*437bfbebSnyanmisaka     {
435*437bfbebSnyanmisaka         OSD_CASE_FMT_BGRA8888,
436*437bfbebSnyanmisaka         OSD_FMT_BGRA8888,
437*437bfbebSnyanmisaka         "osd bgra8888",
438*437bfbebSnyanmisaka         osd3_test_case_fmt,
439*437bfbebSnyanmisaka     },
440*437bfbebSnyanmisaka     {
441*437bfbebSnyanmisaka         OSD_CASE_FMT_ABGR8888,
442*437bfbebSnyanmisaka         OSD_FMT_ABGR8888,
443*437bfbebSnyanmisaka         "osd abgr8888",
444*437bfbebSnyanmisaka         osd3_test_case_fmt,
445*437bfbebSnyanmisaka     },
446*437bfbebSnyanmisaka     {
447*437bfbebSnyanmisaka         OSD_CASE_FMT_ARGB1555,
448*437bfbebSnyanmisaka         OSD_FMT_ARGB1555,
449*437bfbebSnyanmisaka         "osd argb1555",
450*437bfbebSnyanmisaka         osd3_test_case_fmt,
451*437bfbebSnyanmisaka     },
452*437bfbebSnyanmisaka     {
453*437bfbebSnyanmisaka         OSD_CASE_FMT_ABGR1555,
454*437bfbebSnyanmisaka         OSD_FMT_ABGR1555,
455*437bfbebSnyanmisaka         "osd abgr1555",
456*437bfbebSnyanmisaka         osd3_test_case_fmt,
457*437bfbebSnyanmisaka     },
458*437bfbebSnyanmisaka     {
459*437bfbebSnyanmisaka         OSD_CASE_FMT_RGBA5551,
460*437bfbebSnyanmisaka         OSD_FMT_RGBA5551,
461*437bfbebSnyanmisaka         "osd rgba5551",
462*437bfbebSnyanmisaka         osd3_test_case_fmt,
463*437bfbebSnyanmisaka     },
464*437bfbebSnyanmisaka     {
465*437bfbebSnyanmisaka         OSD_CASE_FMT_BGRA5551,
466*437bfbebSnyanmisaka         OSD_FMT_BGRA5551,
467*437bfbebSnyanmisaka         "osd bgra5551",
468*437bfbebSnyanmisaka         osd3_test_case_fmt,
469*437bfbebSnyanmisaka     },
470*437bfbebSnyanmisaka     {
471*437bfbebSnyanmisaka         OSD_CASE_FMT_ARGB4444,
472*437bfbebSnyanmisaka         OSD_FMT_ARGB4444,
473*437bfbebSnyanmisaka         "osd argb4444",
474*437bfbebSnyanmisaka         osd3_test_case_fmt,
475*437bfbebSnyanmisaka     },
476*437bfbebSnyanmisaka     {
477*437bfbebSnyanmisaka         OSD_CASE_FMT_ABGR4444,
478*437bfbebSnyanmisaka         OSD_FMT_ABGR4444,
479*437bfbebSnyanmisaka         "osd abgr4444",
480*437bfbebSnyanmisaka         osd3_test_case_fmt,
481*437bfbebSnyanmisaka     },
482*437bfbebSnyanmisaka     {
483*437bfbebSnyanmisaka         OSD_CASE_FMT_RGBA4444,
484*437bfbebSnyanmisaka         OSD_FMT_RGBA4444,
485*437bfbebSnyanmisaka         "osd rgba4444",
486*437bfbebSnyanmisaka         osd3_test_case_fmt,
487*437bfbebSnyanmisaka     },
488*437bfbebSnyanmisaka     {
489*437bfbebSnyanmisaka         OSD_CASE_FMT_BGRA4444,
490*437bfbebSnyanmisaka         OSD_FMT_BGRA4444,
491*437bfbebSnyanmisaka         "osd bgra4444",
492*437bfbebSnyanmisaka         osd3_test_case_fmt,
493*437bfbebSnyanmisaka     },
494*437bfbebSnyanmisaka     {
495*437bfbebSnyanmisaka         OSD_CASE_FMT_AYUV2BPP,
496*437bfbebSnyanmisaka         OSD_FMT_AYUV2BPP,
497*437bfbebSnyanmisaka         "osd ayuv2bpp",
498*437bfbebSnyanmisaka         osd3_test_case_fmt,
499*437bfbebSnyanmisaka     },
500*437bfbebSnyanmisaka     {
501*437bfbebSnyanmisaka         OSD_CASE_FMT_AYUV1BPP,
502*437bfbebSnyanmisaka         OSD_FMT_AYUV1BPP,
503*437bfbebSnyanmisaka         "osd ayuv1bpp",
504*437bfbebSnyanmisaka         osd3_test_case_fmt,
505*437bfbebSnyanmisaka     },
506*437bfbebSnyanmisaka     {
507*437bfbebSnyanmisaka         OSD_CASE_FG_ALPAH_SEL,
508*437bfbebSnyanmisaka         OSD_FMT_ARGB8888,
509*437bfbebSnyanmisaka         "osd fg alpha sel",
510*437bfbebSnyanmisaka         osd3_test_case_fg_alpha_sel,
511*437bfbebSnyanmisaka     },
512*437bfbebSnyanmisaka     {
513*437bfbebSnyanmisaka         OSD_CASE_CH_DS_MODE,
514*437bfbebSnyanmisaka         OSD_FMT_ARGB8888,
515*437bfbebSnyanmisaka         "osd ch ds mode",
516*437bfbebSnyanmisaka         osd3_test_case_ch_ds_mode,
517*437bfbebSnyanmisaka     },
518*437bfbebSnyanmisaka     {
519*437bfbebSnyanmisaka         OSD_CASE_RANGE_TRNS_SEL,
520*437bfbebSnyanmisaka         OSD_FMT_ARGB8888,
521*437bfbebSnyanmisaka         "osd range trns sel",
522*437bfbebSnyanmisaka         osd3_test_case_range_trns_sel,
523*437bfbebSnyanmisaka     },
524*437bfbebSnyanmisaka     {
525*437bfbebSnyanmisaka         OSD_CASE_MAX_REGINON_NUM,
526*437bfbebSnyanmisaka         OSD_FMT_ARGB8888,
527*437bfbebSnyanmisaka         "osd max reginon num",
528*437bfbebSnyanmisaka         osd3_test_case_max_reginon_num,
529*437bfbebSnyanmisaka     }
530*437bfbebSnyanmisaka };
531*437bfbebSnyanmisaka 
osd3_get_test_case(MppEncOSDData3 * osd_data,RK_U8 * base_pattern,RK_U32 case_idx,KmppBuffer * osd_buffer)532*437bfbebSnyanmisaka MPP_RET osd3_get_test_case(MppEncOSDData3 *osd_data, RK_U8 *base_pattern, RK_U32 case_idx, KmppBuffer *osd_buffer)
533*437bfbebSnyanmisaka {
534*437bfbebSnyanmisaka     KmppBufCfg osd_buf_cfg = NULL;
535*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
536*437bfbebSnyanmisaka     RK_U32 buffer_size = 0;
537*437bfbebSnyanmisaka     KmppShmPtr osd_sptr;
538*437bfbebSnyanmisaka     RK_U8 *dst_ptr =  NULL;
539*437bfbebSnyanmisaka     MppEncOSDRegion3 *region = NULL;
540*437bfbebSnyanmisaka     RK_U32 region_width = OSD_PATTERN_WIDTH;
541*437bfbebSnyanmisaka     RK_U32 region_height = OSD_PATTERN_HEIGHT;
542*437bfbebSnyanmisaka 
543*437bfbebSnyanmisaka     if (!osd_data)
544*437bfbebSnyanmisaka         return MPP_ERR_NOMEM;
545*437bfbebSnyanmisaka 
546*437bfbebSnyanmisaka     region = &osd_data->region[0];
547*437bfbebSnyanmisaka     memset(region, 0, sizeof(MppEncOSDRegion3));
548*437bfbebSnyanmisaka 
549*437bfbebSnyanmisaka     if (*osd_buffer) {
550*437bfbebSnyanmisaka         kmpp_buffer_put(*osd_buffer);
551*437bfbebSnyanmisaka         *osd_buffer = NULL;
552*437bfbebSnyanmisaka     }
553*437bfbebSnyanmisaka 
554*437bfbebSnyanmisaka     buffer_size = get_frame_size_by_format(osd3_test_cases[case_idx].fmt, region_width, region_height);
555*437bfbebSnyanmisaka 
556*437bfbebSnyanmisaka     kmpp_buffer_get(osd_buffer);
557*437bfbebSnyanmisaka     if (!*osd_buffer)
558*437bfbebSnyanmisaka         return MPP_ERR_NOMEM;
559*437bfbebSnyanmisaka 
560*437bfbebSnyanmisaka     osd_buf_cfg = kmpp_buffer_to_cfg(*osd_buffer);
561*437bfbebSnyanmisaka     if (!osd_buf_cfg)
562*437bfbebSnyanmisaka         return MPP_ERR_NOMEM;
563*437bfbebSnyanmisaka 
564*437bfbebSnyanmisaka     kmpp_buf_cfg_set_size(osd_buf_cfg, MPP_ALIGN(buffer_size, 16));
565*437bfbebSnyanmisaka     kmpp_buffer_setup(*osd_buffer);
566*437bfbebSnyanmisaka     kmpp_buf_cfg_get_sptr(osd_buf_cfg, &osd_sptr);
567*437bfbebSnyanmisaka     dst_ptr = (RK_U8 *)(uintptr_t)osd_sptr.uaddr;
568*437bfbebSnyanmisaka 
569*437bfbebSnyanmisaka     ret = translate_argb(base_pattern, dst_ptr, region_width, region_height, osd3_test_cases[case_idx].fmt, region);
570*437bfbebSnyanmisaka 
571*437bfbebSnyanmisaka     region->osd_buf = *kmpp_obj_to_shm(*osd_buffer);
572*437bfbebSnyanmisaka     region->lt_x = 0;
573*437bfbebSnyanmisaka     region->lt_y = 0;
574*437bfbebSnyanmisaka     region->rb_x = region->lt_x + region_width - 1;
575*437bfbebSnyanmisaka     region->rb_y = region->lt_y + region_height - 1;
576*437bfbebSnyanmisaka     region->enable = 1;
577*437bfbebSnyanmisaka 
578*437bfbebSnyanmisaka     osd_data->num_region = 1;
579*437bfbebSnyanmisaka 
580*437bfbebSnyanmisaka     /* black: y=0, u=0x80, v=0x80, white: y=0xff, u=0x80 v=0x80 */
581*437bfbebSnyanmisaka     region->lut[0] = 0x80;  // v0
582*437bfbebSnyanmisaka     region->lut[1] = 0x80;  // u0
583*437bfbebSnyanmisaka     region->lut[2] = 0;     // y0
584*437bfbebSnyanmisaka     region->lut[3] = 0x80;  // v1
585*437bfbebSnyanmisaka     region->lut[4] = 0x80;  // u1
586*437bfbebSnyanmisaka     region->lut[5] = 0xff;  // y1
587*437bfbebSnyanmisaka     region->lut[6] = 0xff;  // a0
588*437bfbebSnyanmisaka     region->lut[7] = 0xff;  // a1
589*437bfbebSnyanmisaka 
590*437bfbebSnyanmisaka     region->qp_cfg.qp_adj_en = 1;
591*437bfbebSnyanmisaka     region->qp_cfg.qp_adj_sel = QP_RELATIVE;
592*437bfbebSnyanmisaka     region->qp_cfg.qp_min = 10;
593*437bfbebSnyanmisaka     region->qp_cfg.qp_max = 51;
594*437bfbebSnyanmisaka     region->qp_cfg.qp = -1;
595*437bfbebSnyanmisaka 
596*437bfbebSnyanmisaka     ret = osd3_test_cases[case_idx].func(osd_data);
597*437bfbebSnyanmisaka 
598*437bfbebSnyanmisaka     mpp_log("osd case %d : %s done\n", case_idx, osd3_test_cases[case_idx].name);
599*437bfbebSnyanmisaka 
600*437bfbebSnyanmisaka     return ret;
601*437bfbebSnyanmisaka }
602*437bfbebSnyanmisaka 
603