1 /*
2 * Copyright (C) 2016 Rockchip Electronics Co., Ltd.
3 * Authors:
4 * Zhiqin Wei <wzq@rock-chips.com>
5 *
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 */
18
19 #include <stdint.h>
20 #include <stdlib.h>
21 #include <stdio.h>
22 #include <string.h>
23 #include <math.h>
24 #include <fcntl.h>
25 #include <signal.h>
26 #include <time.h>
27 #include <sys/types.h>
28 #include <errno.h>
29 #include <time.h>
30 #include <unistd.h>
31 #include <sys/types.h>
32 #include <sys/mman.h>
33 #include <linux/stddef.h>
34
35 #include "RgaUtils.h"
36 #include "RockchipRga.h"
37 #include "core/NormalRga.h"
38
39 struct format_table_entry {
40 int format;
41 const char *name;
42 };
43
44 const struct format_table_entry format_table[] = {
45 { RK_FORMAT_RGBA_8888, "rgba8888" },
46 { RK_FORMAT_RGBX_8888, "rgbx8888" },
47 { RK_FORMAT_RGB_888, "rgb888" },
48 { RK_FORMAT_RGB_565, "rgb565" },
49 { RK_FORMAT_RGBA_5551, "rgba5551" },
50 { RK_FORMAT_RGBA_4444, "rgba4444" },
51 { RK_FORMAT_BGRA_8888, "bgra8888" },
52 { RK_FORMAT_BGRX_8888, "bgrx8888" },
53 { RK_FORMAT_BGR_888, "bgr888" },
54 { RK_FORMAT_BGR_565, "bgr565" },
55 { RK_FORMAT_BGRA_5551, "bgra5551" },
56 { RK_FORMAT_BGRA_4444, "bgra4444" },
57
58 { RK_FORMAT_YCbCr_422_SP, "cbcr422sp" },
59 { RK_FORMAT_YCbCr_422_P, "cbcr422p" },
60 { RK_FORMAT_YCbCr_420_SP, "nv12" },
61 { RK_FORMAT_YCbCr_420_P, "cbcr420p" },
62
63 { RK_FORMAT_YCrCb_422_SP, "crcb422sp" },
64 { RK_FORMAT_YCrCb_422_P, "crcb422p" },
65 { RK_FORMAT_YCrCb_420_SP, "crcb420sp" },
66 { RK_FORMAT_YCrCb_420_P, "crcb420p" },
67
68 { RK_FORMAT_BPP1, "bpp1" },
69 { RK_FORMAT_BPP2, "bpp2" },
70 { RK_FORMAT_BPP4, "bpp4" },
71 { RK_FORMAT_BPP8, "bpp8" },
72
73 { RK_FORMAT_Y4, "y4" },
74 { RK_FORMAT_YCbCr_400, "cbcr400" },
75
76 { RK_FORMAT_BGRX_8888, "bgrx8888" },
77
78 { RK_FORMAT_YVYU_422, "yvyu422" },
79 { RK_FORMAT_YVYU_420, "yvyuv420" },
80 { RK_FORMAT_VYUY_422, "vyuy422" },
81 { RK_FORMAT_VYUY_420, "vyuy420" },
82
83 { RK_FORMAT_YUYV_422, "yuyv422" },
84 { RK_FORMAT_YUYV_420, "yuyv420" },
85 { RK_FORMAT_UYVY_422, "uyvy422" },
86 { RK_FORMAT_UYVY_420, "uyvy420" },
87
88 { RK_FORMAT_YCbCr_420_SP_10B, "nv12_10" },
89 { RK_FORMAT_YCrCb_420_SP_10B, "crcb420sp_10" },
90 { RK_FORMAT_YCbCr_422_10b_SP, "cbcr422_10b" },
91 { RK_FORMAT_YCrCb_422_10b_SP, "crcb422_10b" },
92
93 { RK_FORMAT_BGR_565, "bgr565" },
94 { RK_FORMAT_BGRA_5551, "bgra5551" },
95 { RK_FORMAT_BGRA_4444, "bgra4444" },
96
97 { RK_FORMAT_ARGB_8888, "argb8888" },
98 { RK_FORMAT_XRGB_8888, "xrgb8888" },
99 { RK_FORMAT_ARGB_5551, "argb5551" },
100 { RK_FORMAT_ARGB_4444, "argb4444" },
101 { RK_FORMAT_ABGR_8888, "abgr8888" },
102 { RK_FORMAT_XBGR_8888, "xbgr8888" },
103 { RK_FORMAT_ABGR_5551, "abgr5551" },
104 { RK_FORMAT_ABGR_4444, "abgr4444" },
105
106 { RK_FORMAT_RGBA2BPP, "rgba2bpp" },
107
108 { RK_FORMAT_UNKNOWN, "unknown" }
109 };
110
translate_format_str(int format)111 const char *translate_format_str(int format) {
112 format = RkRgaGetRgaFormat(format);
113
114 for (size_t i = 0; i < sizeof(format_table) / sizeof(format_table[0]); i++)
115 if (format_table[i].format == format)
116 return format_table[i].name;
117
118 return "unknown";
119 }
120
get_string_by_format(char * value,int format)121 int get_string_by_format(char *value, int format) {
122 const char *name = NULL;
123
124 if (!value)
125 return -EINVAL;
126
127 name = translate_format_str(format);
128
129 if (strcmp(name, "unknown") != 0) {
130 memcpy(value, name, strlen(name) + 1);
131 } else {
132 printf("Is unsupport format now, please fix");
133 return -EINVAL;
134 }
135
136 return 0;
137 }
138
get_bpp_from_format(int format)139 float get_bpp_from_format(int format) {
140 float bpp = 0;
141
142 #ifdef LINUX
143 if (!(format & 0xFF00 || format == 0)) {
144 format = RkRgaCompatibleFormat(format);
145 }
146 #endif
147
148 switch (format) {
149 #ifdef ANDROID
150 case HAL_PIXEL_FORMAT_RGB_565:
151 bpp = 2;
152 break;
153 case HAL_PIXEL_FORMAT_RGB_888:
154 bpp = 3;
155 break;
156 case HAL_PIXEL_FORMAT_RGBA_8888:
157 case HAL_PIXEL_FORMAT_RGBX_8888:
158 case HAL_PIXEL_FORMAT_BGRA_8888:
159 bpp = 4;
160 break;
161 case HAL_PIXEL_FORMAT_YCrCb_420_SP:
162 case HAL_PIXEL_FORMAT_YCrCb_NV12:
163 case HAL_PIXEL_FORMAT_YCrCb_NV12_VIDEO:
164 bpp = 1.5;
165 break;
166 case HAL_PIXEL_FORMAT_YCrCb_NV12_10:
167 /*RK encoder requires alignment of odd multiples of 256.*/
168 /*Here bpp=2 guarantee to read complete data.*/
169 bpp = 2;
170 break;
171 #endif
172 case RK_FORMAT_RGBA2BPP:
173 return 0.25;
174 case RK_FORMAT_Y4:
175 bpp = 0.5;
176 break;
177 case RK_FORMAT_BPP1:
178 case RK_FORMAT_BPP2:
179 case RK_FORMAT_BPP4:
180 case RK_FORMAT_BPP8:
181 case RK_FORMAT_YCbCr_400:
182 bpp = 1;
183 break;
184 case RK_FORMAT_YCbCr_420_SP:
185 case RK_FORMAT_YCbCr_420_P:
186 case RK_FORMAT_YCrCb_420_P:
187 case RK_FORMAT_YCrCb_420_SP:
188 bpp = 1.5;
189 break;
190 case RK_FORMAT_RGB_565:
191 case RK_FORMAT_RGBA_5551:
192 case RK_FORMAT_RGBA_4444:
193 case RK_FORMAT_BGR_565:
194 case RK_FORMAT_BGRA_5551:
195 case RK_FORMAT_BGRA_4444:
196 case RK_FORMAT_ARGB_5551:
197 case RK_FORMAT_ARGB_4444:
198 case RK_FORMAT_ABGR_5551:
199 case RK_FORMAT_ABGR_4444:
200 case RK_FORMAT_YCbCr_422_SP:
201 case RK_FORMAT_YCbCr_422_P:
202 case RK_FORMAT_YCrCb_422_SP:
203 case RK_FORMAT_YCrCb_422_P:
204 /* yuyv */
205 case RK_FORMAT_YVYU_422:
206 case RK_FORMAT_VYUY_422:
207 case RK_FORMAT_YUYV_422:
208 case RK_FORMAT_UYVY_422:
209 case RK_FORMAT_YVYU_420:
210 case RK_FORMAT_VYUY_420:
211 case RK_FORMAT_YUYV_420:
212 case RK_FORMAT_UYVY_420:
213 bpp = 2;
214 break;
215 /*RK encoder requires alignment of odd multiples of 256.*/
216 /*Here bpp=2 guarantee to read complete data.*/
217 case RK_FORMAT_YCbCr_420_SP_10B:
218 case RK_FORMAT_YCrCb_420_SP_10B:
219 bpp = 2;
220 break;
221 case RK_FORMAT_YCbCr_422_10b_SP:
222 case RK_FORMAT_YCrCb_422_10b_SP:
223 bpp = 2.5;
224 break;
225 case RK_FORMAT_BGR_888:
226 case RK_FORMAT_RGB_888:
227 bpp = 3;
228 break;
229 case RK_FORMAT_RGBA_8888:
230 case RK_FORMAT_RGBX_8888:
231 case RK_FORMAT_BGRA_8888:
232 case RK_FORMAT_BGRX_8888:
233 case RK_FORMAT_ARGB_8888:
234 case RK_FORMAT_XRGB_8888:
235 case RK_FORMAT_ABGR_8888:
236 case RK_FORMAT_XBGR_8888:
237 bpp = 4;
238 break;
239 default:
240 printf("Is unsupport format now, please fix \n");
241 return 0;
242 }
243
244 return bpp;
245 }
246
get_perPixel_stride_from_format(int format)247 int get_perPixel_stride_from_format(int format) {
248 #ifdef LINUX
249 if (!(format & 0xFF00 || format == 0)) {
250 format = RkRgaCompatibleFormat(format);
251 }
252 #endif
253
254 switch (format) {
255 #ifdef ANDROID
256 case HAL_PIXEL_FORMAT_RGB_565:
257 return (2 * 8);
258 case HAL_PIXEL_FORMAT_RGB_888:
259 return (3 * 8);
260 case HAL_PIXEL_FORMAT_RGBA_8888:
261 case HAL_PIXEL_FORMAT_RGBX_8888:
262 case HAL_PIXEL_FORMAT_BGRA_8888:
263 return (4 * 8);
264 case HAL_PIXEL_FORMAT_YCrCb_420_SP:
265 case HAL_PIXEL_FORMAT_YCrCb_NV12:
266 return (1 * 8);
267 case HAL_PIXEL_FORMAT_YCrCb_NV12_10:
268 return (1 * 10);
269 #endif
270 case RK_FORMAT_RGBA2BPP:
271 return 2;
272 case RK_FORMAT_Y4:
273 return 0.5 * 8;
274 case RK_FORMAT_BPP1:
275 case RK_FORMAT_BPP2:
276 case RK_FORMAT_BPP4:
277 case RK_FORMAT_BPP8:
278 case RK_FORMAT_YCbCr_400:
279 case RK_FORMAT_YCbCr_420_SP:
280 case RK_FORMAT_YCbCr_420_P:
281 case RK_FORMAT_YCrCb_420_P:
282 case RK_FORMAT_YCrCb_420_SP:
283 case RK_FORMAT_YCbCr_422_SP:
284 case RK_FORMAT_YCbCr_422_P:
285 case RK_FORMAT_YCrCb_422_SP:
286 case RK_FORMAT_YCrCb_422_P:
287 return (1 * 8);
288 case RK_FORMAT_YCbCr_420_SP_10B:
289 case RK_FORMAT_YCrCb_420_SP_10B:
290 case RK_FORMAT_YCbCr_422_10b_SP:
291 case RK_FORMAT_YCrCb_422_10b_SP:
292 return (1 * 10);
293 case RK_FORMAT_RGB_565:
294 case RK_FORMAT_RGBA_5551:
295 case RK_FORMAT_RGBA_4444:
296 case RK_FORMAT_BGR_565:
297 case RK_FORMAT_BGRA_5551:
298 case RK_FORMAT_BGRA_4444:
299 case RK_FORMAT_ARGB_5551:
300 case RK_FORMAT_ARGB_4444:
301 case RK_FORMAT_ABGR_5551:
302 case RK_FORMAT_ABGR_4444:
303 /* yuyv */
304 case RK_FORMAT_YVYU_422:
305 case RK_FORMAT_VYUY_422:
306 case RK_FORMAT_YUYV_422:
307 case RK_FORMAT_UYVY_422:
308 case RK_FORMAT_YVYU_420:
309 case RK_FORMAT_VYUY_420:
310 case RK_FORMAT_YUYV_420:
311 case RK_FORMAT_UYVY_420:
312 return (2 * 8);
313 case RK_FORMAT_BGR_888:
314 case RK_FORMAT_RGB_888:
315 return (3 * 8);
316 case RK_FORMAT_RGBA_8888:
317 case RK_FORMAT_RGBX_8888:
318 case RK_FORMAT_BGRA_8888:
319 case RK_FORMAT_BGRX_8888:
320 case RK_FORMAT_ARGB_8888:
321 case RK_FORMAT_XRGB_8888:
322 case RK_FORMAT_ABGR_8888:
323 case RK_FORMAT_XBGR_8888:
324 return (4 * 8);
325 default:
326 printf("Is unsupport format now, please fix \n");
327 return 0;
328 }
329 }
330
get_buf_size_by_w_h_f(int w,int h,int f)331 int get_buf_size_by_w_h_f(int w, int h, int f) {
332 float bpp = get_bpp_from_format(f);
333 int size = 0;
334
335 size = (int)w * h * bpp;
336 return size;
337 }
338
get_buf_from_file(void * buf,int f,int sw,int sh,int index)339 int get_buf_from_file(void *buf, int f, int sw, int sh, int index) {
340 #ifdef ANDROID
341 const char *inputFilePath = "/data/in%dw%d-h%d-%s.bin";
342 #endif
343
344 #ifdef LINUX
345 const char *inputFilePath = "/usr/data/in%dw%d-h%d-%s.bin";
346 #endif
347
348 char filePath[100];
349
350 snprintf(filePath, 100, inputFilePath, index, sw, sh, translate_format_str(f));
351
352 FILE *file = fopen(filePath, "rb");
353 if (!file) {
354 fprintf(stderr, "Could not open %s\n", filePath);
355 return -EINVAL;
356 }
357 fread(buf, get_buf_size_by_w_h_f(sw, sh, f), 1, file);
358 fclose(file);
359
360 return 0;
361 }
362
get_buf_from_file_FBC(void * buf,int f,int sw,int sh,int index)363 int get_buf_from_file_FBC(void *buf, int f, int sw, int sh, int index) {
364 #ifdef ANDROID
365 const char *inputFilePath = "/data/in%dw%d-h%d-%s-afbc.bin";
366 #endif
367
368 #ifdef LINUX
369 const char *inputFilePath = "/usr/data/in%dw%d-h%d-%s-afbc.bin";
370 #endif
371
372 char filePath[100];
373 char fstring[30];
374
375 get_string_by_format(fstring, f);
376 snprintf(filePath, 100, inputFilePath, index, sw, sh, fstring);
377
378 FILE *file = fopen(filePath, "rb");
379 if (!file) {
380 fprintf(stderr, "Could not open %s\n", filePath);
381 return -EINVAL;
382 }
383 fread(buf, get_buf_size_by_w_h_f(sw, sh, f) * 1.5, 1, file);
384 fclose(file);
385
386 return 0;
387 }
388
output_buf_data_to_file(void * buf,int f,int sw,int sh,int index)389 int output_buf_data_to_file(void *buf, int f, int sw, int sh, int index) {
390 #ifdef ANDROID
391 const char *outputFilePath = "/data/out%dw%d-h%d-%s.bin";
392 #endif
393
394 #ifdef LINUX
395 const char *outputFilePath = "/usr/data/out%dw%d-h%d-%s.bin";
396 #endif
397
398 char filePath[100];
399
400 snprintf(filePath, 100, outputFilePath, index, sw, sh, translate_format_str(f));
401
402 FILE *file = fopen(filePath, "wb+");
403 if (!file) {
404 fprintf(stderr, "Could not open %s\n", filePath);
405 return false;
406 } else
407 fprintf(stderr, "open %s and write ok\n", filePath);
408 fwrite(buf, get_buf_size_by_w_h_f(sw, sh, f), 1, file);
409 fclose(file);
410
411 return 0;
412 }
413
output_buf_data_to_file_FBC(void * buf,int f,int sw,int sh,int index)414 int output_buf_data_to_file_FBC(void *buf, int f, int sw, int sh, int index) {
415 #ifdef ANDROID
416 const char *outputFilePath = "/data/out%dw%d-h%d-%s-afbc.bin";
417 #endif
418
419 #ifdef LINUX
420 const char *outputFilePath = "/usr/data/out%dw%d-h%d-%s-afbc.bin";
421 #endif
422
423 char filePath[100];
424 char fstring[30];
425
426 get_string_by_format(fstring, f);
427 snprintf(filePath, 100, outputFilePath, index, sw, sh, fstring);
428
429 FILE *file = fopen(filePath, "wb+");
430 if (!file) {
431 fprintf(stderr, "Could not open %s\n", filePath);
432 return false;
433 } else
434 fprintf(stderr, "open %s and write ok\n", filePath);
435 fwrite(buf, get_buf_size_by_w_h_f(sw, sh, f) * 1.5, 1, file);
436 fclose(file);
437
438 return 0;
439 }
440