xref: /rockchip-linux_mpp/utils/utils.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
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