xref: /OK3568_Linux_fs/external/linux-rga/core/RgaUtils.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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