1*437bfbebSnyanmisaka /*
2*437bfbebSnyanmisaka * Copyright 2015 Rockchip Electronics Co. LTD
3*437bfbebSnyanmisaka *
4*437bfbebSnyanmisaka * Licensed under the Apache License, Version 2.0 (the "License");
5*437bfbebSnyanmisaka * you may not use this file except in compliance with the License.
6*437bfbebSnyanmisaka * You may obtain a copy of the License at
7*437bfbebSnyanmisaka *
8*437bfbebSnyanmisaka * http://www.apache.org/licenses/LICENSE-2.0
9*437bfbebSnyanmisaka *
10*437bfbebSnyanmisaka * Unless required by applicable law or agreed to in writing, software
11*437bfbebSnyanmisaka * distributed under the License is distributed on an "AS IS" BASIS,
12*437bfbebSnyanmisaka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*437bfbebSnyanmisaka * See the License for the specific language governing permissions and
14*437bfbebSnyanmisaka * limitations under the License.
15*437bfbebSnyanmisaka */
16*437bfbebSnyanmisaka
17*437bfbebSnyanmisaka #define MODULE_TAG "utils"
18*437bfbebSnyanmisaka
19*437bfbebSnyanmisaka #include <ctype.h>
20*437bfbebSnyanmisaka #include <errno.h>
21*437bfbebSnyanmisaka #include <limits.h>
22*437bfbebSnyanmisaka #include <string.h>
23*437bfbebSnyanmisaka
24*437bfbebSnyanmisaka #include "mpp_mem.h"
25*437bfbebSnyanmisaka #include "mpp_log.h"
26*437bfbebSnyanmisaka #include "mpp_lock.h"
27*437bfbebSnyanmisaka #include "mpp_time.h"
28*437bfbebSnyanmisaka #include "mpp_common.h"
29*437bfbebSnyanmisaka #include "utils.h"
30*437bfbebSnyanmisaka
31*437bfbebSnyanmisaka #define MAX_HALF_WORD_SUM_CNT \
32*437bfbebSnyanmisaka ((RK_ULONG)((0-1) / ((1UL << ((__SIZEOF_POINTER__ * 8) / 2)) - 1)))
33*437bfbebSnyanmisaka #define CAL_BYTE (__SIZEOF_POINTER__ >> 1)
34*437bfbebSnyanmisaka
_show_options(int count,OptionInfo * options)35*437bfbebSnyanmisaka void _show_options(int count, OptionInfo *options)
36*437bfbebSnyanmisaka {
37*437bfbebSnyanmisaka int i;
38*437bfbebSnyanmisaka for (i = 0; i < count; i++) {
39*437bfbebSnyanmisaka if (NULL == options[i].name)
40*437bfbebSnyanmisaka continue;
41*437bfbebSnyanmisaka
42*437bfbebSnyanmisaka mpp_log("-%s %-16s\t%s\n",
43*437bfbebSnyanmisaka options[i].name, options[i].argname, options[i].help);
44*437bfbebSnyanmisaka }
45*437bfbebSnyanmisaka }
46*437bfbebSnyanmisaka
rearrange_pix(RK_U8 * tmp_line,RK_U8 * base,RK_U32 n)47*437bfbebSnyanmisaka static void rearrange_pix(RK_U8 *tmp_line, RK_U8 *base, RK_U32 n)
48*437bfbebSnyanmisaka {
49*437bfbebSnyanmisaka RK_U16 * pix = (RK_U16 *)(tmp_line + n * 16);
50*437bfbebSnyanmisaka RK_U16 * base_u16 = (RK_U16 *)(base + n * 10);
51*437bfbebSnyanmisaka
52*437bfbebSnyanmisaka pix[0] = base_u16[0] & 0x03FF;
53*437bfbebSnyanmisaka pix[1] = (base_u16[0] & 0xFC00) >> 10 | (base_u16[1] & 0x000F) << 6;
54*437bfbebSnyanmisaka pix[2] = (base_u16[1] & 0x3FF0) >> 4;
55*437bfbebSnyanmisaka pix[3] = (base_u16[1] & 0xC000) >> 14 | (base_u16[2] & 0x00FF) << 2;
56*437bfbebSnyanmisaka pix[4] = (base_u16[2] & 0xFF00) >> 8 | (base_u16[3] & 0x0003) << 8;
57*437bfbebSnyanmisaka pix[5] = (base_u16[3] & 0x0FFC) >> 2;
58*437bfbebSnyanmisaka pix[6] = (base_u16[3] & 0xF000) >> 12 | (base_u16[4] & 0x003F) << 4;
59*437bfbebSnyanmisaka pix[7] = (base_u16[4] & 0xFFC0) >> 6;
60*437bfbebSnyanmisaka }
61*437bfbebSnyanmisaka
dump_mpp_frame_to_file(MppFrame frame,FILE * fp)62*437bfbebSnyanmisaka void dump_mpp_frame_to_file(MppFrame frame, FILE *fp)
63*437bfbebSnyanmisaka {
64*437bfbebSnyanmisaka RK_U32 width = 0;
65*437bfbebSnyanmisaka RK_U32 height = 0;
66*437bfbebSnyanmisaka RK_U32 h_stride = 0;
67*437bfbebSnyanmisaka RK_U32 v_stride = 0;
68*437bfbebSnyanmisaka MppFrameFormat fmt = MPP_FMT_YUV420SP;
69*437bfbebSnyanmisaka MppBuffer buffer = NULL;
70*437bfbebSnyanmisaka RK_U8 *base = NULL;
71*437bfbebSnyanmisaka
72*437bfbebSnyanmisaka if (NULL == fp || NULL == frame)
73*437bfbebSnyanmisaka return ;
74*437bfbebSnyanmisaka
75*437bfbebSnyanmisaka width = mpp_frame_get_width(frame);
76*437bfbebSnyanmisaka height = mpp_frame_get_height(frame);
77*437bfbebSnyanmisaka h_stride = mpp_frame_get_hor_stride(frame);
78*437bfbebSnyanmisaka v_stride = mpp_frame_get_ver_stride(frame);
79*437bfbebSnyanmisaka fmt = mpp_frame_get_fmt(frame);
80*437bfbebSnyanmisaka buffer = mpp_frame_get_buffer(frame);
81*437bfbebSnyanmisaka
82*437bfbebSnyanmisaka if (NULL == buffer)
83*437bfbebSnyanmisaka return ;
84*437bfbebSnyanmisaka
85*437bfbebSnyanmisaka base = (RK_U8 *)mpp_buffer_get_ptr(buffer);
86*437bfbebSnyanmisaka
87*437bfbebSnyanmisaka if (MPP_FRAME_FMT_IS_FBC(fmt) || MPP_FRAME_FMT_IS_RKFBC(fmt)) {
88*437bfbebSnyanmisaka RK_S32 buf_size = mpp_buffer_get_size(buffer);
89*437bfbebSnyanmisaka
90*437bfbebSnyanmisaka fwrite(base, 1, buf_size, fp);
91*437bfbebSnyanmisaka return ;
92*437bfbebSnyanmisaka }
93*437bfbebSnyanmisaka
94*437bfbebSnyanmisaka if (MPP_FRAME_FMT_IS_RGB(fmt) && MPP_FRAME_FMT_IS_LE(fmt)) {
95*437bfbebSnyanmisaka fmt &= MPP_FRAME_FMT_MASK;
96*437bfbebSnyanmisaka }
97*437bfbebSnyanmisaka switch (fmt & MPP_FRAME_FMT_MASK) {
98*437bfbebSnyanmisaka case MPP_FMT_YUV422SP : {
99*437bfbebSnyanmisaka /* YUV422SP -> YUV422P for better display */
100*437bfbebSnyanmisaka RK_U32 i, j;
101*437bfbebSnyanmisaka RK_U8 *base_y = base;
102*437bfbebSnyanmisaka RK_U8 *base_c = base + h_stride * v_stride;
103*437bfbebSnyanmisaka RK_U8 *tmp = mpp_malloc(RK_U8, h_stride * height * 2);
104*437bfbebSnyanmisaka RK_U8 *tmp_u = tmp;
105*437bfbebSnyanmisaka RK_U8 *tmp_v = tmp + width * height / 2;
106*437bfbebSnyanmisaka
107*437bfbebSnyanmisaka for (i = 0; i < height; i++, base_y += h_stride)
108*437bfbebSnyanmisaka fwrite(base_y, 1, width, fp);
109*437bfbebSnyanmisaka
110*437bfbebSnyanmisaka for (i = 0; i < height; i++, base_c += h_stride) {
111*437bfbebSnyanmisaka for (j = 0; j < width / 2; j++) {
112*437bfbebSnyanmisaka tmp_u[j] = base_c[2 * j + 0];
113*437bfbebSnyanmisaka tmp_v[j] = base_c[2 * j + 1];
114*437bfbebSnyanmisaka }
115*437bfbebSnyanmisaka tmp_u += width / 2;
116*437bfbebSnyanmisaka tmp_v += width / 2;
117*437bfbebSnyanmisaka }
118*437bfbebSnyanmisaka
119*437bfbebSnyanmisaka fwrite(tmp, 1, width * height, fp);
120*437bfbebSnyanmisaka mpp_free(tmp);
121*437bfbebSnyanmisaka } break;
122*437bfbebSnyanmisaka case MPP_FMT_YUV420SP_VU :
123*437bfbebSnyanmisaka case MPP_FMT_YUV420SP : {
124*437bfbebSnyanmisaka RK_U32 i;
125*437bfbebSnyanmisaka RK_U8 *base_y = base;
126*437bfbebSnyanmisaka RK_U8 *base_c = base + h_stride * v_stride;
127*437bfbebSnyanmisaka
128*437bfbebSnyanmisaka for (i = 0; i < height; i++, base_y += h_stride) {
129*437bfbebSnyanmisaka fwrite(base_y, 1, width, fp);
130*437bfbebSnyanmisaka }
131*437bfbebSnyanmisaka for (i = 0; i < height / 2; i++, base_c += h_stride) {
132*437bfbebSnyanmisaka fwrite(base_c, 1, width, fp);
133*437bfbebSnyanmisaka }
134*437bfbebSnyanmisaka } break;
135*437bfbebSnyanmisaka case MPP_FMT_YUV420P : {
136*437bfbebSnyanmisaka RK_U32 i;
137*437bfbebSnyanmisaka RK_U8 *base_y = base;
138*437bfbebSnyanmisaka RK_U8 *base_c = base + h_stride * v_stride;
139*437bfbebSnyanmisaka
140*437bfbebSnyanmisaka for (i = 0; i < height; i++, base_y += h_stride) {
141*437bfbebSnyanmisaka fwrite(base_y, 1, width, fp);
142*437bfbebSnyanmisaka }
143*437bfbebSnyanmisaka for (i = 0; i < height / 2; i++, base_c += h_stride / 2) {
144*437bfbebSnyanmisaka fwrite(base_c, 1, width / 2, fp);
145*437bfbebSnyanmisaka }
146*437bfbebSnyanmisaka for (i = 0; i < height / 2; i++, base_c += h_stride / 2) {
147*437bfbebSnyanmisaka fwrite(base_c, 1, width / 2, fp);
148*437bfbebSnyanmisaka }
149*437bfbebSnyanmisaka } break;
150*437bfbebSnyanmisaka case MPP_FMT_YUV420SP_10BIT : {
151*437bfbebSnyanmisaka RK_U32 i, k;
152*437bfbebSnyanmisaka RK_U8 *base_y = base;
153*437bfbebSnyanmisaka RK_U8 *base_c = base + h_stride * v_stride;
154*437bfbebSnyanmisaka RK_U8 *tmp_line = (RK_U8 *)mpp_malloc(RK_U16, width);
155*437bfbebSnyanmisaka
156*437bfbebSnyanmisaka if (!tmp_line) {
157*437bfbebSnyanmisaka mpp_log("tmp_line malloc fail");
158*437bfbebSnyanmisaka return;
159*437bfbebSnyanmisaka }
160*437bfbebSnyanmisaka
161*437bfbebSnyanmisaka for (i = 0; i < height; i++, base_y += h_stride) {
162*437bfbebSnyanmisaka for (k = 0; k < MPP_ALIGN(width, 8) / 8; k++)
163*437bfbebSnyanmisaka rearrange_pix(tmp_line, base_y, k);
164*437bfbebSnyanmisaka fwrite(tmp_line, width * sizeof(RK_U16), 1, fp);
165*437bfbebSnyanmisaka }
166*437bfbebSnyanmisaka
167*437bfbebSnyanmisaka for (i = 0; i < height / 2; i++, base_c += h_stride) {
168*437bfbebSnyanmisaka for (k = 0; k < MPP_ALIGN(width, 8) / 8; k++)
169*437bfbebSnyanmisaka rearrange_pix(tmp_line, base_c, k);
170*437bfbebSnyanmisaka fwrite(tmp_line, width * sizeof(RK_U16), 1, fp);
171*437bfbebSnyanmisaka }
172*437bfbebSnyanmisaka
173*437bfbebSnyanmisaka MPP_FREE(tmp_line);
174*437bfbebSnyanmisaka } break;
175*437bfbebSnyanmisaka case MPP_FMT_YUV444SP : {
176*437bfbebSnyanmisaka /* YUV444SP -> YUV444P for better display */
177*437bfbebSnyanmisaka RK_U32 i, j;
178*437bfbebSnyanmisaka RK_U8 *base_y = base;
179*437bfbebSnyanmisaka RK_U8 *base_c = base + h_stride * v_stride;
180*437bfbebSnyanmisaka RK_U8 *tmp = mpp_malloc(RK_U8, h_stride * height * 2);
181*437bfbebSnyanmisaka RK_U8 *tmp_u = tmp;
182*437bfbebSnyanmisaka RK_U8 *tmp_v = tmp + width * height;
183*437bfbebSnyanmisaka
184*437bfbebSnyanmisaka for (i = 0; i < height; i++, base_y += h_stride)
185*437bfbebSnyanmisaka fwrite(base_y, 1, width, fp);
186*437bfbebSnyanmisaka
187*437bfbebSnyanmisaka for (i = 0; i < height; i++, base_c += h_stride * 2) {
188*437bfbebSnyanmisaka for (j = 0; j < width; j++) {
189*437bfbebSnyanmisaka tmp_u[j] = base_c[2 * j + 0];
190*437bfbebSnyanmisaka tmp_v[j] = base_c[2 * j + 1];
191*437bfbebSnyanmisaka }
192*437bfbebSnyanmisaka tmp_u += width;
193*437bfbebSnyanmisaka tmp_v += width;
194*437bfbebSnyanmisaka }
195*437bfbebSnyanmisaka
196*437bfbebSnyanmisaka fwrite(tmp, 1, width * height * 2, fp);
197*437bfbebSnyanmisaka mpp_free(tmp);
198*437bfbebSnyanmisaka } break;
199*437bfbebSnyanmisaka case MPP_FMT_YUV444SP_10BIT : {
200*437bfbebSnyanmisaka RK_U32 i, k;
201*437bfbebSnyanmisaka RK_U8 *base_y = base;
202*437bfbebSnyanmisaka RK_U8 *base_c = base + h_stride * v_stride;
203*437bfbebSnyanmisaka RK_U8 *tmp_line = (RK_U8 *)mpp_malloc(RK_U16, width);
204*437bfbebSnyanmisaka
205*437bfbebSnyanmisaka if (!tmp_line) {
206*437bfbebSnyanmisaka mpp_log("tmp_line malloc fail");
207*437bfbebSnyanmisaka return;
208*437bfbebSnyanmisaka }
209*437bfbebSnyanmisaka
210*437bfbebSnyanmisaka for (i = 0; i < height; i++, base_y += h_stride) {
211*437bfbebSnyanmisaka for (k = 0; k < MPP_ALIGN(width, 8) / 8; k++)
212*437bfbebSnyanmisaka rearrange_pix(tmp_line, base_y, k);
213*437bfbebSnyanmisaka fwrite(tmp_line, width * sizeof(RK_U16), 1, fp);
214*437bfbebSnyanmisaka }
215*437bfbebSnyanmisaka
216*437bfbebSnyanmisaka for (i = 0; i < (height * 2); i++, base_c += h_stride) {
217*437bfbebSnyanmisaka for (k = 0; k < MPP_ALIGN(width, 8) / 8; k++)
218*437bfbebSnyanmisaka rearrange_pix(tmp_line, base_c, k);
219*437bfbebSnyanmisaka fwrite(tmp_line, width * sizeof(RK_U16), 1, fp);
220*437bfbebSnyanmisaka }
221*437bfbebSnyanmisaka
222*437bfbebSnyanmisaka MPP_FREE(tmp_line);
223*437bfbebSnyanmisaka } break;
224*437bfbebSnyanmisaka case MPP_FMT_YUV400: {
225*437bfbebSnyanmisaka RK_U32 i;
226*437bfbebSnyanmisaka RK_U8 *base_y = base;
227*437bfbebSnyanmisaka RK_U8 *tmp = mpp_malloc(RK_U8, h_stride * height);
228*437bfbebSnyanmisaka
229*437bfbebSnyanmisaka for (i = 0; i < height; i++, base_y += h_stride)
230*437bfbebSnyanmisaka fwrite(base_y, 1, width, fp);
231*437bfbebSnyanmisaka
232*437bfbebSnyanmisaka mpp_free(tmp);
233*437bfbebSnyanmisaka } break;
234*437bfbebSnyanmisaka case MPP_FMT_ARGB8888:
235*437bfbebSnyanmisaka case MPP_FMT_ABGR8888:
236*437bfbebSnyanmisaka case MPP_FMT_BGRA8888:
237*437bfbebSnyanmisaka case MPP_FMT_RGBA8888: {
238*437bfbebSnyanmisaka RK_U32 i;
239*437bfbebSnyanmisaka RK_U8 *base_y = base;
240*437bfbebSnyanmisaka RK_U8 *tmp = mpp_malloc(RK_U8, width * height * 4);
241*437bfbebSnyanmisaka
242*437bfbebSnyanmisaka for (i = 0; i < height; i++, base_y += h_stride)
243*437bfbebSnyanmisaka fwrite(base_y, 1, width * 4, fp);
244*437bfbebSnyanmisaka
245*437bfbebSnyanmisaka mpp_free(tmp);
246*437bfbebSnyanmisaka } break;
247*437bfbebSnyanmisaka case MPP_FMT_YUV422_YUYV:
248*437bfbebSnyanmisaka case MPP_FMT_YUV422_YVYU:
249*437bfbebSnyanmisaka case MPP_FMT_YUV422_UYVY:
250*437bfbebSnyanmisaka case MPP_FMT_YUV422_VYUY:
251*437bfbebSnyanmisaka case MPP_FMT_RGB565:
252*437bfbebSnyanmisaka case MPP_FMT_BGR565:
253*437bfbebSnyanmisaka case MPP_FMT_RGB555:
254*437bfbebSnyanmisaka case MPP_FMT_BGR555:
255*437bfbebSnyanmisaka case MPP_FMT_RGB444:
256*437bfbebSnyanmisaka case MPP_FMT_BGR444: {
257*437bfbebSnyanmisaka RK_U32 i;
258*437bfbebSnyanmisaka RK_U8 *base_y = base;
259*437bfbebSnyanmisaka RK_U8 *tmp = mpp_malloc(RK_U8, width * height * 2);
260*437bfbebSnyanmisaka
261*437bfbebSnyanmisaka for (i = 0; i < height; i++, base_y += h_stride)
262*437bfbebSnyanmisaka fwrite(base_y, 1, width * 2, fp);
263*437bfbebSnyanmisaka
264*437bfbebSnyanmisaka mpp_free(tmp);
265*437bfbebSnyanmisaka } break;
266*437bfbebSnyanmisaka case MPP_FMT_RGB888: {
267*437bfbebSnyanmisaka RK_U32 i;
268*437bfbebSnyanmisaka RK_U8 *base_y = base;
269*437bfbebSnyanmisaka RK_U8 *tmp = mpp_malloc(RK_U8, width * height * 3);
270*437bfbebSnyanmisaka
271*437bfbebSnyanmisaka for (i = 0; i < height; i++, base_y += h_stride)
272*437bfbebSnyanmisaka fwrite(base_y, 1, width * 3, fp);
273*437bfbebSnyanmisaka
274*437bfbebSnyanmisaka mpp_free(tmp);
275*437bfbebSnyanmisaka } break;
276*437bfbebSnyanmisaka default : {
277*437bfbebSnyanmisaka mpp_err("not supported format %d\n", fmt);
278*437bfbebSnyanmisaka } break;
279*437bfbebSnyanmisaka }
280*437bfbebSnyanmisaka }
281*437bfbebSnyanmisaka
wide_bit_sum(RK_U8 * data,RK_U32 len,RK_ULONG * sum)282*437bfbebSnyanmisaka void wide_bit_sum(RK_U8 *data, RK_U32 len, RK_ULONG *sum)
283*437bfbebSnyanmisaka {
284*437bfbebSnyanmisaka RK_U8 *data8 = NULL;
285*437bfbebSnyanmisaka RK_U32 loop;
286*437bfbebSnyanmisaka data8 = data;
287*437bfbebSnyanmisaka #if LONG_MAX == INT_MAX
288*437bfbebSnyanmisaka RK_U16 *data_rk = NULL;
289*437bfbebSnyanmisaka data_rk = (RK_U16 *)data;
290*437bfbebSnyanmisaka #else
291*437bfbebSnyanmisaka RK_U32 *data_rk = NULL;
292*437bfbebSnyanmisaka data_rk = (RK_U32 *)data;
293*437bfbebSnyanmisaka #endif
294*437bfbebSnyanmisaka
295*437bfbebSnyanmisaka for (loop = 0; loop < len / CAL_BYTE; loop++) {
296*437bfbebSnyanmisaka *sum += data_rk[loop];
297*437bfbebSnyanmisaka }
298*437bfbebSnyanmisaka for (loop = len / CAL_BYTE * CAL_BYTE; loop < len; loop++) {
299*437bfbebSnyanmisaka *sum += data8[loop];
300*437bfbebSnyanmisaka }
301*437bfbebSnyanmisaka
302*437bfbebSnyanmisaka return;
303*437bfbebSnyanmisaka }
304*437bfbebSnyanmisaka
calc_data_crc(RK_U8 * dat,RK_U32 len,DataCrc * crc)305*437bfbebSnyanmisaka void calc_data_crc(RK_U8 *dat, RK_U32 len, DataCrc *crc)
306*437bfbebSnyanmisaka {
307*437bfbebSnyanmisaka RK_ULONG data_grp_byte_cnt = MAX_HALF_WORD_SUM_CNT * CAL_BYTE;
308*437bfbebSnyanmisaka RK_U32 i = 0, grp_loop = 0;
309*437bfbebSnyanmisaka RK_U8 *dat8 = NULL;
310*437bfbebSnyanmisaka RK_U32 *dat32 = NULL;
311*437bfbebSnyanmisaka RK_U32 xor = 0;
312*437bfbebSnyanmisaka
313*437bfbebSnyanmisaka /*calc sum */
314*437bfbebSnyanmisaka crc->sum_cnt = (len + data_grp_byte_cnt - 1) / data_grp_byte_cnt;
315*437bfbebSnyanmisaka for (grp_loop = 0; grp_loop < len / data_grp_byte_cnt; grp_loop++) {
316*437bfbebSnyanmisaka wide_bit_sum(&dat[grp_loop * data_grp_byte_cnt], data_grp_byte_cnt, &crc->sum[grp_loop]);
317*437bfbebSnyanmisaka }
318*437bfbebSnyanmisaka if (len % data_grp_byte_cnt) {
319*437bfbebSnyanmisaka wide_bit_sum(&dat[grp_loop * data_grp_byte_cnt], len % data_grp_byte_cnt, &crc->sum[grp_loop]);
320*437bfbebSnyanmisaka }
321*437bfbebSnyanmisaka
322*437bfbebSnyanmisaka /*calc xor */
323*437bfbebSnyanmisaka dat32 = (RK_U32 *)dat;
324*437bfbebSnyanmisaka for (i = 0; i < len / 4; i++)
325*437bfbebSnyanmisaka xor ^= dat32[i];
326*437bfbebSnyanmisaka
327*437bfbebSnyanmisaka if (len % 4) {
328*437bfbebSnyanmisaka RK_U32 val = 0;
329*437bfbebSnyanmisaka dat8 = (RK_U8 *)&val;
330*437bfbebSnyanmisaka for (i = (len / 4) * 4; i < len; i++)
331*437bfbebSnyanmisaka dat8[i % 4] = dat[i];
332*437bfbebSnyanmisaka xor ^= val;
333*437bfbebSnyanmisaka }
334*437bfbebSnyanmisaka
335*437bfbebSnyanmisaka crc->len = len;
336*437bfbebSnyanmisaka crc->vor = xor;
337*437bfbebSnyanmisaka }
338*437bfbebSnyanmisaka
write_data_crc(FILE * fp,DataCrc * crc)339*437bfbebSnyanmisaka void write_data_crc(FILE *fp, DataCrc *crc)
340*437bfbebSnyanmisaka {
341*437bfbebSnyanmisaka RK_U32 loop = 0;
342*437bfbebSnyanmisaka
343*437bfbebSnyanmisaka if (fp) {
344*437bfbebSnyanmisaka fprintf(fp, "%08d,", crc->len);
345*437bfbebSnyanmisaka for (loop = 0; loop < crc->sum_cnt; loop++) {
346*437bfbebSnyanmisaka fprintf(fp, " %lx,", crc->sum[loop]);
347*437bfbebSnyanmisaka }
348*437bfbebSnyanmisaka fprintf(fp, " %08x\n", crc->vor);
349*437bfbebSnyanmisaka fflush(fp);
350*437bfbebSnyanmisaka }
351*437bfbebSnyanmisaka }
352*437bfbebSnyanmisaka
read_data_crc(FILE * fp,DataCrc * crc)353*437bfbebSnyanmisaka void read_data_crc(FILE *fp, DataCrc *crc)
354*437bfbebSnyanmisaka {
355*437bfbebSnyanmisaka RK_U32 loop = 0;
356*437bfbebSnyanmisaka
357*437bfbebSnyanmisaka if (fp) {
358*437bfbebSnyanmisaka RK_S32 ret = 0;
359*437bfbebSnyanmisaka ret = fscanf(fp, "%8d", &crc->len);
360*437bfbebSnyanmisaka for (loop = 0; loop < crc->sum_cnt; loop++) {
361*437bfbebSnyanmisaka ret |= fscanf(fp, "%lx", &crc->sum[loop]);
362*437bfbebSnyanmisaka }
363*437bfbebSnyanmisaka ret |= fscanf(fp, "%08x", &crc->vor);
364*437bfbebSnyanmisaka if (ret == EOF)
365*437bfbebSnyanmisaka mpp_err_f("unexpected EOF found\n");
366*437bfbebSnyanmisaka }
367*437bfbebSnyanmisaka }
368*437bfbebSnyanmisaka
calc_frm_crc(MppFrame frame,FrmCrc * crc)369*437bfbebSnyanmisaka void calc_frm_crc(MppFrame frame, FrmCrc *crc)
370*437bfbebSnyanmisaka {
371*437bfbebSnyanmisaka RK_ULONG data_grp_byte_cnt = MAX_HALF_WORD_SUM_CNT * CAL_BYTE;
372*437bfbebSnyanmisaka RK_U32 grp_line_cnt = 0;
373*437bfbebSnyanmisaka RK_U32 grp_cnt = 0;
374*437bfbebSnyanmisaka
375*437bfbebSnyanmisaka RK_U32 y = 0, x = 0;
376*437bfbebSnyanmisaka RK_U8 *dat8 = NULL;
377*437bfbebSnyanmisaka RK_U32 *dat32 = NULL;
378*437bfbebSnyanmisaka RK_U32 xor = 0;
379*437bfbebSnyanmisaka
380*437bfbebSnyanmisaka RK_U32 width = mpp_frame_get_width(frame);
381*437bfbebSnyanmisaka RK_U32 height = mpp_frame_get_height(frame);
382*437bfbebSnyanmisaka RK_U32 stride = mpp_frame_get_hor_stride(frame);
383*437bfbebSnyanmisaka RK_U8 *buf = (RK_U8 *)mpp_buffer_get_ptr(mpp_frame_get_buffer(frame));
384*437bfbebSnyanmisaka
385*437bfbebSnyanmisaka grp_line_cnt = data_grp_byte_cnt / ((width + CAL_BYTE - 1) / CAL_BYTE * CAL_BYTE);
386*437bfbebSnyanmisaka
387*437bfbebSnyanmisaka /* luma */
388*437bfbebSnyanmisaka grp_cnt = (height + grp_line_cnt - 1) / grp_line_cnt;
389*437bfbebSnyanmisaka crc->luma.sum_cnt = grp_cnt;
390*437bfbebSnyanmisaka
391*437bfbebSnyanmisaka dat8 = buf;
392*437bfbebSnyanmisaka for (y = 0; y < height / grp_line_cnt * grp_line_cnt; y++) {
393*437bfbebSnyanmisaka wide_bit_sum(&dat8[y * stride], width, &crc->luma.sum[y / grp_line_cnt]);
394*437bfbebSnyanmisaka }
395*437bfbebSnyanmisaka if (height % grp_line_cnt) {
396*437bfbebSnyanmisaka for (y = height / grp_line_cnt * grp_line_cnt; y < height; y++) {
397*437bfbebSnyanmisaka wide_bit_sum(&dat8[y * stride], width, &crc->luma.sum[y / grp_line_cnt]);
398*437bfbebSnyanmisaka }
399*437bfbebSnyanmisaka }
400*437bfbebSnyanmisaka
401*437bfbebSnyanmisaka dat8 = buf;
402*437bfbebSnyanmisaka for (y = 0; y < height; y++) {
403*437bfbebSnyanmisaka dat32 = (RK_U32 *)&dat8[y * stride];
404*437bfbebSnyanmisaka for (x = 0; x < width / 4; x++)
405*437bfbebSnyanmisaka xor ^= dat32[x];
406*437bfbebSnyanmisaka }
407*437bfbebSnyanmisaka crc->luma.len = height * width;
408*437bfbebSnyanmisaka crc->luma.vor = xor;
409*437bfbebSnyanmisaka
410*437bfbebSnyanmisaka /* chroma */
411*437bfbebSnyanmisaka grp_cnt = (height / 2 + grp_line_cnt - 1) / grp_line_cnt;
412*437bfbebSnyanmisaka crc->chroma.sum_cnt = grp_cnt;
413*437bfbebSnyanmisaka
414*437bfbebSnyanmisaka dat8 = buf + height * stride;
415*437bfbebSnyanmisaka for (y = 0; y < height / 2 / grp_line_cnt * grp_line_cnt; y++) {
416*437bfbebSnyanmisaka wide_bit_sum(&dat8[y * stride], width, &crc->chroma.sum[y / grp_line_cnt]);
417*437bfbebSnyanmisaka }
418*437bfbebSnyanmisaka if (height / 2 % grp_line_cnt) {
419*437bfbebSnyanmisaka for (y = height / 2 / grp_line_cnt * grp_line_cnt; y < height / 2; y++) {
420*437bfbebSnyanmisaka wide_bit_sum(&dat8[y * stride], width, &crc->chroma.sum[y / grp_line_cnt]);
421*437bfbebSnyanmisaka }
422*437bfbebSnyanmisaka }
423*437bfbebSnyanmisaka
424*437bfbebSnyanmisaka dat8 = buf + height * stride;
425*437bfbebSnyanmisaka for (y = 0; y < height / 2; y++) {
426*437bfbebSnyanmisaka dat32 = (RK_U32 *)&dat8[y * stride];
427*437bfbebSnyanmisaka for (x = 0; x < width / 4; x++)
428*437bfbebSnyanmisaka xor ^= dat32[x];
429*437bfbebSnyanmisaka }
430*437bfbebSnyanmisaka crc->chroma.len = height * width / 2;
431*437bfbebSnyanmisaka crc->chroma.vor = xor;
432*437bfbebSnyanmisaka }
433*437bfbebSnyanmisaka
write_frm_crc(FILE * fp,FrmCrc * crc)434*437bfbebSnyanmisaka void write_frm_crc(FILE *fp, FrmCrc *crc)
435*437bfbebSnyanmisaka {
436*437bfbebSnyanmisaka RK_U32 loop = 0;
437*437bfbebSnyanmisaka
438*437bfbebSnyanmisaka if (fp) {
439*437bfbebSnyanmisaka // luma
440*437bfbebSnyanmisaka fprintf(fp, "%d,", crc->luma.len);
441*437bfbebSnyanmisaka for (loop = 0; loop < crc->luma.sum_cnt; loop++) {
442*437bfbebSnyanmisaka fprintf(fp, " %lx,", crc->luma.sum[loop]);
443*437bfbebSnyanmisaka }
444*437bfbebSnyanmisaka fprintf(fp, " %08x,", crc->luma.vor);
445*437bfbebSnyanmisaka
446*437bfbebSnyanmisaka // chroma
447*437bfbebSnyanmisaka fprintf(fp, " %d,", crc->chroma.len);
448*437bfbebSnyanmisaka for (loop = 0; loop < crc->chroma.sum_cnt; loop++) {
449*437bfbebSnyanmisaka fprintf(fp, " %lx,", crc->chroma.sum[loop]);
450*437bfbebSnyanmisaka }
451*437bfbebSnyanmisaka fprintf(fp, " %08x\n", crc->chroma.vor);
452*437bfbebSnyanmisaka
453*437bfbebSnyanmisaka fflush(fp);
454*437bfbebSnyanmisaka }
455*437bfbebSnyanmisaka }
456*437bfbebSnyanmisaka
read_frm_crc(FILE * fp,FrmCrc * crc)457*437bfbebSnyanmisaka void read_frm_crc(FILE *fp, FrmCrc *crc)
458*437bfbebSnyanmisaka {
459*437bfbebSnyanmisaka RK_U32 loop = 0;
460*437bfbebSnyanmisaka
461*437bfbebSnyanmisaka if (fp) {
462*437bfbebSnyanmisaka RK_S32 ret = 0;
463*437bfbebSnyanmisaka // luma
464*437bfbebSnyanmisaka ret = fscanf(fp, "%d", &crc->luma.len);
465*437bfbebSnyanmisaka for (loop = 0; loop < crc->luma.sum_cnt; loop++) {
466*437bfbebSnyanmisaka ret |= fscanf(fp, "%lx", &crc->luma.sum[loop]);
467*437bfbebSnyanmisaka }
468*437bfbebSnyanmisaka ret |= fscanf(fp, "%08x", &crc->luma.vor);
469*437bfbebSnyanmisaka
470*437bfbebSnyanmisaka // chroma
471*437bfbebSnyanmisaka ret |= fscanf(fp, "%d", &crc->chroma.len);
472*437bfbebSnyanmisaka for (loop = 0; loop < crc->chroma.sum_cnt; loop++) {
473*437bfbebSnyanmisaka ret |= fscanf(fp, "%lx", &crc->chroma.sum[loop]);
474*437bfbebSnyanmisaka }
475*437bfbebSnyanmisaka ret |= fscanf(fp, "%08x", &crc->chroma.vor);
476*437bfbebSnyanmisaka if (ret == EOF)
477*437bfbebSnyanmisaka mpp_err_f("unexpected EOF found\n");
478*437bfbebSnyanmisaka }
479*437bfbebSnyanmisaka }
480*437bfbebSnyanmisaka
read_with_pixel_width(RK_U8 * buf,RK_S32 width,RK_S32 height,RK_S32 hor_stride,RK_S32 pix_w,FILE * fp)481*437bfbebSnyanmisaka static MPP_RET read_with_pixel_width(RK_U8 *buf, RK_S32 width, RK_S32 height,
482*437bfbebSnyanmisaka RK_S32 hor_stride, RK_S32 pix_w, FILE *fp)
483*437bfbebSnyanmisaka {
484*437bfbebSnyanmisaka RK_S32 row;
485*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
486*437bfbebSnyanmisaka
487*437bfbebSnyanmisaka if (hor_stride < width * pix_w) {
488*437bfbebSnyanmisaka mpp_err_f("invalid %dbit color config: hor_stride %d is smaller then width %d multiply by 4\n",
489*437bfbebSnyanmisaka 8 * pix_w, hor_stride, width, pix_w);
490*437bfbebSnyanmisaka mpp_err_f("width should be defined by pixel count\n");
491*437bfbebSnyanmisaka mpp_err_f("stride should be defined by byte count\n");
492*437bfbebSnyanmisaka
493*437bfbebSnyanmisaka hor_stride = width * pix_w;
494*437bfbebSnyanmisaka }
495*437bfbebSnyanmisaka
496*437bfbebSnyanmisaka for (row = 0; row < height; row++) {
497*437bfbebSnyanmisaka RK_S32 read_size = fread(buf + row * hor_stride, 1, width * pix_w, fp);
498*437bfbebSnyanmisaka if (feof(fp)) {
499*437bfbebSnyanmisaka ret = MPP_NOK;
500*437bfbebSnyanmisaka break;
501*437bfbebSnyanmisaka }
502*437bfbebSnyanmisaka if (read_size != width * pix_w) {
503*437bfbebSnyanmisaka mpp_err_f("read file failed expect %d vs %d\n",
504*437bfbebSnyanmisaka width * pix_w, read_size);
505*437bfbebSnyanmisaka ret = MPP_NOK;
506*437bfbebSnyanmisaka }
507*437bfbebSnyanmisaka }
508*437bfbebSnyanmisaka
509*437bfbebSnyanmisaka return ret;
510*437bfbebSnyanmisaka }
511*437bfbebSnyanmisaka
read_image(RK_U8 * buf,FILE * fp,RK_U32 width,RK_U32 height,RK_U32 hor_stride,RK_U32 ver_stride,MppFrameFormat fmt)512*437bfbebSnyanmisaka MPP_RET read_image(RK_U8 *buf, FILE *fp, RK_U32 width, RK_U32 height,
513*437bfbebSnyanmisaka RK_U32 hor_stride, RK_U32 ver_stride, MppFrameFormat fmt)
514*437bfbebSnyanmisaka {
515*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
516*437bfbebSnyanmisaka RK_U32 read_size;
517*437bfbebSnyanmisaka RK_U32 row = 0;
518*437bfbebSnyanmisaka RK_U8 *buf_y = buf;
519*437bfbebSnyanmisaka RK_U8 *buf_u = buf_y + hor_stride * ver_stride; // NOTE: diff from gen_yuv_image
520*437bfbebSnyanmisaka RK_U8 *buf_v = buf_u + hor_stride * ver_stride / 4; // NOTE: diff from gen_yuv_image
521*437bfbebSnyanmisaka
522*437bfbebSnyanmisaka if (MPP_FRAME_FMT_IS_FBC(fmt)) {
523*437bfbebSnyanmisaka RK_U32 align_w = MPP_ALIGN(width, 16);
524*437bfbebSnyanmisaka RK_U32 align_h = MPP_ALIGN(height, 16);
525*437bfbebSnyanmisaka RK_U32 header_size = 0;
526*437bfbebSnyanmisaka
527*437bfbebSnyanmisaka if ((fmt & MPP_FRAME_FBC_MASK) == MPP_FRAME_FBC_AFBC_V1)
528*437bfbebSnyanmisaka header_size = MPP_ALIGN(align_w * align_h / 16, SZ_4K);
529*437bfbebSnyanmisaka else
530*437bfbebSnyanmisaka header_size = align_w * align_h / 16;
531*437bfbebSnyanmisaka
532*437bfbebSnyanmisaka /* read fbc header first */
533*437bfbebSnyanmisaka read_size = fread(buf, 1, header_size, fp);
534*437bfbebSnyanmisaka if (read_size != header_size) {
535*437bfbebSnyanmisaka mpp_err_f("read fbc file header failed %d vs %d\n",
536*437bfbebSnyanmisaka read_size, header_size);
537*437bfbebSnyanmisaka ret = MPP_NOK;
538*437bfbebSnyanmisaka goto err;
539*437bfbebSnyanmisaka }
540*437bfbebSnyanmisaka buf += header_size;
541*437bfbebSnyanmisaka
542*437bfbebSnyanmisaka switch (fmt & MPP_FRAME_FMT_MASK) {
543*437bfbebSnyanmisaka case MPP_FMT_YUV420SP : {
544*437bfbebSnyanmisaka read_size = fread(buf, 1, align_w * align_h * 3 / 2, fp);
545*437bfbebSnyanmisaka if (read_size != align_w * align_h * 3 / 2) {
546*437bfbebSnyanmisaka mpp_err_f("read 420sp fbc file payload failed %d vs %d\n",
547*437bfbebSnyanmisaka read_size, align_w * align_h * 3 / 2);
548*437bfbebSnyanmisaka ret = MPP_NOK;
549*437bfbebSnyanmisaka goto err;
550*437bfbebSnyanmisaka }
551*437bfbebSnyanmisaka } break;
552*437bfbebSnyanmisaka case MPP_FMT_YUV422SP :
553*437bfbebSnyanmisaka case MPP_FMT_YUV422_YUYV :
554*437bfbebSnyanmisaka case MPP_FMT_YUV422_YVYU :
555*437bfbebSnyanmisaka case MPP_FMT_YUV422_UYVY :
556*437bfbebSnyanmisaka case MPP_FMT_YUV422_VYUY : {
557*437bfbebSnyanmisaka read_size = fread(buf, 1, align_w * align_h * 2, fp);
558*437bfbebSnyanmisaka if (read_size != align_w * align_h * 2) {
559*437bfbebSnyanmisaka mpp_err_f("read 422sp fbc file payload failed %d vs %d\n",
560*437bfbebSnyanmisaka read_size, align_w * align_h * 2);
561*437bfbebSnyanmisaka ret = MPP_NOK;
562*437bfbebSnyanmisaka goto err;
563*437bfbebSnyanmisaka }
564*437bfbebSnyanmisaka } break;
565*437bfbebSnyanmisaka default : {
566*437bfbebSnyanmisaka mpp_err_f("not supported fbc format %x\n", fmt);
567*437bfbebSnyanmisaka } break;
568*437bfbebSnyanmisaka }
569*437bfbebSnyanmisaka
570*437bfbebSnyanmisaka return MPP_OK;
571*437bfbebSnyanmisaka }
572*437bfbebSnyanmisaka
573*437bfbebSnyanmisaka switch (fmt & MPP_FRAME_FMT_MASK) {
574*437bfbebSnyanmisaka case MPP_FMT_YUV420SP_VU:
575*437bfbebSnyanmisaka case MPP_FMT_YUV420SP : {
576*437bfbebSnyanmisaka for (row = 0; row < height; row++) {
577*437bfbebSnyanmisaka read_size = fread(buf_y + row * hor_stride, 1, width, fp);
578*437bfbebSnyanmisaka if (read_size != width) {
579*437bfbebSnyanmisaka ret = MPP_NOK;
580*437bfbebSnyanmisaka goto err;
581*437bfbebSnyanmisaka }
582*437bfbebSnyanmisaka }
583*437bfbebSnyanmisaka
584*437bfbebSnyanmisaka height = MPP_ALIGN(height, 2);
585*437bfbebSnyanmisaka width = MPP_ALIGN(width, 2);
586*437bfbebSnyanmisaka for (row = 0; row < height / 2; row++) {
587*437bfbebSnyanmisaka read_size = fread(buf_u + row * hor_stride, 1, width, fp);
588*437bfbebSnyanmisaka if (read_size != width) {
589*437bfbebSnyanmisaka ret = MPP_NOK;
590*437bfbebSnyanmisaka goto err;
591*437bfbebSnyanmisaka }
592*437bfbebSnyanmisaka }
593*437bfbebSnyanmisaka } break;
594*437bfbebSnyanmisaka case MPP_FMT_YUV420P : {
595*437bfbebSnyanmisaka for (row = 0; row < height; row++) {
596*437bfbebSnyanmisaka read_size = fread(buf_y + row * hor_stride, 1, width, fp);
597*437bfbebSnyanmisaka if (read_size != width) {
598*437bfbebSnyanmisaka ret = MPP_NOK;
599*437bfbebSnyanmisaka goto err;
600*437bfbebSnyanmisaka }
601*437bfbebSnyanmisaka }
602*437bfbebSnyanmisaka
603*437bfbebSnyanmisaka width = MPP_ALIGN(width, 2);
604*437bfbebSnyanmisaka height = MPP_ALIGN(height, 2);
605*437bfbebSnyanmisaka for (row = 0; row < height / 2; row++) {
606*437bfbebSnyanmisaka read_size = fread(buf_u + row * hor_stride / 2, 1, width / 2, fp);
607*437bfbebSnyanmisaka if (read_size != width / 2) {
608*437bfbebSnyanmisaka ret = MPP_NOK;
609*437bfbebSnyanmisaka goto err;
610*437bfbebSnyanmisaka }
611*437bfbebSnyanmisaka }
612*437bfbebSnyanmisaka
613*437bfbebSnyanmisaka for (row = 0; row < height / 2; row++) {
614*437bfbebSnyanmisaka read_size = fread(buf_v + row * hor_stride / 2, 1, width / 2, fp);
615*437bfbebSnyanmisaka if (read_size != width / 2) {
616*437bfbebSnyanmisaka ret = MPP_NOK;
617*437bfbebSnyanmisaka goto err;
618*437bfbebSnyanmisaka }
619*437bfbebSnyanmisaka }
620*437bfbebSnyanmisaka } break;
621*437bfbebSnyanmisaka case MPP_FMT_ARGB8888 :
622*437bfbebSnyanmisaka case MPP_FMT_ABGR8888 :
623*437bfbebSnyanmisaka case MPP_FMT_BGRA8888 :
624*437bfbebSnyanmisaka case MPP_FMT_RGBA8888 :
625*437bfbebSnyanmisaka case MPP_FMT_RGB101010 :
626*437bfbebSnyanmisaka case MPP_FMT_BGR101010 : {
627*437bfbebSnyanmisaka ret = read_with_pixel_width(buf_y, width, height, hor_stride, 4, fp);
628*437bfbebSnyanmisaka } break;
629*437bfbebSnyanmisaka case MPP_FMT_YUV422P :
630*437bfbebSnyanmisaka case MPP_FMT_YUV422SP :
631*437bfbebSnyanmisaka case MPP_FMT_YUV422SP_VU:
632*437bfbebSnyanmisaka case MPP_FMT_BGR444 :
633*437bfbebSnyanmisaka case MPP_FMT_RGB444 :
634*437bfbebSnyanmisaka case MPP_FMT_RGB555 :
635*437bfbebSnyanmisaka case MPP_FMT_BGR555 :
636*437bfbebSnyanmisaka case MPP_FMT_RGB565 :
637*437bfbebSnyanmisaka case MPP_FMT_BGR565 :
638*437bfbebSnyanmisaka case MPP_FMT_YUV422_YUYV :
639*437bfbebSnyanmisaka case MPP_FMT_YUV422_YVYU :
640*437bfbebSnyanmisaka case MPP_FMT_YUV422_UYVY :
641*437bfbebSnyanmisaka case MPP_FMT_YUV422_VYUY : {
642*437bfbebSnyanmisaka ret = read_with_pixel_width(buf_y, width, height, hor_stride, 2, fp);
643*437bfbebSnyanmisaka } break;
644*437bfbebSnyanmisaka case MPP_FMT_YUV444SP :
645*437bfbebSnyanmisaka case MPP_FMT_YUV444P :
646*437bfbebSnyanmisaka case MPP_FMT_RGB888 :
647*437bfbebSnyanmisaka case MPP_FMT_BGR888 : {
648*437bfbebSnyanmisaka ret = read_with_pixel_width(buf_y, width, height, hor_stride, 3, fp);
649*437bfbebSnyanmisaka } break;
650*437bfbebSnyanmisaka case MPP_FMT_YUV400 : {
651*437bfbebSnyanmisaka ret = read_with_pixel_width(buf_y, width, height, hor_stride, 1, fp);
652*437bfbebSnyanmisaka } break;
653*437bfbebSnyanmisaka default : {
654*437bfbebSnyanmisaka mpp_err_f("read image do not support fmt %d\n", fmt);
655*437bfbebSnyanmisaka ret = MPP_ERR_VALUE;
656*437bfbebSnyanmisaka } break;
657*437bfbebSnyanmisaka }
658*437bfbebSnyanmisaka
659*437bfbebSnyanmisaka err:
660*437bfbebSnyanmisaka
661*437bfbebSnyanmisaka return ret;
662*437bfbebSnyanmisaka }
663*437bfbebSnyanmisaka
fill_MPP_FMT_YUV420SP(RK_U8 * buf,RK_U32 width,RK_U32 height,RK_U32 hor_stride,RK_U32 ver_stride,RK_U32 frame_count)664*437bfbebSnyanmisaka static void fill_MPP_FMT_YUV420SP(RK_U8 *buf, RK_U32 width, RK_U32 height,
665*437bfbebSnyanmisaka RK_U32 hor_stride, RK_U32 ver_stride,
666*437bfbebSnyanmisaka RK_U32 frame_count)
667*437bfbebSnyanmisaka {
668*437bfbebSnyanmisaka // MPP_FMT_YUV420SP = ff: nv12
669*437bfbebSnyanmisaka // https://www.fourcc.org/pixel-format/yuv-nv12/
670*437bfbebSnyanmisaka RK_U8 *p = buf;
671*437bfbebSnyanmisaka RK_U32 x, y;
672*437bfbebSnyanmisaka
673*437bfbebSnyanmisaka for (y = 0; y < height; y++, p += hor_stride) {
674*437bfbebSnyanmisaka for (x = 0; x < width; x++) {
675*437bfbebSnyanmisaka p[x] = x + y + frame_count * 3;
676*437bfbebSnyanmisaka }
677*437bfbebSnyanmisaka }
678*437bfbebSnyanmisaka
679*437bfbebSnyanmisaka p = buf + hor_stride * ver_stride;
680*437bfbebSnyanmisaka for (y = 0; y < height / 2; y++, p += hor_stride) {
681*437bfbebSnyanmisaka for (x = 0; x < width / 2; x++) {
682*437bfbebSnyanmisaka p[x * 2 + 0] = 128 + y + frame_count * 2;
683*437bfbebSnyanmisaka p[x * 2 + 1] = 64 + x + frame_count * 5;
684*437bfbebSnyanmisaka }
685*437bfbebSnyanmisaka }
686*437bfbebSnyanmisaka }
687*437bfbebSnyanmisaka
fill_MPP_FMT_YUV422SP(RK_U8 * buf,RK_U32 width,RK_U32 height,RK_U32 hor_stride,RK_U32 ver_stride,RK_U32 frame_count)688*437bfbebSnyanmisaka static void fill_MPP_FMT_YUV422SP(RK_U8 *buf, RK_U32 width, RK_U32 height,
689*437bfbebSnyanmisaka RK_U32 hor_stride, RK_U32 ver_stride,
690*437bfbebSnyanmisaka RK_U32 frame_count)
691*437bfbebSnyanmisaka {
692*437bfbebSnyanmisaka // MPP_FMT_YUV422SP = ff: nv16
693*437bfbebSnyanmisaka // not valid in www.fourcc.org
694*437bfbebSnyanmisaka RK_U8 *p = buf;
695*437bfbebSnyanmisaka RK_U32 x, y;
696*437bfbebSnyanmisaka
697*437bfbebSnyanmisaka for (y = 0; y < height; y++, p += hor_stride) {
698*437bfbebSnyanmisaka for (x = 0; x < width; x++) {
699*437bfbebSnyanmisaka p[x] = x + y + frame_count * 3;
700*437bfbebSnyanmisaka }
701*437bfbebSnyanmisaka }
702*437bfbebSnyanmisaka
703*437bfbebSnyanmisaka p = buf + hor_stride * ver_stride;
704*437bfbebSnyanmisaka for (y = 0; y < height; y++, p += hor_stride) {
705*437bfbebSnyanmisaka for (x = 0; x < width / 2; x++) {
706*437bfbebSnyanmisaka p[x * 2 + 0] = 128 + y / 2 + frame_count * 2;
707*437bfbebSnyanmisaka p[x * 2 + 1] = 64 + x + frame_count * 5;
708*437bfbebSnyanmisaka }
709*437bfbebSnyanmisaka }
710*437bfbebSnyanmisaka }
711*437bfbebSnyanmisaka
get_rgb_color(RK_U32 * R,RK_U32 * G,RK_U32 * B,RK_S32 x,RK_S32 y,RK_S32 frm_cnt)712*437bfbebSnyanmisaka static void get_rgb_color(RK_U32 *R, RK_U32 *G, RK_U32 *B, RK_S32 x, RK_S32 y, RK_S32 frm_cnt)
713*437bfbebSnyanmisaka {
714*437bfbebSnyanmisaka // frame 0 -> red
715*437bfbebSnyanmisaka if (frm_cnt == 0) {
716*437bfbebSnyanmisaka R[0] = 0xff;
717*437bfbebSnyanmisaka G[0] = 0;
718*437bfbebSnyanmisaka B[0] = 0;
719*437bfbebSnyanmisaka return ;
720*437bfbebSnyanmisaka }
721*437bfbebSnyanmisaka
722*437bfbebSnyanmisaka // frame 1 -> green
723*437bfbebSnyanmisaka if (frm_cnt == 1) {
724*437bfbebSnyanmisaka R[0] = 0;
725*437bfbebSnyanmisaka G[0] = 0xff;
726*437bfbebSnyanmisaka B[0] = 0;
727*437bfbebSnyanmisaka return ;
728*437bfbebSnyanmisaka }
729*437bfbebSnyanmisaka
730*437bfbebSnyanmisaka // frame 2 -> blue
731*437bfbebSnyanmisaka if (frm_cnt == 2) {
732*437bfbebSnyanmisaka R[0] = 0;
733*437bfbebSnyanmisaka G[0] = 0;
734*437bfbebSnyanmisaka B[0] = 0xff;
735*437bfbebSnyanmisaka return ;
736*437bfbebSnyanmisaka }
737*437bfbebSnyanmisaka
738*437bfbebSnyanmisaka // moving color bar
739*437bfbebSnyanmisaka RK_U8 Y = (0 + x + y + frm_cnt * 3);
740*437bfbebSnyanmisaka RK_U8 U = (128 + (y / 2) + frm_cnt * 2);
741*437bfbebSnyanmisaka RK_U8 V = (64 + (x / 2) + frm_cnt * 5);
742*437bfbebSnyanmisaka
743*437bfbebSnyanmisaka RK_S32 _R = Y + ((360 * (V - 128)) >> 8);
744*437bfbebSnyanmisaka RK_S32 _G = Y - (((88 * (U - 128) + 184 * (V - 128))) >> 8);
745*437bfbebSnyanmisaka RK_S32 _B = Y + ((455 * (U - 128)) >> 8);
746*437bfbebSnyanmisaka
747*437bfbebSnyanmisaka R[0] = MPP_CLIP3(0, 255, _R);
748*437bfbebSnyanmisaka G[0] = MPP_CLIP3(0, 255, _G);
749*437bfbebSnyanmisaka B[0] = MPP_CLIP3(0, 255, _B);
750*437bfbebSnyanmisaka }
751*437bfbebSnyanmisaka
fill_MPP_FMT_RGB565(RK_U8 * p,RK_U32 R,RK_U32 G,RK_U32 B,RK_U32 be)752*437bfbebSnyanmisaka static void fill_MPP_FMT_RGB565(RK_U8 *p, RK_U32 R, RK_U32 G, RK_U32 B, RK_U32 be)
753*437bfbebSnyanmisaka {
754*437bfbebSnyanmisaka // MPP_FMT_RGB565 = ff: rgb565be
755*437bfbebSnyanmisaka // 16 bit pixel MSB --------> LSB
756*437bfbebSnyanmisaka // (rrrr,rggg,gggb,bbbb)
757*437bfbebSnyanmisaka // big endian | byte 0 | byte 1 |
758*437bfbebSnyanmisaka // little endian | byte 1 | byte 0 |
759*437bfbebSnyanmisaka RK_U16 val = (((R >> 3) & 0x1f) << 11) |
760*437bfbebSnyanmisaka (((G >> 2) & 0x3f) << 5) |
761*437bfbebSnyanmisaka (((B >> 3) & 0x1f) << 0);
762*437bfbebSnyanmisaka if (be) {
763*437bfbebSnyanmisaka p[0] = (val >> 8) & 0xff;
764*437bfbebSnyanmisaka p[1] = (val >> 0) & 0xff;
765*437bfbebSnyanmisaka } else {
766*437bfbebSnyanmisaka p[0] = (val >> 0) & 0xff;
767*437bfbebSnyanmisaka p[1] = (val >> 8) & 0xff;
768*437bfbebSnyanmisaka }
769*437bfbebSnyanmisaka }
770*437bfbebSnyanmisaka
fill_MPP_FMT_BGR565(RK_U8 * p,RK_U32 R,RK_U32 G,RK_U32 B,RK_U32 be)771*437bfbebSnyanmisaka static void fill_MPP_FMT_BGR565(RK_U8 *p, RK_U32 R, RK_U32 G, RK_U32 B, RK_U32 be)
772*437bfbebSnyanmisaka {
773*437bfbebSnyanmisaka // MPP_FMT_BGR565 = ff: bgr565be
774*437bfbebSnyanmisaka // 16 bit pixel MSB --------> LSB
775*437bfbebSnyanmisaka // (bbbb,bggg,gggr,rrrr)
776*437bfbebSnyanmisaka // big endian | byte 0 | byte 1 |
777*437bfbebSnyanmisaka // little endian | byte 1 | byte 0 |
778*437bfbebSnyanmisaka RK_U16 val = (((R >> 3) & 0x1f) << 0) |
779*437bfbebSnyanmisaka (((G >> 2) & 0x3f) << 5) |
780*437bfbebSnyanmisaka (((B >> 3) & 0x1f) << 11);
781*437bfbebSnyanmisaka if (be) {
782*437bfbebSnyanmisaka p[0] = (val >> 8) & 0xff;
783*437bfbebSnyanmisaka p[1] = (val >> 0) & 0xff;
784*437bfbebSnyanmisaka } else {
785*437bfbebSnyanmisaka p[0] = (val >> 0) & 0xff;
786*437bfbebSnyanmisaka p[1] = (val >> 8) & 0xff;
787*437bfbebSnyanmisaka }
788*437bfbebSnyanmisaka }
789*437bfbebSnyanmisaka
fill_MPP_FMT_RGB555(RK_U8 * p,RK_U32 R,RK_U32 G,RK_U32 B,RK_U32 be)790*437bfbebSnyanmisaka static void fill_MPP_FMT_RGB555(RK_U8 *p, RK_U32 R, RK_U32 G, RK_U32 B, RK_U32 be)
791*437bfbebSnyanmisaka {
792*437bfbebSnyanmisaka // MPP_FMT_RGB555 = ff: rgb555be
793*437bfbebSnyanmisaka // 16 bit pixel MSB --------> LSB
794*437bfbebSnyanmisaka // (0rrr,rrgg,gggb,bbbb)
795*437bfbebSnyanmisaka // big endian | byte 0 | byte 1 |
796*437bfbebSnyanmisaka // little endian | byte 1 | byte 0 |
797*437bfbebSnyanmisaka RK_U16 val = (((R >> 3) & 0x1f) << 10) |
798*437bfbebSnyanmisaka (((G >> 3) & 0x1f) << 5) |
799*437bfbebSnyanmisaka (((B >> 3) & 0x1f) << 0);
800*437bfbebSnyanmisaka if (be) {
801*437bfbebSnyanmisaka p[0] = (val >> 8) & 0xff;
802*437bfbebSnyanmisaka p[1] = (val >> 0) & 0xff;
803*437bfbebSnyanmisaka } else {
804*437bfbebSnyanmisaka p[0] = (val >> 0) & 0xff;
805*437bfbebSnyanmisaka p[1] = (val >> 8) & 0xff;
806*437bfbebSnyanmisaka }
807*437bfbebSnyanmisaka }
808*437bfbebSnyanmisaka
fill_MPP_FMT_BGR555(RK_U8 * p,RK_U32 R,RK_U32 G,RK_U32 B,RK_U32 be)809*437bfbebSnyanmisaka static void fill_MPP_FMT_BGR555(RK_U8 *p, RK_U32 R, RK_U32 G, RK_U32 B, RK_U32 be)
810*437bfbebSnyanmisaka {
811*437bfbebSnyanmisaka // MPP_FMT_BGR555 = ff: bgr555be
812*437bfbebSnyanmisaka // 16 bit pixel MSB --------> LSB
813*437bfbebSnyanmisaka // (0bbb,bbgg,gggr,rrrr)
814*437bfbebSnyanmisaka // big endian | byte 0 | byte 1 |
815*437bfbebSnyanmisaka // little endian | byte 1 | byte 0 |
816*437bfbebSnyanmisaka RK_U16 val = (((R >> 3) & 0x1f) << 0) |
817*437bfbebSnyanmisaka (((G >> 3) & 0x1f) << 5) |
818*437bfbebSnyanmisaka (((B >> 3) & 0x1f) << 10);
819*437bfbebSnyanmisaka if (be) {
820*437bfbebSnyanmisaka p[0] = (val >> 8) & 0xff;
821*437bfbebSnyanmisaka p[1] = (val >> 0) & 0xff;
822*437bfbebSnyanmisaka } else {
823*437bfbebSnyanmisaka p[0] = (val >> 0) & 0xff;
824*437bfbebSnyanmisaka p[1] = (val >> 8) & 0xff;
825*437bfbebSnyanmisaka }
826*437bfbebSnyanmisaka }
827*437bfbebSnyanmisaka
fill_MPP_FMT_RGB444(RK_U8 * p,RK_U32 R,RK_U32 G,RK_U32 B,RK_U32 be)828*437bfbebSnyanmisaka static void fill_MPP_FMT_RGB444(RK_U8 *p, RK_U32 R, RK_U32 G, RK_U32 B, RK_U32 be)
829*437bfbebSnyanmisaka {
830*437bfbebSnyanmisaka // MPP_FMT_RGB444 = ff: rgb444be
831*437bfbebSnyanmisaka // 16 bit pixel MSB --------> LSB
832*437bfbebSnyanmisaka // (0000,rrrr,gggg,bbbb)
833*437bfbebSnyanmisaka // big endian | byte 0 | byte 1 |
834*437bfbebSnyanmisaka // little endian | byte 1 | byte 0 |
835*437bfbebSnyanmisaka RK_U16 val = (((R >> 4) & 0xf) << 8) |
836*437bfbebSnyanmisaka (((G >> 4) & 0xf) << 4) |
837*437bfbebSnyanmisaka (((B >> 4) & 0xf) << 0);
838*437bfbebSnyanmisaka if (be) {
839*437bfbebSnyanmisaka p[0] = (val >> 8) & 0xff;
840*437bfbebSnyanmisaka p[1] = (val >> 0) & 0xff;
841*437bfbebSnyanmisaka } else {
842*437bfbebSnyanmisaka p[0] = (val >> 0) & 0xff;
843*437bfbebSnyanmisaka p[1] = (val >> 8) & 0xff;
844*437bfbebSnyanmisaka }
845*437bfbebSnyanmisaka }
846*437bfbebSnyanmisaka
fill_MPP_FMT_BGR444(RK_U8 * p,RK_U32 R,RK_U32 G,RK_U32 B,RK_U32 be)847*437bfbebSnyanmisaka static void fill_MPP_FMT_BGR444(RK_U8 *p, RK_U32 R, RK_U32 G, RK_U32 B, RK_U32 be)
848*437bfbebSnyanmisaka {
849*437bfbebSnyanmisaka // MPP_FMT_BGR444 = ff: bgr444be
850*437bfbebSnyanmisaka // 16 bit pixel MSB --------> LSB
851*437bfbebSnyanmisaka // (0000,bbbb,gggg,rrrr)
852*437bfbebSnyanmisaka // big endian | byte 0 | byte 1 |
853*437bfbebSnyanmisaka // little endian | byte 1 | byte 0 |
854*437bfbebSnyanmisaka RK_U16 val = (((R >> 4) & 0xf) << 0) |
855*437bfbebSnyanmisaka (((G >> 4) & 0xf) << 4) |
856*437bfbebSnyanmisaka (((B >> 4) & 0xf) << 8);
857*437bfbebSnyanmisaka if (be) {
858*437bfbebSnyanmisaka p[0] = (val >> 8) & 0xff;
859*437bfbebSnyanmisaka p[1] = (val >> 0) & 0xff;
860*437bfbebSnyanmisaka } else {
861*437bfbebSnyanmisaka p[0] = (val >> 0) & 0xff;
862*437bfbebSnyanmisaka p[1] = (val >> 8) & 0xff;
863*437bfbebSnyanmisaka }
864*437bfbebSnyanmisaka }
865*437bfbebSnyanmisaka
fill_MPP_FMT_RGB888(RK_U8 * p,RK_U32 R,RK_U32 G,RK_U32 B,RK_U32 be)866*437bfbebSnyanmisaka static void fill_MPP_FMT_RGB888(RK_U8 *p, RK_U32 R, RK_U32 G, RK_U32 B, RK_U32 be)
867*437bfbebSnyanmisaka {
868*437bfbebSnyanmisaka // MPP_FMT_RGB888
869*437bfbebSnyanmisaka // 24 bit pixel MSB --------> LSB
870*437bfbebSnyanmisaka // (rrrr,rrrr,gggg,gggg,bbbb,bbbb)
871*437bfbebSnyanmisaka // big endian | byte 0 | byte 1 | byte 2 |
872*437bfbebSnyanmisaka // little endian | byte 2 | byte 1 | byte 0 |
873*437bfbebSnyanmisaka if (be) {
874*437bfbebSnyanmisaka p[0] = R;
875*437bfbebSnyanmisaka p[1] = G;
876*437bfbebSnyanmisaka p[2] = B;
877*437bfbebSnyanmisaka } else {
878*437bfbebSnyanmisaka p[0] = B;
879*437bfbebSnyanmisaka p[1] = G;
880*437bfbebSnyanmisaka p[2] = R;
881*437bfbebSnyanmisaka }
882*437bfbebSnyanmisaka }
883*437bfbebSnyanmisaka
fill_MPP_FMT_BGR888(RK_U8 * p,RK_U32 R,RK_U32 G,RK_U32 B,RK_U32 be)884*437bfbebSnyanmisaka static void fill_MPP_FMT_BGR888(RK_U8 *p, RK_U32 R, RK_U32 G, RK_U32 B, RK_U32 be)
885*437bfbebSnyanmisaka {
886*437bfbebSnyanmisaka // MPP_FMT_BGR888
887*437bfbebSnyanmisaka // 24 bit pixel MSB --------> LSB
888*437bfbebSnyanmisaka // (bbbb,bbbb,gggg,gggg,rrrr,rrrr)
889*437bfbebSnyanmisaka // big endian | byte 0 | byte 1 | byte 2 |
890*437bfbebSnyanmisaka // little endian | byte 2 | byte 1 | byte 0 |
891*437bfbebSnyanmisaka if (be) {
892*437bfbebSnyanmisaka p[0] = B;
893*437bfbebSnyanmisaka p[1] = G;
894*437bfbebSnyanmisaka p[2] = R;
895*437bfbebSnyanmisaka } else {
896*437bfbebSnyanmisaka p[0] = R;
897*437bfbebSnyanmisaka p[1] = G;
898*437bfbebSnyanmisaka p[2] = B;
899*437bfbebSnyanmisaka }
900*437bfbebSnyanmisaka }
901*437bfbebSnyanmisaka
fill_MPP_FMT_RGB101010(RK_U8 * p,RK_U32 R,RK_U32 G,RK_U32 B,RK_U32 be)902*437bfbebSnyanmisaka static void fill_MPP_FMT_RGB101010(RK_U8 *p, RK_U32 R, RK_U32 G, RK_U32 B, RK_U32 be)
903*437bfbebSnyanmisaka {
904*437bfbebSnyanmisaka // MPP_FMT_RGB101010
905*437bfbebSnyanmisaka // 32 bit pixel MSB --------> LSB
906*437bfbebSnyanmisaka // (00rr,rrrr,rrrr,gggg,gggg,ggbb,bbbb,bbbb)
907*437bfbebSnyanmisaka // big endian | byte 0 | byte 1 | byte 2 | byte 3 |
908*437bfbebSnyanmisaka // little endian | byte 3 | byte 2 | byte 1 | byte 0 |
909*437bfbebSnyanmisaka RK_U32 val = (((R * 4) & 0x3ff) << 20) |
910*437bfbebSnyanmisaka (((G * 4) & 0x3ff) << 10) |
911*437bfbebSnyanmisaka (((B * 4) & 0x3ff) << 0);
912*437bfbebSnyanmisaka if (be) {
913*437bfbebSnyanmisaka p[0] = (val >> 24) & 0xff;
914*437bfbebSnyanmisaka p[1] = (val >> 16) & 0xff;
915*437bfbebSnyanmisaka p[2] = (val >> 8) & 0xff;
916*437bfbebSnyanmisaka p[3] = (val >> 0) & 0xff;
917*437bfbebSnyanmisaka } else {
918*437bfbebSnyanmisaka p[0] = (val >> 0) & 0xff;
919*437bfbebSnyanmisaka p[1] = (val >> 8) & 0xff;
920*437bfbebSnyanmisaka p[2] = (val >> 16) & 0xff;
921*437bfbebSnyanmisaka p[3] = (val >> 24) & 0xff;
922*437bfbebSnyanmisaka }
923*437bfbebSnyanmisaka }
924*437bfbebSnyanmisaka
fill_MPP_FMT_BGR101010(RK_U8 * p,RK_U32 R,RK_U32 G,RK_U32 B,RK_U32 be)925*437bfbebSnyanmisaka static void fill_MPP_FMT_BGR101010(RK_U8 *p, RK_U32 R, RK_U32 G, RK_U32 B, RK_U32 be)
926*437bfbebSnyanmisaka {
927*437bfbebSnyanmisaka // MPP_FMT_BGR101010
928*437bfbebSnyanmisaka // 32 bit pixel MSB --------> LSB
929*437bfbebSnyanmisaka // (00bb,bbbb,bbbb,gggg,gggg,ggrr,rrrr,rrrr)
930*437bfbebSnyanmisaka // big endian | byte 0 | byte 1 | byte 2 | byte 3 |
931*437bfbebSnyanmisaka // little endian | byte 3 | byte 2 | byte 1 | byte 0 |
932*437bfbebSnyanmisaka RK_U32 val = (((R * 4) & 0x3ff) << 0) |
933*437bfbebSnyanmisaka (((G * 4) & 0x3ff) << 10) |
934*437bfbebSnyanmisaka (((B * 4) & 0x3ff) << 20);
935*437bfbebSnyanmisaka if (be) {
936*437bfbebSnyanmisaka p[0] = (val >> 24) & 0xff;
937*437bfbebSnyanmisaka p[1] = (val >> 16) & 0xff;
938*437bfbebSnyanmisaka p[2] = (val >> 8) & 0xff;
939*437bfbebSnyanmisaka p[3] = (val >> 0) & 0xff;
940*437bfbebSnyanmisaka } else {
941*437bfbebSnyanmisaka p[0] = (val >> 0) & 0xff;
942*437bfbebSnyanmisaka p[1] = (val >> 8) & 0xff;
943*437bfbebSnyanmisaka p[2] = (val >> 16) & 0xff;
944*437bfbebSnyanmisaka p[3] = (val >> 24) & 0xff;
945*437bfbebSnyanmisaka }
946*437bfbebSnyanmisaka }
947*437bfbebSnyanmisaka
fill_MPP_FMT_ARGB8888(RK_U8 * p,RK_U32 R,RK_U32 G,RK_U32 B,RK_U32 be)948*437bfbebSnyanmisaka static void fill_MPP_FMT_ARGB8888(RK_U8 *p, RK_U32 R, RK_U32 G, RK_U32 B, RK_U32 be)
949*437bfbebSnyanmisaka {
950*437bfbebSnyanmisaka // MPP_FMT_ARGB8888
951*437bfbebSnyanmisaka // 32 bit pixel MSB --------> LSB
952*437bfbebSnyanmisaka // (XXXX,XXXX,rrrr,rrrr,gggg,gggg,bbbb,bbbb)
953*437bfbebSnyanmisaka // big endian | byte 0 | byte 1 | byte 2 | byte 3 |
954*437bfbebSnyanmisaka // little endian | byte 3 | byte 2 | byte 1 | byte 0 |
955*437bfbebSnyanmisaka if (be) {
956*437bfbebSnyanmisaka p[0] = 0xff;
957*437bfbebSnyanmisaka p[1] = R;
958*437bfbebSnyanmisaka p[2] = G;
959*437bfbebSnyanmisaka p[3] = B;
960*437bfbebSnyanmisaka } else {
961*437bfbebSnyanmisaka p[0] = B;
962*437bfbebSnyanmisaka p[1] = G;
963*437bfbebSnyanmisaka p[2] = R;
964*437bfbebSnyanmisaka p[3] = 0xff;
965*437bfbebSnyanmisaka }
966*437bfbebSnyanmisaka }
967*437bfbebSnyanmisaka
fill_MPP_FMT_ABGR8888(RK_U8 * p,RK_U32 R,RK_U32 G,RK_U32 B,RK_U32 be)968*437bfbebSnyanmisaka static void fill_MPP_FMT_ABGR8888(RK_U8 *p, RK_U32 R, RK_U32 G, RK_U32 B, RK_U32 be)
969*437bfbebSnyanmisaka {
970*437bfbebSnyanmisaka // MPP_FMT_ABGR8888
971*437bfbebSnyanmisaka // 32 bit pixel MSB --------> LSB
972*437bfbebSnyanmisaka // (XXXX,XXXX,bbbb,bbbb,gggg,gggg,rrrr,rrrr)
973*437bfbebSnyanmisaka // big endian | byte 0 | byte 1 | byte 2 | byte 3 |
974*437bfbebSnyanmisaka // little endian | byte 3 | byte 2 | byte 1 | byte 0 |
975*437bfbebSnyanmisaka if (be) {
976*437bfbebSnyanmisaka p[0] = 0xff;
977*437bfbebSnyanmisaka p[1] = B;
978*437bfbebSnyanmisaka p[2] = G;
979*437bfbebSnyanmisaka p[3] = R;
980*437bfbebSnyanmisaka } else {
981*437bfbebSnyanmisaka p[0] = R;
982*437bfbebSnyanmisaka p[1] = G;
983*437bfbebSnyanmisaka p[2] = B;
984*437bfbebSnyanmisaka p[3] = 0xff;
985*437bfbebSnyanmisaka }
986*437bfbebSnyanmisaka }
987*437bfbebSnyanmisaka
fill_MPP_FMT_BGRA8888(RK_U8 * p,RK_U32 R,RK_U32 G,RK_U32 B,RK_U32 be)988*437bfbebSnyanmisaka static void fill_MPP_FMT_BGRA8888(RK_U8 *p, RK_U32 R, RK_U32 G, RK_U32 B, RK_U32 be)
989*437bfbebSnyanmisaka {
990*437bfbebSnyanmisaka // MPP_FMT_BGRA8888
991*437bfbebSnyanmisaka // 32 bit pixel MSB --------> LSB
992*437bfbebSnyanmisaka // (bbbb,bbbb,gggg,gggg,rrrr,rrrr,XXXX,XXXX)
993*437bfbebSnyanmisaka // big endian | byte 0 | byte 1 | byte 2 | byte 3 |
994*437bfbebSnyanmisaka // little endian | byte 3 | byte 2 | byte 1 | byte 0 |
995*437bfbebSnyanmisaka if (be) {
996*437bfbebSnyanmisaka p[0] = B;
997*437bfbebSnyanmisaka p[1] = G;
998*437bfbebSnyanmisaka p[2] = R;
999*437bfbebSnyanmisaka p[3] = 0xff;
1000*437bfbebSnyanmisaka } else {
1001*437bfbebSnyanmisaka p[0] = 0xff;
1002*437bfbebSnyanmisaka p[1] = R;
1003*437bfbebSnyanmisaka p[2] = G;
1004*437bfbebSnyanmisaka p[3] = B;
1005*437bfbebSnyanmisaka }
1006*437bfbebSnyanmisaka }
1007*437bfbebSnyanmisaka
fill_MPP_FMT_RGBA8888(RK_U8 * p,RK_U32 R,RK_U32 G,RK_U32 B,RK_U32 be)1008*437bfbebSnyanmisaka static void fill_MPP_FMT_RGBA8888(RK_U8 *p, RK_U32 R, RK_U32 G, RK_U32 B, RK_U32 be)
1009*437bfbebSnyanmisaka {
1010*437bfbebSnyanmisaka // MPP_FMT_RGBA8888
1011*437bfbebSnyanmisaka // 32 bit pixel MSB --------> LSB
1012*437bfbebSnyanmisaka // (rrrr,rrrr,gggg,gggg,bbbb,bbbb,XXXX,XXXX)
1013*437bfbebSnyanmisaka // big endian | byte 0 | byte 1 | byte 2 | byte 3 |
1014*437bfbebSnyanmisaka // little endian | byte 3 | byte 2 | byte 1 | byte 0 |
1015*437bfbebSnyanmisaka if (be) {
1016*437bfbebSnyanmisaka p[0] = R;
1017*437bfbebSnyanmisaka p[1] = G;
1018*437bfbebSnyanmisaka p[2] = B;
1019*437bfbebSnyanmisaka p[3] = 0xff;
1020*437bfbebSnyanmisaka } else {
1021*437bfbebSnyanmisaka p[0] = 0xff;
1022*437bfbebSnyanmisaka p[1] = B;
1023*437bfbebSnyanmisaka p[2] = G;
1024*437bfbebSnyanmisaka p[3] = R;
1025*437bfbebSnyanmisaka }
1026*437bfbebSnyanmisaka }
1027*437bfbebSnyanmisaka
1028*437bfbebSnyanmisaka typedef void (*FillRgbFunc)(RK_U8 *p, RK_U32 R, RK_U32 G, RK_U32 B, RK_U32 be);
1029*437bfbebSnyanmisaka
1030*437bfbebSnyanmisaka FillRgbFunc fill_rgb_funcs[] = {
1031*437bfbebSnyanmisaka fill_MPP_FMT_RGB565,
1032*437bfbebSnyanmisaka fill_MPP_FMT_BGR565,
1033*437bfbebSnyanmisaka fill_MPP_FMT_RGB555,
1034*437bfbebSnyanmisaka fill_MPP_FMT_BGR555,
1035*437bfbebSnyanmisaka fill_MPP_FMT_RGB444,
1036*437bfbebSnyanmisaka fill_MPP_FMT_BGR444,
1037*437bfbebSnyanmisaka fill_MPP_FMT_RGB888,
1038*437bfbebSnyanmisaka fill_MPP_FMT_BGR888,
1039*437bfbebSnyanmisaka fill_MPP_FMT_RGB101010,
1040*437bfbebSnyanmisaka fill_MPP_FMT_BGR101010,
1041*437bfbebSnyanmisaka fill_MPP_FMT_ARGB8888,
1042*437bfbebSnyanmisaka fill_MPP_FMT_ABGR8888,
1043*437bfbebSnyanmisaka fill_MPP_FMT_BGRA8888,
1044*437bfbebSnyanmisaka fill_MPP_FMT_RGBA8888,
1045*437bfbebSnyanmisaka };
1046*437bfbebSnyanmisaka
util_check_stride_by_pixel(RK_S32 workaround,RK_S32 width,RK_S32 hor_stride,RK_S32 pixel_size)1047*437bfbebSnyanmisaka static RK_S32 util_check_stride_by_pixel(RK_S32 workaround, RK_S32 width,
1048*437bfbebSnyanmisaka RK_S32 hor_stride, RK_S32 pixel_size)
1049*437bfbebSnyanmisaka {
1050*437bfbebSnyanmisaka if (!workaround && hor_stride < width * pixel_size) {
1051*437bfbebSnyanmisaka mpp_log("warning: stride by bytes %d is smarller than width %d mutiple by pixel size %d\n",
1052*437bfbebSnyanmisaka hor_stride, width, pixel_size);
1053*437bfbebSnyanmisaka mpp_log("multiple stride %d by pixel size %d and set new byte stride to %d\n",
1054*437bfbebSnyanmisaka hor_stride, pixel_size, hor_stride * pixel_size);
1055*437bfbebSnyanmisaka workaround = 1;
1056*437bfbebSnyanmisaka }
1057*437bfbebSnyanmisaka
1058*437bfbebSnyanmisaka return workaround;
1059*437bfbebSnyanmisaka }
1060*437bfbebSnyanmisaka
util_check_8_pixel_aligned(RK_S32 workaround,RK_S32 hor_stride,RK_S32 pixel_aign,RK_S32 pixel_size,const char * fmt_name)1061*437bfbebSnyanmisaka static RK_S32 util_check_8_pixel_aligned(RK_S32 workaround, RK_S32 hor_stride,
1062*437bfbebSnyanmisaka RK_S32 pixel_aign, RK_S32 pixel_size,
1063*437bfbebSnyanmisaka const char *fmt_name)
1064*437bfbebSnyanmisaka {
1065*437bfbebSnyanmisaka if (!workaround && hor_stride != MPP_ALIGN_GEN(hor_stride, pixel_aign * pixel_size)) {
1066*437bfbebSnyanmisaka mpp_log("warning: vepu only support 8 aligned horizontal stride in pixel for %s with pixel size %d\n",
1067*437bfbebSnyanmisaka fmt_name, pixel_size);
1068*437bfbebSnyanmisaka mpp_log("set byte stride to %d to match the requirement\n",
1069*437bfbebSnyanmisaka MPP_ALIGN_GEN(hor_stride, pixel_aign * pixel_size));
1070*437bfbebSnyanmisaka workaround = 1;
1071*437bfbebSnyanmisaka }
1072*437bfbebSnyanmisaka
1073*437bfbebSnyanmisaka return workaround;
1074*437bfbebSnyanmisaka }
1075*437bfbebSnyanmisaka
fill_image(RK_U8 * buf,RK_U32 width,RK_U32 height,RK_U32 hor_stride,RK_U32 ver_stride,MppFrameFormat fmt,RK_U32 frame_count)1076*437bfbebSnyanmisaka MPP_RET fill_image(RK_U8 *buf, RK_U32 width, RK_U32 height,
1077*437bfbebSnyanmisaka RK_U32 hor_stride, RK_U32 ver_stride, MppFrameFormat fmt,
1078*437bfbebSnyanmisaka RK_U32 frame_count)
1079*437bfbebSnyanmisaka {
1080*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
1081*437bfbebSnyanmisaka RK_U8 *buf_y = buf;
1082*437bfbebSnyanmisaka RK_U8 *buf_c = buf + hor_stride * ver_stride;
1083*437bfbebSnyanmisaka RK_U32 x, y, i;
1084*437bfbebSnyanmisaka static RK_S32 is_pixel_stride = 0;
1085*437bfbebSnyanmisaka static RK_S32 not_8_pixel = 0;
1086*437bfbebSnyanmisaka
1087*437bfbebSnyanmisaka switch (fmt & MPP_FRAME_FMT_MASK) {
1088*437bfbebSnyanmisaka case MPP_FMT_YUV420SP : {
1089*437bfbebSnyanmisaka fill_MPP_FMT_YUV420SP(buf, width, height, hor_stride, ver_stride, frame_count);
1090*437bfbebSnyanmisaka } break;
1091*437bfbebSnyanmisaka case MPP_FMT_YUV422SP : {
1092*437bfbebSnyanmisaka fill_MPP_FMT_YUV422SP(buf, width, height, hor_stride, ver_stride, frame_count);
1093*437bfbebSnyanmisaka } break;
1094*437bfbebSnyanmisaka case MPP_FMT_YUV420P : {
1095*437bfbebSnyanmisaka RK_U8 *p = buf_y;
1096*437bfbebSnyanmisaka
1097*437bfbebSnyanmisaka for (y = 0; y < height; y++, p += hor_stride) {
1098*437bfbebSnyanmisaka for (x = 0; x < width; x++) {
1099*437bfbebSnyanmisaka p[x] = x + y + frame_count * 3;
1100*437bfbebSnyanmisaka }
1101*437bfbebSnyanmisaka }
1102*437bfbebSnyanmisaka
1103*437bfbebSnyanmisaka p = buf_c;
1104*437bfbebSnyanmisaka for (y = 0; y < height / 2; y++, p += hor_stride / 2) {
1105*437bfbebSnyanmisaka for (x = 0; x < width / 2; x++) {
1106*437bfbebSnyanmisaka p[x] = 128 + y + frame_count * 2;
1107*437bfbebSnyanmisaka }
1108*437bfbebSnyanmisaka }
1109*437bfbebSnyanmisaka
1110*437bfbebSnyanmisaka p = buf_c + hor_stride * ver_stride / 4;
1111*437bfbebSnyanmisaka for (y = 0; y < height / 2; y++, p += hor_stride / 2) {
1112*437bfbebSnyanmisaka for (x = 0; x < width / 2; x++) {
1113*437bfbebSnyanmisaka p[x] = 64 + x + frame_count * 5;
1114*437bfbebSnyanmisaka }
1115*437bfbebSnyanmisaka }
1116*437bfbebSnyanmisaka } break;
1117*437bfbebSnyanmisaka case MPP_FMT_YUV420SP_VU : {
1118*437bfbebSnyanmisaka RK_U8 *p = buf_y;
1119*437bfbebSnyanmisaka
1120*437bfbebSnyanmisaka for (y = 0; y < height; y++, p += hor_stride) {
1121*437bfbebSnyanmisaka for (x = 0; x < width; x++) {
1122*437bfbebSnyanmisaka p[x] = x + y + frame_count * 3;
1123*437bfbebSnyanmisaka }
1124*437bfbebSnyanmisaka }
1125*437bfbebSnyanmisaka
1126*437bfbebSnyanmisaka p = buf_c;
1127*437bfbebSnyanmisaka for (y = 0; y < height / 2; y++, p += hor_stride) {
1128*437bfbebSnyanmisaka for (x = 0; x < width / 2; x++) {
1129*437bfbebSnyanmisaka p[x * 2 + 1] = 128 + y + frame_count * 2;
1130*437bfbebSnyanmisaka p[x * 2 + 0] = 64 + x + frame_count * 5;
1131*437bfbebSnyanmisaka }
1132*437bfbebSnyanmisaka }
1133*437bfbebSnyanmisaka } break;
1134*437bfbebSnyanmisaka case MPP_FMT_YUV422P : {
1135*437bfbebSnyanmisaka RK_U8 *p = buf_y;
1136*437bfbebSnyanmisaka
1137*437bfbebSnyanmisaka for (y = 0; y < height; y++, p += hor_stride) {
1138*437bfbebSnyanmisaka for (x = 0; x < width; x++) {
1139*437bfbebSnyanmisaka p[x] = x + y + frame_count * 3;
1140*437bfbebSnyanmisaka }
1141*437bfbebSnyanmisaka }
1142*437bfbebSnyanmisaka
1143*437bfbebSnyanmisaka p = buf_c;
1144*437bfbebSnyanmisaka for (y = 0; y < height; y++, p += hor_stride / 2) {
1145*437bfbebSnyanmisaka for (x = 0; x < width / 2; x++) {
1146*437bfbebSnyanmisaka p[x] = 128 + y / 2 + frame_count * 2;
1147*437bfbebSnyanmisaka }
1148*437bfbebSnyanmisaka }
1149*437bfbebSnyanmisaka
1150*437bfbebSnyanmisaka p = buf_c + hor_stride * ver_stride / 2;
1151*437bfbebSnyanmisaka for (y = 0; y < height; y++, p += hor_stride / 2) {
1152*437bfbebSnyanmisaka for (x = 0; x < width / 2; x++) {
1153*437bfbebSnyanmisaka p[x] = 64 + x + frame_count * 5;
1154*437bfbebSnyanmisaka }
1155*437bfbebSnyanmisaka }
1156*437bfbebSnyanmisaka } break;
1157*437bfbebSnyanmisaka case MPP_FMT_YUV422SP_VU : {
1158*437bfbebSnyanmisaka RK_U8 *p = buf_y;
1159*437bfbebSnyanmisaka
1160*437bfbebSnyanmisaka for (y = 0; y < height; y++, p += hor_stride) {
1161*437bfbebSnyanmisaka for (x = 0; x < width; x++) {
1162*437bfbebSnyanmisaka p[x] = x + y + frame_count * 3;
1163*437bfbebSnyanmisaka }
1164*437bfbebSnyanmisaka }
1165*437bfbebSnyanmisaka
1166*437bfbebSnyanmisaka p = buf_c;
1167*437bfbebSnyanmisaka for (y = 0; y < height; y++, p += hor_stride) {
1168*437bfbebSnyanmisaka for (x = 0; x < width / 2; x++) {
1169*437bfbebSnyanmisaka p[x * 2 + 1] = 128 + y / 2 + frame_count * 2;
1170*437bfbebSnyanmisaka p[x * 2 + 0] = 64 + x + frame_count * 5;
1171*437bfbebSnyanmisaka }
1172*437bfbebSnyanmisaka }
1173*437bfbebSnyanmisaka } break;
1174*437bfbebSnyanmisaka case MPP_FMT_YUV422_YUYV : {
1175*437bfbebSnyanmisaka RK_U8 *p = buf_y;
1176*437bfbebSnyanmisaka
1177*437bfbebSnyanmisaka for (y = 0; y < height; y++, p += hor_stride) {
1178*437bfbebSnyanmisaka for (x = 0; x < width / 2; x++) {
1179*437bfbebSnyanmisaka p[x * 4 + 0] = x * 2 + 0 + y + frame_count * 3;
1180*437bfbebSnyanmisaka p[x * 4 + 2] = x * 2 + 1 + y + frame_count * 3;
1181*437bfbebSnyanmisaka p[x * 4 + 1] = 128 + y / 2 + frame_count * 2;
1182*437bfbebSnyanmisaka p[x * 4 + 3] = 64 + x + frame_count * 5;
1183*437bfbebSnyanmisaka }
1184*437bfbebSnyanmisaka }
1185*437bfbebSnyanmisaka } break;
1186*437bfbebSnyanmisaka case MPP_FMT_YUV422_YVYU : {
1187*437bfbebSnyanmisaka RK_U8 *p = buf_y;
1188*437bfbebSnyanmisaka
1189*437bfbebSnyanmisaka for (y = 0; y < height; y++, p += hor_stride) {
1190*437bfbebSnyanmisaka for (x = 0; x < width / 2; x++) {
1191*437bfbebSnyanmisaka p[x * 4 + 0] = x * 2 + 0 + y + frame_count * 3;
1192*437bfbebSnyanmisaka p[x * 4 + 2] = x * 2 + 1 + y + frame_count * 3;
1193*437bfbebSnyanmisaka p[x * 4 + 3] = 128 + y / 2 + frame_count * 2;
1194*437bfbebSnyanmisaka p[x * 4 + 1] = 64 + x + frame_count * 5;
1195*437bfbebSnyanmisaka }
1196*437bfbebSnyanmisaka }
1197*437bfbebSnyanmisaka } break;
1198*437bfbebSnyanmisaka case MPP_FMT_YUV422_UYVY : {
1199*437bfbebSnyanmisaka RK_U8 *p = buf_y;
1200*437bfbebSnyanmisaka
1201*437bfbebSnyanmisaka for (y = 0; y < height; y++, p += hor_stride) {
1202*437bfbebSnyanmisaka for (x = 0; x < width / 2; x++) {
1203*437bfbebSnyanmisaka p[x * 4 + 1] = x * 2 + 0 + y + frame_count * 3;
1204*437bfbebSnyanmisaka p[x * 4 + 3] = x * 2 + 1 + y + frame_count * 3;
1205*437bfbebSnyanmisaka p[x * 4 + 0] = 128 + y / 2 + frame_count * 2;
1206*437bfbebSnyanmisaka p[x * 4 + 2] = 64 + x + frame_count * 5;
1207*437bfbebSnyanmisaka }
1208*437bfbebSnyanmisaka }
1209*437bfbebSnyanmisaka } break;
1210*437bfbebSnyanmisaka case MPP_FMT_YUV422_VYUY : {
1211*437bfbebSnyanmisaka RK_U8 *p = buf_y;
1212*437bfbebSnyanmisaka
1213*437bfbebSnyanmisaka for (y = 0; y < height; y++, p += hor_stride) {
1214*437bfbebSnyanmisaka for (x = 0; x < width / 2; x++) {
1215*437bfbebSnyanmisaka p[x * 4 + 1] = x * 2 + 0 + y + frame_count * 3;
1216*437bfbebSnyanmisaka p[x * 4 + 3] = x * 2 + 1 + y + frame_count * 3;
1217*437bfbebSnyanmisaka p[x * 4 + 2] = 128 + y / 2 + frame_count * 2;
1218*437bfbebSnyanmisaka p[x * 4 + 0] = 64 + x + frame_count * 5;
1219*437bfbebSnyanmisaka }
1220*437bfbebSnyanmisaka }
1221*437bfbebSnyanmisaka } break;
1222*437bfbebSnyanmisaka case MPP_FMT_YUV400 : {
1223*437bfbebSnyanmisaka RK_U8 *p = buf_y;
1224*437bfbebSnyanmisaka
1225*437bfbebSnyanmisaka for (y = 0; y < height; y++, p += hor_stride) {
1226*437bfbebSnyanmisaka for (x = 0; x < width; x++) {
1227*437bfbebSnyanmisaka p[x] = x + y + frame_count * 3;
1228*437bfbebSnyanmisaka }
1229*437bfbebSnyanmisaka }
1230*437bfbebSnyanmisaka } break;
1231*437bfbebSnyanmisaka case MPP_FMT_YUV444SP : {
1232*437bfbebSnyanmisaka RK_U8 *p = buf_y;
1233*437bfbebSnyanmisaka
1234*437bfbebSnyanmisaka for (y = 0; y < height; y++, p += hor_stride) {
1235*437bfbebSnyanmisaka for (x = 0; x < width; x++) {
1236*437bfbebSnyanmisaka p[x] = x + y + frame_count * 3;
1237*437bfbebSnyanmisaka }
1238*437bfbebSnyanmisaka }
1239*437bfbebSnyanmisaka
1240*437bfbebSnyanmisaka p = buf + hor_stride * ver_stride;
1241*437bfbebSnyanmisaka for (y = 0; y < height; y++, p += hor_stride * 2) {
1242*437bfbebSnyanmisaka for (x = 0; x < width; x++) {
1243*437bfbebSnyanmisaka p[x * 2 + 0] = 128 + y / 2 + frame_count * 2;
1244*437bfbebSnyanmisaka p[x * 2 + 1] = 64 + x + frame_count * 5;
1245*437bfbebSnyanmisaka }
1246*437bfbebSnyanmisaka }
1247*437bfbebSnyanmisaka } break;
1248*437bfbebSnyanmisaka case MPP_FMT_YUV444P : {
1249*437bfbebSnyanmisaka RK_U8 *p = buf_y;
1250*437bfbebSnyanmisaka
1251*437bfbebSnyanmisaka for (y = 0; y < height; y++, p += hor_stride) {
1252*437bfbebSnyanmisaka for (x = 0; x < width; x++) {
1253*437bfbebSnyanmisaka p[x] = x + y + frame_count * 3;
1254*437bfbebSnyanmisaka }
1255*437bfbebSnyanmisaka }
1256*437bfbebSnyanmisaka p = buf + hor_stride * ver_stride;
1257*437bfbebSnyanmisaka for (y = 0; y < height; y++, p += hor_stride) {
1258*437bfbebSnyanmisaka for (x = 0; x < width; x++) {
1259*437bfbebSnyanmisaka p[x] = 128 + y / 2 + frame_count * 2;
1260*437bfbebSnyanmisaka }
1261*437bfbebSnyanmisaka }
1262*437bfbebSnyanmisaka p = buf + hor_stride * ver_stride * 2;
1263*437bfbebSnyanmisaka for (y = 0; y < height; y++, p += hor_stride) {
1264*437bfbebSnyanmisaka for (x = 0; x < width; x++) {
1265*437bfbebSnyanmisaka p[x] = 64 + x + frame_count * 5;
1266*437bfbebSnyanmisaka }
1267*437bfbebSnyanmisaka }
1268*437bfbebSnyanmisaka } break;
1269*437bfbebSnyanmisaka case MPP_FMT_RGB565 :
1270*437bfbebSnyanmisaka case MPP_FMT_BGR565 :
1271*437bfbebSnyanmisaka case MPP_FMT_RGB555 :
1272*437bfbebSnyanmisaka case MPP_FMT_BGR555 :
1273*437bfbebSnyanmisaka case MPP_FMT_RGB444 :
1274*437bfbebSnyanmisaka case MPP_FMT_BGR444 : {
1275*437bfbebSnyanmisaka RK_U8 *p = buf_y;
1276*437bfbebSnyanmisaka RK_U32 pix_w = 2;
1277*437bfbebSnyanmisaka FillRgbFunc fill = fill_rgb_funcs[fmt - MPP_FRAME_FMT_RGB];
1278*437bfbebSnyanmisaka
1279*437bfbebSnyanmisaka if (util_check_stride_by_pixel(is_pixel_stride, width, hor_stride, pix_w)) {
1280*437bfbebSnyanmisaka hor_stride *= pix_w;
1281*437bfbebSnyanmisaka is_pixel_stride = 1;
1282*437bfbebSnyanmisaka }
1283*437bfbebSnyanmisaka
1284*437bfbebSnyanmisaka if (util_check_8_pixel_aligned(not_8_pixel, hor_stride,
1285*437bfbebSnyanmisaka 8, pix_w, "16bit RGB")) {
1286*437bfbebSnyanmisaka hor_stride = MPP_ALIGN(hor_stride, 16);
1287*437bfbebSnyanmisaka not_8_pixel = 1;
1288*437bfbebSnyanmisaka }
1289*437bfbebSnyanmisaka
1290*437bfbebSnyanmisaka for (y = 0; y < height; y++, p += hor_stride) {
1291*437bfbebSnyanmisaka for (x = 0, i = 0; x < width; x++, i += pix_w) {
1292*437bfbebSnyanmisaka RK_U32 R, G, B;
1293*437bfbebSnyanmisaka
1294*437bfbebSnyanmisaka get_rgb_color(&R, &G, &B, x, y, frame_count);
1295*437bfbebSnyanmisaka fill(p + i, R, G, B, MPP_FRAME_FMT_IS_BE(fmt));
1296*437bfbebSnyanmisaka }
1297*437bfbebSnyanmisaka }
1298*437bfbebSnyanmisaka } break;
1299*437bfbebSnyanmisaka case MPP_FMT_RGB101010 :
1300*437bfbebSnyanmisaka case MPP_FMT_BGR101010 :
1301*437bfbebSnyanmisaka case MPP_FMT_ARGB8888 :
1302*437bfbebSnyanmisaka case MPP_FMT_ABGR8888 :
1303*437bfbebSnyanmisaka case MPP_FMT_BGRA8888 :
1304*437bfbebSnyanmisaka case MPP_FMT_RGBA8888 : {
1305*437bfbebSnyanmisaka RK_U8 *p = buf_y;
1306*437bfbebSnyanmisaka RK_U32 pix_w = 4;
1307*437bfbebSnyanmisaka FillRgbFunc fill = fill_rgb_funcs[fmt - MPP_FRAME_FMT_RGB];
1308*437bfbebSnyanmisaka
1309*437bfbebSnyanmisaka if (util_check_stride_by_pixel(is_pixel_stride, width, hor_stride, pix_w)) {
1310*437bfbebSnyanmisaka hor_stride *= pix_w;
1311*437bfbebSnyanmisaka is_pixel_stride = 1;
1312*437bfbebSnyanmisaka }
1313*437bfbebSnyanmisaka
1314*437bfbebSnyanmisaka if (util_check_8_pixel_aligned(not_8_pixel, hor_stride,
1315*437bfbebSnyanmisaka 8, pix_w, "32bit RGB")) {
1316*437bfbebSnyanmisaka hor_stride = MPP_ALIGN(hor_stride, 32);
1317*437bfbebSnyanmisaka not_8_pixel = 1;
1318*437bfbebSnyanmisaka }
1319*437bfbebSnyanmisaka
1320*437bfbebSnyanmisaka for (y = 0; y < height; y++, p += hor_stride) {
1321*437bfbebSnyanmisaka for (x = 0, i = 0; x < width; x++, i += pix_w) {
1322*437bfbebSnyanmisaka RK_U32 R, G, B;
1323*437bfbebSnyanmisaka
1324*437bfbebSnyanmisaka get_rgb_color(&R, &G, &B, x, y, frame_count);
1325*437bfbebSnyanmisaka fill(p + i, R, G, B, MPP_FRAME_FMT_IS_BE(fmt));
1326*437bfbebSnyanmisaka }
1327*437bfbebSnyanmisaka }
1328*437bfbebSnyanmisaka } break;
1329*437bfbebSnyanmisaka case MPP_FMT_BGR888 :
1330*437bfbebSnyanmisaka case MPP_FMT_RGB888 : {
1331*437bfbebSnyanmisaka RK_U8 *p = buf_y;
1332*437bfbebSnyanmisaka RK_U32 pix_w = 3;
1333*437bfbebSnyanmisaka FillRgbFunc fill = fill_rgb_funcs[fmt - MPP_FRAME_FMT_RGB];
1334*437bfbebSnyanmisaka
1335*437bfbebSnyanmisaka if (util_check_stride_by_pixel(is_pixel_stride, width, hor_stride, pix_w)) {
1336*437bfbebSnyanmisaka hor_stride *= pix_w;
1337*437bfbebSnyanmisaka is_pixel_stride = 1;
1338*437bfbebSnyanmisaka }
1339*437bfbebSnyanmisaka
1340*437bfbebSnyanmisaka if (util_check_8_pixel_aligned(not_8_pixel, hor_stride,
1341*437bfbebSnyanmisaka 8, pix_w, "24bit RGB")) {
1342*437bfbebSnyanmisaka hor_stride = MPP_ALIGN_GEN(hor_stride, 24);
1343*437bfbebSnyanmisaka not_8_pixel = 1;
1344*437bfbebSnyanmisaka }
1345*437bfbebSnyanmisaka
1346*437bfbebSnyanmisaka for (y = 0; y < height; y++, p += hor_stride) {
1347*437bfbebSnyanmisaka for (x = 0, i = 0; x < width; x++, i += pix_w) {
1348*437bfbebSnyanmisaka RK_U32 R, G, B;
1349*437bfbebSnyanmisaka
1350*437bfbebSnyanmisaka get_rgb_color(&R, &G, &B, x, y, frame_count);
1351*437bfbebSnyanmisaka fill(p + i, R, G, B, MPP_FRAME_FMT_IS_BE(fmt));
1352*437bfbebSnyanmisaka }
1353*437bfbebSnyanmisaka }
1354*437bfbebSnyanmisaka } break;
1355*437bfbebSnyanmisaka default : {
1356*437bfbebSnyanmisaka mpp_err_f("filling function do not support type %d\n", fmt);
1357*437bfbebSnyanmisaka ret = MPP_NOK;
1358*437bfbebSnyanmisaka } break;
1359*437bfbebSnyanmisaka }
1360*437bfbebSnyanmisaka return ret;
1361*437bfbebSnyanmisaka }
1362*437bfbebSnyanmisaka
parse_config_line(const char * str,OpsLine * info)1363*437bfbebSnyanmisaka RK_S32 parse_config_line(const char *str, OpsLine *info)
1364*437bfbebSnyanmisaka {
1365*437bfbebSnyanmisaka RK_S32 cnt = sscanf(str, "%*[^,],%d,%[^,],%llu,%llu\n",
1366*437bfbebSnyanmisaka &info->index, info->cmd,
1367*437bfbebSnyanmisaka &info->value1, &info->value2);
1368*437bfbebSnyanmisaka
1369*437bfbebSnyanmisaka return cnt;
1370*437bfbebSnyanmisaka }
1371*437bfbebSnyanmisaka
get_extension(const char * file_name,char * extension)1372*437bfbebSnyanmisaka static void get_extension(const char *file_name, char *extension)
1373*437bfbebSnyanmisaka {
1374*437bfbebSnyanmisaka size_t length = strlen(file_name);
1375*437bfbebSnyanmisaka size_t ext_len = 0;
1376*437bfbebSnyanmisaka size_t i = 0;
1377*437bfbebSnyanmisaka const char *p = file_name + length - 1;
1378*437bfbebSnyanmisaka
1379*437bfbebSnyanmisaka while (p >= file_name) {
1380*437bfbebSnyanmisaka if (p[0] == '.') {
1381*437bfbebSnyanmisaka for (i = 0; i < ext_len; i++)
1382*437bfbebSnyanmisaka extension[i] = tolower(p[i + 1]);
1383*437bfbebSnyanmisaka
1384*437bfbebSnyanmisaka extension[i] = '\0';
1385*437bfbebSnyanmisaka return ;
1386*437bfbebSnyanmisaka }
1387*437bfbebSnyanmisaka ext_len++;
1388*437bfbebSnyanmisaka p--;
1389*437bfbebSnyanmisaka }
1390*437bfbebSnyanmisaka
1391*437bfbebSnyanmisaka extension[0] = '\0';
1392*437bfbebSnyanmisaka }
1393*437bfbebSnyanmisaka
1394*437bfbebSnyanmisaka typedef struct Ext2FrmFmt_t {
1395*437bfbebSnyanmisaka const char *ext_name;
1396*437bfbebSnyanmisaka MppFrameFormat format;
1397*437bfbebSnyanmisaka } Ext2FrmFmt;
1398*437bfbebSnyanmisaka
1399*437bfbebSnyanmisaka Ext2FrmFmt map_ext_to_frm_fmt[] = {
1400*437bfbebSnyanmisaka { "yuv420p", MPP_FMT_YUV420P, },
1401*437bfbebSnyanmisaka { "yuv420sp", MPP_FMT_YUV420SP, },
1402*437bfbebSnyanmisaka { "yuv422p", MPP_FMT_YUV422P, },
1403*437bfbebSnyanmisaka { "yuv422sp", MPP_FMT_YUV422SP, },
1404*437bfbebSnyanmisaka { "yuv422uyvy", MPP_FMT_YUV422_UYVY, },
1405*437bfbebSnyanmisaka { "yuv422vyuy", MPP_FMT_YUV422_VYUY, },
1406*437bfbebSnyanmisaka { "yuv422yuyv", MPP_FMT_YUV422_YUYV, },
1407*437bfbebSnyanmisaka { "yuv422yvyu", MPP_FMT_YUV422_YVYU, },
1408*437bfbebSnyanmisaka
1409*437bfbebSnyanmisaka { "abgr8888", MPP_FMT_ABGR8888, },
1410*437bfbebSnyanmisaka { "argb8888", MPP_FMT_ARGB8888, },
1411*437bfbebSnyanmisaka { "bgr565", MPP_FMT_BGR565, },
1412*437bfbebSnyanmisaka { "bgr888", MPP_FMT_BGR888, },
1413*437bfbebSnyanmisaka { "bgra8888", MPP_FMT_BGRA8888, },
1414*437bfbebSnyanmisaka { "rgb565", MPP_FMT_RGB565, },
1415*437bfbebSnyanmisaka { "rgb888", MPP_FMT_RGB888, },
1416*437bfbebSnyanmisaka { "rgba8888", MPP_FMT_RGBA8888, },
1417*437bfbebSnyanmisaka
1418*437bfbebSnyanmisaka { "fbc", MPP_FMT_YUV420SP | MPP_FRAME_FBC_AFBC_V1, },
1419*437bfbebSnyanmisaka };
1420*437bfbebSnyanmisaka
name_to_frame_format(const char * name,MppFrameFormat * fmt)1421*437bfbebSnyanmisaka MPP_RET name_to_frame_format(const char *name, MppFrameFormat *fmt)
1422*437bfbebSnyanmisaka {
1423*437bfbebSnyanmisaka RK_U32 i;
1424*437bfbebSnyanmisaka MPP_RET ret = MPP_NOK;
1425*437bfbebSnyanmisaka char ext[50];
1426*437bfbebSnyanmisaka
1427*437bfbebSnyanmisaka get_extension(name, ext);
1428*437bfbebSnyanmisaka
1429*437bfbebSnyanmisaka for (i = 0; i < MPP_ARRAY_ELEMS(map_ext_to_frm_fmt); i++) {
1430*437bfbebSnyanmisaka Ext2FrmFmt *info = &map_ext_to_frm_fmt[i];
1431*437bfbebSnyanmisaka
1432*437bfbebSnyanmisaka if (!strcmp(ext, info->ext_name)) {
1433*437bfbebSnyanmisaka *fmt = info->format;
1434*437bfbebSnyanmisaka ret = MPP_OK;
1435*437bfbebSnyanmisaka }
1436*437bfbebSnyanmisaka }
1437*437bfbebSnyanmisaka
1438*437bfbebSnyanmisaka return ret;
1439*437bfbebSnyanmisaka }
1440*437bfbebSnyanmisaka
1441*437bfbebSnyanmisaka typedef struct Ext2Coding_t {
1442*437bfbebSnyanmisaka const char *ext_name;
1443*437bfbebSnyanmisaka MppCodingType coding;
1444*437bfbebSnyanmisaka } Ext2Coding;
1445*437bfbebSnyanmisaka
1446*437bfbebSnyanmisaka Ext2Coding map_ext_to_coding[] = {
1447*437bfbebSnyanmisaka { "h264", MPP_VIDEO_CodingAVC, },
1448*437bfbebSnyanmisaka { "264", MPP_VIDEO_CodingAVC, },
1449*437bfbebSnyanmisaka { "avc", MPP_VIDEO_CodingAVC, },
1450*437bfbebSnyanmisaka
1451*437bfbebSnyanmisaka { "h265", MPP_VIDEO_CodingHEVC, },
1452*437bfbebSnyanmisaka { "265", MPP_VIDEO_CodingHEVC, },
1453*437bfbebSnyanmisaka { "hevc", MPP_VIDEO_CodingHEVC, },
1454*437bfbebSnyanmisaka
1455*437bfbebSnyanmisaka { "jpg", MPP_VIDEO_CodingMJPEG, },
1456*437bfbebSnyanmisaka { "jpeg", MPP_VIDEO_CodingMJPEG, },
1457*437bfbebSnyanmisaka { "mjpeg", MPP_VIDEO_CodingMJPEG, },
1458*437bfbebSnyanmisaka };
1459*437bfbebSnyanmisaka
name_to_coding_type(const char * name,MppCodingType * coding)1460*437bfbebSnyanmisaka MPP_RET name_to_coding_type(const char *name, MppCodingType *coding)
1461*437bfbebSnyanmisaka {
1462*437bfbebSnyanmisaka RK_U32 i;
1463*437bfbebSnyanmisaka MPP_RET ret = MPP_NOK;
1464*437bfbebSnyanmisaka char ext[50];
1465*437bfbebSnyanmisaka
1466*437bfbebSnyanmisaka get_extension(name, ext);
1467*437bfbebSnyanmisaka
1468*437bfbebSnyanmisaka for (i = 0; i < MPP_ARRAY_ELEMS(map_ext_to_coding); i++) {
1469*437bfbebSnyanmisaka Ext2Coding *info = &map_ext_to_coding[i];
1470*437bfbebSnyanmisaka
1471*437bfbebSnyanmisaka if (!strcmp(ext, info->ext_name)) {
1472*437bfbebSnyanmisaka *coding = info->coding;
1473*437bfbebSnyanmisaka ret = MPP_OK;
1474*437bfbebSnyanmisaka }
1475*437bfbebSnyanmisaka }
1476*437bfbebSnyanmisaka
1477*437bfbebSnyanmisaka return ret;
1478*437bfbebSnyanmisaka }
1479*437bfbebSnyanmisaka
1480*437bfbebSnyanmisaka typedef struct FpsCalcImpl_t {
1481*437bfbebSnyanmisaka spinlock_t lock;
1482*437bfbebSnyanmisaka FpsCalcCb callback;
1483*437bfbebSnyanmisaka
1484*437bfbebSnyanmisaka RK_S64 total_start;
1485*437bfbebSnyanmisaka RK_S64 total_count;
1486*437bfbebSnyanmisaka
1487*437bfbebSnyanmisaka RK_S64 last_start;
1488*437bfbebSnyanmisaka RK_S64 last_count;
1489*437bfbebSnyanmisaka } FpsCalcImpl;
1490*437bfbebSnyanmisaka
fps_calc_init(FpsCalc * ctx)1491*437bfbebSnyanmisaka MPP_RET fps_calc_init(FpsCalc *ctx)
1492*437bfbebSnyanmisaka {
1493*437bfbebSnyanmisaka FpsCalcImpl *impl = mpp_calloc(FpsCalcImpl, 1);
1494*437bfbebSnyanmisaka MPP_RET ret = MPP_NOK;
1495*437bfbebSnyanmisaka
1496*437bfbebSnyanmisaka if (impl) {
1497*437bfbebSnyanmisaka mpp_spinlock_init(&impl->lock);
1498*437bfbebSnyanmisaka ret = MPP_OK;
1499*437bfbebSnyanmisaka }
1500*437bfbebSnyanmisaka *ctx = impl;
1501*437bfbebSnyanmisaka
1502*437bfbebSnyanmisaka return ret;
1503*437bfbebSnyanmisaka }
1504*437bfbebSnyanmisaka
fps_calc_deinit(FpsCalc ctx)1505*437bfbebSnyanmisaka MPP_RET fps_calc_deinit(FpsCalc ctx)
1506*437bfbebSnyanmisaka {
1507*437bfbebSnyanmisaka MPP_FREE(ctx);
1508*437bfbebSnyanmisaka
1509*437bfbebSnyanmisaka return MPP_OK;
1510*437bfbebSnyanmisaka }
1511*437bfbebSnyanmisaka
fps_calc_set_cb(FpsCalc ctx,FpsCalcCb cb)1512*437bfbebSnyanmisaka MPP_RET fps_calc_set_cb(FpsCalc ctx, FpsCalcCb cb)
1513*437bfbebSnyanmisaka {
1514*437bfbebSnyanmisaka FpsCalcImpl *impl = (FpsCalcImpl *)ctx;
1515*437bfbebSnyanmisaka
1516*437bfbebSnyanmisaka if (impl)
1517*437bfbebSnyanmisaka impl->callback = cb;
1518*437bfbebSnyanmisaka
1519*437bfbebSnyanmisaka return MPP_OK;
1520*437bfbebSnyanmisaka }
1521*437bfbebSnyanmisaka
fps_calc_inc(FpsCalc ctx)1522*437bfbebSnyanmisaka MPP_RET fps_calc_inc(FpsCalc ctx)
1523*437bfbebSnyanmisaka {
1524*437bfbebSnyanmisaka FpsCalcImpl *impl = (FpsCalcImpl *)ctx;
1525*437bfbebSnyanmisaka RK_S64 total_time = 0;
1526*437bfbebSnyanmisaka RK_S64 total_count = 0;
1527*437bfbebSnyanmisaka RK_S64 last_time = 0;
1528*437bfbebSnyanmisaka RK_S64 last_count = 0;
1529*437bfbebSnyanmisaka
1530*437bfbebSnyanmisaka if (NULL == impl)
1531*437bfbebSnyanmisaka return MPP_OK;
1532*437bfbebSnyanmisaka
1533*437bfbebSnyanmisaka mpp_spinlock_lock(&impl->lock);
1534*437bfbebSnyanmisaka {
1535*437bfbebSnyanmisaka RK_S64 now = mpp_time();
1536*437bfbebSnyanmisaka if (!impl->total_count) {
1537*437bfbebSnyanmisaka impl->total_start = now;
1538*437bfbebSnyanmisaka impl->last_start = now;
1539*437bfbebSnyanmisaka } else {
1540*437bfbebSnyanmisaka RK_S64 elapsed = now - impl->last_start;
1541*437bfbebSnyanmisaka
1542*437bfbebSnyanmisaka // print on each second
1543*437bfbebSnyanmisaka if (elapsed >= 1000000) {
1544*437bfbebSnyanmisaka total_time = now - impl->total_start;
1545*437bfbebSnyanmisaka total_count = impl->total_count;
1546*437bfbebSnyanmisaka last_time = now - impl->last_start;
1547*437bfbebSnyanmisaka last_count = impl->total_count - impl->last_count;
1548*437bfbebSnyanmisaka
1549*437bfbebSnyanmisaka impl->last_start = now;
1550*437bfbebSnyanmisaka impl->last_count = impl->total_count;
1551*437bfbebSnyanmisaka }
1552*437bfbebSnyanmisaka }
1553*437bfbebSnyanmisaka
1554*437bfbebSnyanmisaka impl->total_count++;
1555*437bfbebSnyanmisaka }
1556*437bfbebSnyanmisaka mpp_spinlock_unlock(&impl->lock);
1557*437bfbebSnyanmisaka
1558*437bfbebSnyanmisaka if (impl->callback && total_time)
1559*437bfbebSnyanmisaka impl->callback(total_time, total_count, last_time, last_count);
1560*437bfbebSnyanmisaka
1561*437bfbebSnyanmisaka return MPP_OK;
1562*437bfbebSnyanmisaka }
1563*437bfbebSnyanmisaka
1564*437bfbebSnyanmisaka /*
1565*437bfbebSnyanmisaka * @brief convert a string that discribes decimal, octal and hexadecimal
1566*437bfbebSnyanmisaka * number to a long integer.
1567*437bfbebSnyanmisaka * @param[in] nptr - a string to convert to long integer
1568*437bfbebSnyanmisaka * @param[out] number - long integer converted from a string
1569*437bfbebSnyanmisaka */
str_to_frm_fmt(const char * nptr,long * number)1570*437bfbebSnyanmisaka MPP_RET str_to_frm_fmt(const char *nptr, long *number)
1571*437bfbebSnyanmisaka {
1572*437bfbebSnyanmisaka MPP_RET ret = MPP_NOK;
1573*437bfbebSnyanmisaka
1574*437bfbebSnyanmisaka if (NULL == nptr || NULL == number) {
1575*437bfbebSnyanmisaka mpp_err_f("invalid input nptr %p number %p is_valid %p\n", nptr, number);
1576*437bfbebSnyanmisaka ret = MPP_ERR_NULL_PTR;
1577*437bfbebSnyanmisaka goto RET;
1578*437bfbebSnyanmisaka }
1579*437bfbebSnyanmisaka
1580*437bfbebSnyanmisaka if (nptr) {
1581*437bfbebSnyanmisaka char *endptr = NULL; /* pointer to additional chars */
1582*437bfbebSnyanmisaka long tmp = 0;
1583*437bfbebSnyanmisaka
1584*437bfbebSnyanmisaka /* reset errno to 0 before call */
1585*437bfbebSnyanmisaka errno = 0;
1586*437bfbebSnyanmisaka
1587*437bfbebSnyanmisaka tmp = strtol(nptr, &endptr, 0);
1588*437bfbebSnyanmisaka
1589*437bfbebSnyanmisaka if (nptr == endptr)
1590*437bfbebSnyanmisaka mpp_err("format: 0x%lx invalid (no digits found, 0 returned)", tmp);
1591*437bfbebSnyanmisaka else if (errno == ERANGE && tmp == LONG_MIN)
1592*437bfbebSnyanmisaka mpp_err("format: 0x%lx invalid (underflow occurred)", tmp);
1593*437bfbebSnyanmisaka else if (errno == ERANGE && tmp == LONG_MAX)
1594*437bfbebSnyanmisaka mpp_err("format: 0x%lx invalid (overflow occurred)", tmp);
1595*437bfbebSnyanmisaka else if (errno == EINVAL) /* not in all c99 implementations - gcc OK */
1596*437bfbebSnyanmisaka mpp_err("format: 0x%lx invalid (base contains unsupported value)", tmp);
1597*437bfbebSnyanmisaka else if (errno != 0 && tmp == 0)
1598*437bfbebSnyanmisaka mpp_err("format: 0x%lx invalid (unspecified error occurred)", tmp);
1599*437bfbebSnyanmisaka else if (errno == 0 && nptr && *endptr != 0)
1600*437bfbebSnyanmisaka mpp_err("format: 0x%lx invalid (additional characters remain)", tmp);
1601*437bfbebSnyanmisaka else if (errno == 0 && nptr && !*endptr) {
1602*437bfbebSnyanmisaka if ((tmp < (MPP_FMT_BUTT | MPP_FRAME_FMT_PROP_MASK)) && tmp >= 0) {
1603*437bfbebSnyanmisaka *number = tmp;
1604*437bfbebSnyanmisaka ret = MPP_OK;
1605*437bfbebSnyanmisaka } else {
1606*437bfbebSnyanmisaka mpp_err("format: 0x%lx invalid (not format value)", tmp);
1607*437bfbebSnyanmisaka }
1608*437bfbebSnyanmisaka }
1609*437bfbebSnyanmisaka }
1610*437bfbebSnyanmisaka
1611*437bfbebSnyanmisaka RET:
1612*437bfbebSnyanmisaka return ret;
1613*437bfbebSnyanmisaka }
1614