RK_Rga.c
4.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "BaseConfig.h"
#include "JZsdkLib.h"
#include "./RK_Rga.h"
#include "MediaProc/RgaProc/RgaParam.h"
#ifdef RTK_RGA_STATUS_ON
float get_bpp_from_format(int format)
{
float bpp = 0;
switch (format)
{
case RK_FORMAT_RGBA2BPP:
return 0.25;
case RK_FORMAT_Y4:
bpp = 0.5;
break;
case RK_FORMAT_BPP1:
case RK_FORMAT_BPP2:
case RK_FORMAT_BPP4:
case RK_FORMAT_BPP8:
case RK_FORMAT_YCbCr_400:
bpp = 1;
break;
case RK_FORMAT_YCbCr_420_SP:
case RK_FORMAT_YCbCr_420_P:
case RK_FORMAT_YCrCb_420_P:
case RK_FORMAT_YCrCb_420_SP:
bpp = 1.5;
break;
case RK_FORMAT_RGB_565:
case RK_FORMAT_RGBA_5551:
case RK_FORMAT_RGBA_4444:
case RK_FORMAT_BGR_565:
case RK_FORMAT_BGRA_5551:
case RK_FORMAT_BGRA_4444:
case RK_FORMAT_ARGB_5551:
case RK_FORMAT_ARGB_4444:
case RK_FORMAT_ABGR_5551:
case RK_FORMAT_ABGR_4444:
case RK_FORMAT_YCbCr_422_SP:
case RK_FORMAT_YCbCr_422_P:
case RK_FORMAT_YCrCb_422_SP:
case RK_FORMAT_YCrCb_422_P:
/* yuyv */
case RK_FORMAT_YVYU_422:
case RK_FORMAT_VYUY_422:
case RK_FORMAT_YUYV_422:
case RK_FORMAT_UYVY_422:
case RK_FORMAT_YVYU_420:
case RK_FORMAT_VYUY_420:
case RK_FORMAT_YUYV_420:
case RK_FORMAT_UYVY_420:
bpp = 2;
break;
/*RK encoder requires alignment of odd multiples of 256.*/
/*Here bpp=2 guarantee to read complete data.*/
case RK_FORMAT_YCbCr_420_SP_10B:
case RK_FORMAT_YCrCb_420_SP_10B:
bpp = 2;
break;
case RK_FORMAT_YCbCr_422_10b_SP:
case RK_FORMAT_YCrCb_422_10b_SP:
bpp = 2.5;
break;
case RK_FORMAT_BGR_888:
case RK_FORMAT_RGB_888:
bpp = 3;
break;
case RK_FORMAT_RGBA_8888:
case RK_FORMAT_RGBX_8888:
case RK_FORMAT_BGRA_8888:
case RK_FORMAT_BGRX_8888:
case RK_FORMAT_ARGB_8888:
case RK_FORMAT_XRGB_8888:
case RK_FORMAT_ABGR_8888:
case RK_FORMAT_XBGR_8888:
bpp = 4;
break;
default:
printf("Is unsupport format now, please fix \n");
return 0;
}
return bpp;
}
T_JZsdkReturnCode RK_Rga_ImageInit(struct RK_RgaImage **RgaImage, int width, int height, int format,
int Rect_x, int Rect_y, int Rect_w, int Rect_h)
{
if ((*RgaImage) != NULL)
{
return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
}
(*RgaImage) = (struct RK_RgaImage *)malloc(sizeof(struct RK_RgaImage));
if ((*RgaImage) == NULL)
{
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
(*RgaImage)->width = width;
(*RgaImage)->height = height;
(*RgaImage)->format = format;
(*RgaImage)->buf_size = width * height * get_bpp_from_format(format);
(*RgaImage)->buf = (unsigned char *)malloc((*RgaImage)->buf_size * sizeof(unsigned char));
if ((*RgaImage)->buf == NULL)
{
return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
}
(*RgaImage)->handle_param.width = width;
(*RgaImage)->handle_param.height = height;
(*RgaImage)->handle_param.format = format;
(*RgaImage)->handle = importbuffer_virtualaddr((*RgaImage)->buf, &(*RgaImage)->handle_param);
if ((*RgaImage)->handle == 0)
{
printf("importbuffer_virtualaddr failed\n");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
memset(&(*RgaImage)->img, 0, sizeof((*RgaImage)->img));
(*RgaImage)->img = wrapbuffer_handle((*RgaImage)->handle, (*RgaImage)->width, (*RgaImage)->height, (*RgaImage)->format);
(*RgaImage)->rect.x = Rect_x;
(*RgaImage)->rect.y = Rect_y;
(*RgaImage)->rect.width = Rect_w;
(*RgaImage)->rect.height = Rect_h;
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
T_JZsdkReturnCode RK_Rga_ImageDeInit(struct RK_RgaImage **RgaImage)
{
if ((*RgaImage)->handle != 0)
{
releasebuffer_handle((*RgaImage)->handle);
(*RgaImage)->handle = 0;
}
if ((*RgaImage)->buf != NULL)
{
free((*RgaImage)->buf);
(*RgaImage)->buf = NULL;
}
if((*RgaImage) != NULL)
{
free((*RgaImage));
(*RgaImage) = NULL;
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
#endif