xref: /OK3568_Linux_fs/external/linux-rga/docs/Rockchip_Developer_Guide_RGA_CN.md (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1# RGA IM2D API 开发指南
2
3文件标识:RK-KF-YF-403
4
5发布版本:V2.2.2
6
7日期:2023-06-28
8
9文件密级:□绝密   □秘密   □内部资料   ■公开
10
11**免责声明**
12
13本文档按“现状”提供,瑞芯微电子股份有限公司(“本公司”,下同)不对本文档的任何陈述、信息和内容的准确性、可靠性、完整性、适销性、特定目的性和非侵权性提供任何明示或暗示的声明或保证。本文档仅作为使用指导的参考。
14
15由于产品版本升级或其他原因,本文档将可能在未经任何通知的情况下,不定期进行更新或修改。
16
17**商标声明**
18
19“Rockchip”、“瑞芯微”、“瑞芯”均为本公司的注册商标,归本公司所有。
20
21本文档可能提及的其他所有注册商标或商标,由其各自拥有者所有。
22
23**版权所有 © 2022 瑞芯微电子股份有限公司**
24
25超越合理使用范畴,非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传播。
26
27瑞芯微电子股份有限公司
28
29Rockchip Electronics Co., Ltd.
30
31地址:     福建省福州市铜盘路软件园A区18号
32
33网址:     [www.rock-chips.com](http://www.rock-chips.com)
34
35客户服务电话: +86-4007-700-590
36
37客户服务传真: +86-591-83951833
38
39客户服务邮箱: [fae@rock-chips.com](mailto:fae@rock-chips.com)
40
41---
42
43**读者对象**
44
45本文档(本指南)主要适用于以下工程师:
46
47- 技术支持工程师
48- 软件开发工程师
49
50**修订记录**
51
52| **日期**   | **版本** | **作者**           | **修改说明**                                                 |
53| ---------- | -------- | ------------------ | ------------------------------------------------------------ |
54| 2020/06/24 | 1.0.0    | 陈城,李煌         | 初始版本                                                     |
55| 2020/10/16 | 1.0.1    | 陈城,李煌,余乔伟 | 更新部分接口                                                 |
56| 2021/12/07 | 2.0.0    | 陈城,李煌,余乔伟 | 增加RGA3相关支持                                             |
57| 2022/01/20 | 2.1.0    | 陈城,李煌,余乔伟 | - 更新im2d api接口说明<br/>- 更新硬件指标说明,以及对齐限制<br/>- 增加数据结构介绍 |
58| 2022/06/22 | 2.1.1    | 陈城,李煌,余乔伟 | 完善格式支持/对齐说明                                        |
59| 2022/09/15 | 2.2.0    | 陈城,李煌,余乔伟 | - 补充默认值相关说明<br/>- 新增array接口<br/>- 新增task接口<br/>- 新增矩形边框绘制接口 |
60| 2022/02/09 | 2.2.1    | 余乔伟             | 更正文档格式                                                 |
61| 2022/06/28 | 2.2.2    | 余乔伟             | - 增加芯片RK3562介绍<br/>- 完善针对灰度图的注意事项          |
62
63---
64
65**目 录**
66
67[TOC]
68
69---
70
71## 概述
72
73RGA (Raster Graphic Acceleration Unit)是一个独立的2D硬件加速器,可用于加速点/线绘制,执行图像缩放、旋转、bitBlt、alpha混合等常见的2D图形操作。
74
75
76
77### 设计指标
78
79<table>
80   <tr>
81      <td rowspan="2">Version</td>
82      <td rowspan="2">Codename</td>
83      <td rowspan="2">Chip</td>
84      <td rowspan="1" colspan="2">Source</td>
85      <td rowspan="1" colspan="2">Destination</td>
86      <td rowspan="2">Function</td>
87      <td rowspan="2">Pixels/Cycle</td>
88   </tr>
89   <tr>
90       <td>min</td>
91       <td>max</td>
92       <td>min</td>
93       <td>max</td>
94   </tr>
95   <tr>
96      <td rowspan="4">RGA1</td>
97      <td>Pagani</td>
98      <td>RK3066</td>
99      <td rowspan="4">2x2</td>
100      <td rowspan="4">8192x8192</td>
101      <td rowspan="4">2x2</td>
102      <td rowspan="4">2048x2048</td>
103      <td rowspan="4">90/180/270 Rotate<br/>X/Y Mirror<br/>Crop<br/>1/2~8 scale<br/>Alpha blend<br/>Color key<br/>Color fill<br/>ROP<br/>IOMMU(32bit)</td>
104      <td rowspan="4">1</td>
105   </tr>
106   <tr>
107      <td>Jaguar Plus</td>
108      <td>RK3188</td>
109   </tr>
110   <tr>
111      <td>Beetles</td>
112      <td>RK2926/2928</td>
113   </tr>
114   <tr>
115      <td>Beetles Plus</td>
116      <td>RK3026/3028</td>
117   </tr>
118   <tr>
119      <td rowspan="2">RGA1_plus</td>
120      <td>Audi</td>
121      <td>RK3128</td>
122      <td rowspan="2">2x2</td>
123      <td rowspan="2">8192x8192</td>
124      <td rowspan="2">2x2</td>
125      <td rowspan="2">2048x2048</td>
126      <td rowspan="2">90/180/270 Rotate<br/>X/Y Mirror<br/>Crop<br/>1/2~8 scale<br/>Alpha blend<br/>Color key<br/>Color fill<br/>Color palette<br/>IOMMU(32bit)</td>
127      <td rowspan="2">1</td>
128   </tr>
129   <tr>
130      <td>Granite</td>
131      <td>Sofia 3gr</td>
132   </tr>
133   <tr>
134      <td rowspan="2">RGA2</td>
135      <td>Lincoln</td>
136      <td>RK3288/3288w</td>
137      <td rowspan="2">2x2</td>
138      <td rowspan="2">8192x8192</td>
139      <td rowspan="2">2x2</td>
140      <td rowspan="2">4096x4096</td>
141      <td rowspan="2">90/180/270 Rotate<br/>X/Y Mirror<br/>Crop<br/>1/16~16 scale<br/>Alpha blend<br/>Color key<br/>Color fill<br/>Color palette<br/>ROP<br/>IOMMU(32bit)</td>
142      <td rowspan="2">2</td>
143   </tr>
144   <tr>
145      <td>Capricorn</td>
146      <td>RK3190</td>
147   </tr>
148   <tr>
149      <td rowspan="2">RGA2-Lite0</td>
150      <td>Maybach</td>
151      <td>RK3368</td>
152      <td rowspan="2">2x2</td>
153      <td rowspan="2">8192x8192</td>
154      <td rowspan="2">2x2</td>
155      <td rowspan="2">4096x4096</td>
156      <td rowspan="2">90/180/270 Rotate<br/>X/Y Mirror<br/>Crop<br/>1/8~8 scale<br/>Alpha blend<br/>Color key<br/>Color fill<br/>Color palette<br/>ROP<br/>IOMMU(32bit)</td>
157      <td rowspan="2">2</td>
158   </tr>
159   <tr>
160      <td>BMW</td>
161      <td>RK3366</td>
162   </tr>
163   <tr>
164      <td rowspan="4">RGA2-Lite1</td>
165      <td>Benz</td>
166      <td>RK3228</td>
167      <td rowspan="4">2x2</td>
168      <td rowspan="4">8192x8192</td>
169      <td rowspan="4">2x2</td>
170      <td rowspan="4">4096x4096</td>
171      <td rowspan="4">90/180/270 Rotate<br/>X/Y Mirror<br/>Crop<br/>1/8~8 scale<br/>Alpha blend<br/>Color key<br/>Color fill<br/>Color palette<br/>IOMMU(32bit)</td>
172      <td rowspan="4">2</td>
173   </tr>
174   <tr>
175      <td>Infiniti</td>
176      <td>RK3228H</td>
177   </tr>
178   <tr>
179      <td>Gemini</td>
180      <td>RK3326</td>
181   </tr>
182   <tr>
183      <td>Lion</td>
184      <td>RK1808</td>
185   </tr>
186   <tr>
187      <td rowspan="8">RGA2-Enhance</td>
188      <td>Mclaren</td>
189      <td>RK3399</td>
190      <td rowspan="8">2x2</td>
191      <td rowspan="8">8192x8192</td>
192      <td rowspan="8">2x2</td>
193      <td rowspan="8">4096x4096</td>
194      <td rowspan="8">90/180/270 Rotate<br/>X/Y Mirror<br/>Crop<br/>1/16~16 scale<br/>Alpha blend<br/>Color key<br/>Color fill<br/>Color palette<br/>ROP(NA for RV1108/RV1109/RK3566)<br/>NN quantize(NA for RK3399/RV1108)<br/>osd (only RV1106/RV1103)<br/>IOMMU(32bit, RK3528为40bit,NA for RV1106/1103)</td>
195      <td rowspan="8">2</td>
196   </tr>
197   <tr>
198      <td>Mercury</td>
199      <td>RK1108</td>
200   </tr>
201   <tr>
202      <td>Puma</td>
203      <td>RV1126/RV1109</td>
204   </tr>
205   <tr>
206      <td>skylarkV2</td>
207      <td>RK3566/RK3568</td>
208   </tr>
209   <tr>
210      <td>Orion</td>
211      <td>RK3588</td>
212   </tr>
213   <tr>
214      <td>Otter</td>
215      <td>RV1106/1103</td>
216   </tr>
217   <tr>
218       <td>Bull</td>
219       <td>RK3528</td>
220    </tr>
221   <tr>
222       <td>Snipe</td>
223       <td>RK3562</td>
224    </tr>
225      <td rowspan="1">RGA3</td>
226      <td>Orion</td>
227      <td>RK3588</td>
228      <td rowspan="1">68x2</td>
229      <td rowspan="1">8176x8176</td>
230      <td rowspan="1">68x2</td>
231      <td rowspan="1">8128x8128</td>
232      <td rowspan="4">90/180/270 Rotate<br/>X/Y Mirror<br/>Crop<br/>1/8~8 scale<br/>Alpha blend<br/>Color key<br/>FBC<br/>IOMMU(40bit)</td>
233      <td rowspan="1">3 (by pass)<br/>2 (scale)</td>
234   </tr>
235</table>
236
237> 注:
238>
239> 1). 单位时钟周期处理像素的能力为理论数据,实际运行性能表现与带宽、硬件频率等相关,列表数据仅供参考。
240>
241> 2). 除最小输入分辨率限制外,每个通道可设置的实际操作矩形的x、y、width、height参数必须大于等于2。
242>
243> 3). RGA的寻址能力和IOMMU的bit位数是相关联的,例如搭载支持32bit IOMMU的RGA实际的物理地址寻址能力仅支持0~4G的内存空间。
244
245
246
247### 图像格式支持
248
249- Pixel Format conversion, BT.601/BT.709/BT.2020(only RGA3)
250- Dither operation
251
252<table>
253   <tr>
254      <td>Version</td>
255      <td>Codename</td>
256      <td>Chip</td>
257      <td>Input Data Format</td>
258      <td>Output Data Format</td>
259   </tr>
260   <tr>
261      <td rowspan="4">RGA1</td>
262      <td>Pagani</td>
263      <td>RK3066</td>
264      <td rowspan="4"> RK_FORMAT_RGBA_8888<br/>RK_FORMAT_BGRA_8888<br/>RK_FORMAT_ARGB_8888<br/>RK_FORMAT_ABGR_8888<br/>RK_FORMAT_RGBX_8888<br/>RK_FORMAT_BGRX_8888<br/>RK_FORMAT_XRGB_8888<br/>RK_FORMAT_XBGR_8888<br/>RK_FORMAT_RGBA_4444<br/>RK_FORMAT_BGRA_4444<br/>RK_FORMAT_ARGB_4444<br/>RK_FORMAT_ABGR_4444<br/>RK_FORMAT_RGBA_5551<br/>RK_FORMAT_BGRA_5551<br/>RK_FORMAT_ARGB_5551<br/>RK_FORMAT_ABGR_5551<br/>RK_FORMAT_RGB_888<br/>RK_FORMAT_BGR_888<br/>RK_FORMAT_RGB_565<br/>RK_FORMAT_BGR_565<br>RK_FORMAT_YCbCr_420_SP<br/>RK_FORMAT_YCrCbr_420_SP<br/>RK_FORMAT_YCbCr_422_SP<br/>RK_FORMAT_YCrCbr_422_SP<br/>RK_FORMAT_YCbCr_420_P<br/>RK_FORMAT_YCrCbr_420_P<br/>RK_FORMAT_YCbCr_422_P<br/>RK_FORMAT_YCrCbr_422_P<br/>RK_FORMAT_BPP1<br/>RK_FORMAT_BPP2<br/>RK_FORMAT_BPP4<br/>RK_FORMAT_BPP8
265      </td>
266      <td rowspan="4">
267RK_FORMAT_RGBA_8888<br/>RK_FORMAT_BGRA_8888<br/>RK_FORMAT_ARGB_8888<br/>RK_FORMAT_ABGR_8888<br/>RK_FORMAT_RGBX_8888<br/>RK_FORMAT_BGRX_8888<br/>RK_FORMAT_XRGB_8888<br/>RK_FORMAT_XBGR_8888<br/>RK_FORMAT_RGBA_4444<br/>RK_FORMAT_BGRA_4444<br/>RK_FORMAT_ARGB_4444<br/>RK_FORMAT_ABGR_4444<br/>RK_FORMAT_RGBA_5551<br/>RK_FORMAT_BGRA_5551<br/>RK_FORMAT_ARGB_5551<br/>RK_FORMAT_ABGR_5551<br/>RK_FORMAT_RGB_888<br/>RK_FORMAT_BGR_888<br/>RK_FORMAT_RGB_565<br/>RK_FORMAT_BGR_565<br>RK_FORMAT_YCbCr_420_SP (only for Blur/sharpness)<br/>RK_FORMAT_YCrCbr_420_SP (only for Blur/sharpness)<br/>RK_FORMAT_YCbCr_422_SP (only for Blur/sharpness)<br/>RK_FORMAT_YCrCbr_422_SP (only for Blur/sharpness)<br/>RK_FORMAT_YCbCr_420_P (only for Blur/sharpness)<br/>RK_FORMAT_YCrCbr_420_P (only for Blur/sharpness)<br/>RK_FORMAT_YCbCr_422_P (only for Blur/sharpness)<br/>RK_FORMAT_YCrCbr_422_P (only for Blur/sharpness)
268      </td>
269   </tr>
270   <tr>
271      <td>Jaguar Plus</td>
272      <td>RK3188</td>
273   </tr>
274   <tr>
275      <td>Beetles</td>
276      <td>RK2926/2928</td>
277   </tr>
278   <tr>
279      <td>Beetles Plus</td>
280      <td>RK3026/3028</td>
281   </tr>
282   <tr>
283      <td rowspan="2">RGA1_plus</td>
284      <td>Audi</td>
285      <td>RK3128</td>
286      <td rowspan="2"> RK_FORMAT_RGBA_8888<br/>RK_FORMAT_BGRA_8888<br/>RK_FORMAT_ARGB_8888<br/>RK_FORMAT_ABGR_8888<br/>RK_FORMAT_RGBX_8888<br/>RK_FORMAT_BGRX_8888<br/>RK_FORMAT_XRGB_8888<br/>RK_FORMAT_XBGR_8888<br/>RK_FORMAT_RGBA_4444<br/>RK_FORMAT_BGRA_4444<br/>RK_FORMAT_ARGB_4444<br/>RK_FORMAT_ABGR_4444<br/>RK_FORMAT_RGBA_5551<br/>RK_FORMAT_BGRA_5551<br/>RK_FORMAT_ARGB_5551<br/>RK_FORMAT_ABGR_5551<br/>RK_FORMAT_RGB_888<br/>RK_FORMAT_BGR_888<br/>RK_FORMAT_RGB_565<br/>RK_FORMAT_BGR_565<br>RK_FORMAT_YCbCr_420_SP<br/>RK_FORMAT_YCrCbr_420_SP<br/>RK_FORMAT_YCbCr_422_SP<br/>RK_FORMAT_YCrCbr_422_SP<br/>RK_FORMAT_YCbCr_420_P<br/>RK_FORMAT_YCrCbr_420_P<br/>RK_FORMAT_YCbCr_422_P<br/>RK_FORMAT_YCrCbr_422_P<br/>RK_FORMAT_BPP1<br/>RK_FORMAT_BPP2<br/>RK_FORMAT_BPP4<br/>RK_FORMAT_BPP8
287      </td>
288      <td rowspan="2">
289RK_FORMAT_RGBA_8888<br/>RK_FORMAT_BGRA_8888<br/>RK_FORMAT_ARGB_8888<br/>RK_FORMAT_ABGR_8888<br/>RK_FORMAT_RGBX_8888<br/>RK_FORMAT_BGRX_8888<br/>RK_FORMAT_XRGB_8888<br/>RK_FORMAT_XBGR_8888<br/>RK_FORMAT_RGBA_4444<br/>RK_FORMAT_BGRA_4444<br/>RK_FORMAT_ARGB_4444<br/>RK_FORMAT_ABGR_4444<br/>RK_FORMAT_RGBA_5551<br/>RK_FORMAT_BGRA_5551<br/>RK_FORMAT_ARGB_5551<br/>RK_FORMAT_ABGR_5551<br/>RK_FORMAT_RGB_888<br/>RK_FORMAT_BGR_888<br/>RK_FORMAT_RGB_565<br/>RK_FORMAT_BGR_565<br>RK_FORMAT_YCbCr_420_SP (only for normal Bitblt without alpha)<br/>RK_FORMAT_YCrCbr_420_SP (only for normal Bitblt without alpha)<br/>RK_FORMAT_YCbCr_422_SP (only for normal Bitblt without alpha)<br/>RK_FORMAT_YCrCbr_422_SP (only for normal Bitblt without alpha)<br/>RK_FORMAT_YCbCr_420_P (only for normal Bitblt without alpha)<br/>RK_FORMAT_YCrCbr_420_P (only for normal Bitblt without alpha)<br/>RK_FORMAT_YCbCr_422_P (only for normal Bitblt without alpha)<br/>RK_FORMAT_YCrCbr_422_P (only for normal Bitblt without alpha)
290      </td>
291   </tr>
292   <tr>
293      <td>Granite</td>
294      <td>Sofia 3gr</td>
295   </tr>
296   <tr>
297      <td rowspan="2">RGA2</td>
298      <td>Lincoln</td>
299      <td>RK3288/3288w</td>
300      <td rowspan="2"> RK_FORMAT_RGBA_8888<br/>RK_FORMAT_BGRA_8888<br/>RK_FORMAT_ARGB_8888<br/>RK_FORMAT_ABGR_8888<br/>RK_FORMAT_RGBX_8888<br/>RK_FORMAT_BGRX_8888<br/>RK_FORMAT_XRGB_8888<br/>RK_FORMAT_XBGR_8888<br/>RK_FORMAT_RGBA_4444<br/>RK_FORMAT_BGRA_4444<br/>RK_FORMAT_ARGB_4444<br/>RK_FORMAT_ABGR_4444<br/>RK_FORMAT_RGBA_5551<br/>RK_FORMAT_BGRA_5551<br/>RK_FORMAT_ARGB_5551<br/>RK_FORMAT_ABGR_5551<br/>RK_FORMAT_RGB_888<br/>RK_FORMAT_BGR_888<br/>RK_FORMAT_RGB_565<br/>RK_FORMAT_BGR_565<br>RK_FORMAT_YCbCr_420_SP<br/>RK_FORMAT_YCrCbr_420_SP<br/>RK_FORMAT_YCbCr_422_SP<br/>RK_FORMAT_YCrCbr_422_SP<br/>RK_FORMAT_YCbCr_420_P<br/>RK_FORMAT_YCrCbr_420_P<br/>RK_FORMAT_YCbCr_422_P<br/>RK_FORMAT_YCrCbr_422_P<br/>RK_FORMAT_BPP1 (only for color palette)<br/>RK_FORMAT_BPP2 (only for color palette)<br/>RK_FORMAT_BPP4 (only for color palette)<br/>RK_FORMAT_BPP8 (only for color palette)
301      </td>
302      <td rowspan="2"> RK_FORMAT_RGBA_8888<br/>RK_FORMAT_BGRA_8888<br/>RK_FORMAT_ARGB_8888<br/>RK_FORMAT_ABGR_8888<br/>RK_FORMAT_RGBX_8888<br/>RK_FORMAT_BGRX_8888<br/>RK_FORMAT_XRGB_8888<br/>RK_FORMAT_XBGR_8888<br/>RK_FORMAT_RGBA_4444<br/>RK_FORMAT_BGRA_4444<br/>RK_FORMAT_ARGB_4444<br/>RK_FORMAT_ABGR_4444<br/>RK_FORMAT_RGBA_5551<br/>RK_FORMAT_BGRA_5551<br/>RK_FORMAT_ARGB_5551<br/>RK_FORMAT_ABGR_5551<br/>RK_FORMAT_RGB_888<br/>RK_FORMAT_BGR_888<br/>RK_FORMAT_RGB_565<br/>RK_FORMAT_BGR_565<br>RK_FORMAT_YCbCr_420_SP<br/>RK_FORMAT_YCrCbr_420_SP<br/>RK_FORMAT_YCbCr_422_SP<br/>RK_FORMAT_YCrCbr_422_SP<br/>RK_FORMAT_YCbCr_420_P<br/>RK_FORMAT_YCrCbr_420_P<br/>RK_FORMAT_YCbCr_422_P<br/>RK_FORMAT_YCrCbr_422_P
303      </td>
304   </tr>
305   <tr>
306      <td>Capricorn</td>
307      <td>RK3190</td>
308   </tr>
309   <tr>
310      <td rowspan="2">RGA2-Lite0</td>
311      <td>Maybach</td>
312      <td>RK3368</td>
313      <td rowspan="2"> RK_FORMAT_RGBA_8888<br/>RK_FORMAT_BGRA_8888<br/>RK_FORMAT_ARGB_8888<br/>RK_FORMAT_ABGR_8888<br/>RK_FORMAT_RGBX_8888<br/>RK_FORMAT_BGRX_8888<br/>RK_FORMAT_XRGB_8888<br/>RK_FORMAT_XBGR_8888<br/>RK_FORMAT_RGBA_4444<br/>RK_FORMAT_BGRA_4444<br/>RK_FORMAT_ARGB_4444<br/>RK_FORMAT_ABGR_4444<br/>RK_FORMAT_RGBA_5551<br/>RK_FORMAT_BGRA_5551<br/>RK_FORMAT_ARGB_5551<br/>RK_FORMAT_ABGR_5551<br/>RK_FORMAT_RGB_888<br/>RK_FORMAT_BGR_888<br/>RK_FORMAT_RGB_565<br/>RK_FORMAT_BGR_565<br>RK_FORMAT_YCbCr_420_SP<br/>RK_FORMAT_YCrCbr_420_SP<br/>RK_FORMAT_YCbCr_422_SP<br/>RK_FORMAT_YCrCbr_422_SP<br/>RK_FORMAT_YCbCr_420_P<br/>RK_FORMAT_YCrCbr_420_P<br/>RK_FORMAT_YCbCr_422_P<br/>RK_FORMAT_YCrCbr_422_P<br/>RK_FORMAT_BPP1 (only for color palette)<br/>RK_FORMAT_BPP2 (only for color palette)<br/>RK_FORMAT_BPP4 (only for color palette)<br/>RK_FORMAT_BPP8 (only for color palette)
314      </td>
315      <td rowspan="2"> RK_FORMAT_RGBA_8888<br/>RK_FORMAT_BGRA_8888<br/>RK_FORMAT_ARGB_8888<br/>RK_FORMAT_ABGR_8888<br/>RK_FORMAT_RGBX_8888<br/>RK_FORMAT_BGRX_8888<br/>RK_FORMAT_XRGB_8888<br/>RK_FORMAT_XBGR_8888<br/>RK_FORMAT_RGBA_4444<br/>RK_FORMAT_BGRA_4444<br/>RK_FORMAT_ARGB_4444<br/>RK_FORMAT_ABGR_4444<br/>RK_FORMAT_RGBA_5551<br/>RK_FORMAT_BGRA_5551<br/>RK_FORMAT_ARGB_5551<br/>RK_FORMAT_ABGR_5551<br/>RK_FORMAT_RGB_888<br/>RK_FORMAT_BGR_888<br/>RK_FORMAT_RGB_565<br/>RK_FORMAT_BGR_565<br>RK_FORMAT_YCbCr_420_SP<br/>RK_FORMAT_YCrCbr_420_SP<br/>RK_FORMAT_YCbCr_422_SP<br/>RK_FORMAT_YCrCbr_422_SP<br/>RK_FORMAT_YCbCr_420_P<br/>RK_FORMAT_YCrCbr_420_P<br/>RK_FORMAT_YCbCr_422_P<br/>RK_FORMAT_YCrCbr_422_P
316      </td>
317   </tr>
318   <tr>
319      <td>BMW</td>
320      <td>RK3366</td>
321   </tr>
322   <tr>
323      <td rowspan="4">RGA2-Lite1</td>
324      <td>Benz</td>
325      <td>RK3228</td>
326      <td rowspan="4"> RK_FORMAT_RGBA_8888<br/>RK_FORMAT_BGRA_8888<br/>RK_FORMAT_ARGB_8888<br/>RK_FORMAT_ABGR_8888<br/>RK_FORMAT_RGBX_8888<br/>RK_FORMAT_BGRX_8888<br/>RK_FORMAT_XRGB_8888<br/>RK_FORMAT_XBGR_8888<br/>RK_FORMAT_RGBA_4444<br/>RK_FORMAT_BGRA_4444<br/>RK_FORMAT_ARGB_4444<br/>RK_FORMAT_ABGR_4444<br/>RK_FORMAT_RGBA_5551<br/>RK_FORMAT_BGRA_5551<br/>RK_FORMAT_ARGB_5551<br/>RK_FORMAT_ABGR_5551<br/>RK_FORMAT_RGB_888<br/>RK_FORMAT_BGR_888<br/>RK_FORMAT_RGB_565<br/>RK_FORMAT_BGR_565<br>RK_FORMAT_YCbCr_420_SP<br/>RK_FORMAT_YCrCbr_420_SP<br/>RK_FORMAT_YCbCr_422_SP<br/>RK_FORMAT_YCrCbr_422_SP<br/>RK_FORMAT_YCbCr_420_P<br/>RK_FORMAT_YCrCbr_420_P<br/>RK_FORMAT_YCbCr_422_P<br/>RK_FORMAT_YCrCbr_422_P<br/>RK_FORMAT_YCbCr_420_SP_10B<br/>RK_FORMAT_YCrCb_420_SP_10B<br/>RK_FORMAT_YCbCr_422_SP_10B<br/>RK_FORMAT_YCrCb_422_SP_10B<br/>RK_FORMAT_BPP1 (only for color palette)<br/>RK_FORMAT_BPP2 (only for color palette)<br/>RK_FORMAT_BPP4 (only for color palette)<br/>RK_FORMAT_BPP8 (only for color palette)
327      </td>
328      <td rowspan="4"> RK_FORMAT_RGBA_8888<br/>RK_FORMAT_BGRA_8888<br/>RK_FORMAT_ARGB_8888<br/>RK_FORMAT_ABGR_8888<br/>RK_FORMAT_RGBX_8888<br/>RK_FORMAT_BGRX_8888<br/>RK_FORMAT_XRGB_8888<br/>RK_FORMAT_XBGR_8888<br/>RK_FORMAT_RGBA_4444<br/>RK_FORMAT_BGRA_4444<br/>RK_FORMAT_ARGB_4444<br/>RK_FORMAT_ABGR_4444<br/>RK_FORMAT_RGBA_5551<br/>RK_FORMAT_BGRA_5551<br/>RK_FORMAT_ARGB_5551<br/>RK_FORMAT_ABGR_5551<br/>RK_FORMAT_RGB_888<br/>RK_FORMAT_BGR_888<br/>RK_FORMAT_RGB_565<br/>RK_FORMAT_BGR_565<br>RK_FORMAT_YCbCr_420_SP<br/>RK_FORMAT_YCrCbr_420_SP<br/>RK_FORMAT_YCbCr_422_SP<br/>RK_FORMAT_YCrCbr_422_SP<br/>RK_FORMAT_YCbCr_420_P<br/>RK_FORMAT_YCrCbr_420_P<br/>RK_FORMAT_YCbCr_422_P<br/>RK_FORMAT_YCrCbr_422_P
329      </td>
330   </tr>
331   <tr>
332      <td>Infiniti</td>
333      <td>RK3228H</td>
334   </tr>
335   <tr>
336      <td>Gemini</td>
337      <td>RK3326</td>
338   </tr>
339   <tr>
340      <td>Lion</td>
341      <td>RK1808</td>
342   </tr>
343   <tr>
344      <td rowspan="7">RGA2-Enhance</td>
345      <td>Mclaren</td>
346      <td>RK3399</td>
347      <td rowspan="2"> RK_FORMAT_RGBA_8888<br/>RK_FORMAT_BGRA_8888<br/>RK_FORMAT_ARGB_8888<br/>RK_FORMAT_ABGR_8888<br/>RK_FORMAT_RGBX_8888<br/>RK_FORMAT_BGRX_8888<br/>RK_FORMAT_XRGB_8888<br/>RK_FORMAT_XBGR_8888<br/>RK_FORMAT_RGBA_4444<br/>RK_FORMAT_BGRA_4444<br/>RK_FORMAT_ARGB_4444<br/>RK_FORMAT_ABGR_4444<br/>RK_FORMAT_RGBA_5551<br/>RK_FORMAT_BGRA_5551<br/>RK_FORMAT_ARGB_5551<br/>RK_FORMAT_ABGR_5551<br/>RK_FORMAT_RGB_888<br/>RK_FORMAT_BGR_888<br/>RK_FORMAT_RGB_565<br/>RK_FORMAT_BGR_565<br>RK_FORMAT_YCbCr_420_SP<br/>RK_FORMAT_YCrCbr_420_SP<br/>RK_FORMAT_YCbCr_422_SP<br/>RK_FORMAT_YCrCbr_422_SP<br/>RK_FORMAT_YCbCr_420_P<br/>RK_FORMAT_YCrCbr_420_P<br/>RK_FORMAT_YCbCr_422_P<br/>RK_FORMAT_YCrCbr_422_P<br/>RK_FORMAT_YCbCr_420_SP_10B<br/>RK_FORMAT_YCrCb_420_SP_10B<br/>RK_FORMAT_YCbCr_422_SP_10B<br/>RK_FORMAT_YCrCb_422_SP_10B<br/>RK_FORMAT_BPP1 (only for color palette)<br/>RK_FORMAT_BPP2 (only for color palette)<br/>RK_FORMAT_BPP4 (only for color palette)<br/>RK_FORMAT_BPP8 (only for color palette)
348      </td>
349      <td rowspan="2"> RK_FORMAT_RGBA_8888<br/>RK_FORMAT_BGRA_8888<br/>RK_FORMAT_ARGB_8888<br/>RK_FORMAT_ABGR_8888<br/>RK_FORMAT_RGBX_8888<br/>RK_FORMAT_BGRX_8888<br/>RK_FORMAT_XRGB_8888<br/>RK_FORMAT_XBGR_8888<br/>RK_FORMAT_RGBA_4444<br/>RK_FORMAT_BGRA_4444<br/>RK_FORMAT_ARGB_4444<br/>RK_FORMAT_ABGR_4444<br/>RK_FORMAT_RGBA_5551<br/>RK_FORMAT_BGRA_5551<br/>RK_FORMAT_ARGB_5551<br/>RK_FORMAT_ABGR_5551<br/>RK_FORMAT_RGB_888<br/>RK_FORMAT_BGR_888<br/>RK_FORMAT_RGB_565<br/>RK_FORMAT_BGR_565<br>RK_FORMAT_YCbCr_420_SP<br/>RK_FORMAT_YCrCbr_420_SP<br/>RK_FORMAT_YCbCr_422_SP<br/>RK_FORMAT_YCrCbr_422_SP<br/>RK_FORMAT_YCbCr_420_P<br/>RK_FORMAT_YCrCbr_420_P<br/>RK_FORMAT_YCbCr_422_P<br/>RK_FORMAT_YCrCbr_422_P<br/>RK_FORMAT_YUYV_422<br/>RK_FORMAT_YVYU_422<br/>RK_FORMAT_UYVY_422<br/>RK_FORMAT_VYUY_422
350      </td>
351   </tr>
352   <tr>
353      <td>Mercury</td>
354      <td>RK1108</td>
355   </tr>
356   <tr>
357      <td>Puma</td>
358      <td>RV1126/ RV1109</td>
359      <td rowspan="5"> RK_FORMAT_RGBA_8888<br/>RK_FORMAT_BGRA_8888<br/>RK_FORMAT_ARGB_8888<br/>RK_FORMAT_ABGR_8888<br/>RK_FORMAT_RGBX_8888<br/>RK_FORMAT_BGRX_8888<br/>RK_FORMAT_XRGB_8888<br/>RK_FORMAT_XBGR_8888<br/>RK_FORMAT_RGBA_4444<br/>RK_FORMAT_BGRA_4444<br/>RK_FORMAT_ARGB_4444<br/>RK_FORMAT_ABGR_4444<br/>RK_FORMAT_RGBA_5551<br/>RK_FORMAT_BGRA_5551<br/>RK_FORMAT_ARGB_5551<br/>RK_FORMAT_ABGR_5551<br/>RK_FORMAT_RGB_888<br/>RK_FORMAT_BGR_888<br/>RK_FORMAT_RGB_565<br/>RK_FORMAT_BGR_565<br>RK_FORMAT_YCbCr_420_SP<br/>RK_FORMAT_YCrCbr_420_SP<br/>RK_FORMAT_YCbCr_422_SP<br/>RK_FORMAT_YCrCbr_422_SP<br/>RK_FORMAT_YCbCr_420_P<br/>RK_FORMAT_YCrCbr_420_P<br/>RK_FORMAT_YCbCr_422_P<br/>RK_FORMAT_YCrCbr_422_P<br/>RK_FORMAT_YUYV_422<br/>RK_FORMAT_YVYU_422<br/>RK_FORMAT_UYVY_422<br/>RK_FORMAT_VYUY_422<br/>RK_FORMAT_YCbCr_400<br/>RK_FORMAT_YCbCr_420_SP_10B<br/>RK_FORMAT_YCrCb_420_SP_10B<br/>RK_FORMAT_YCbCr_422_SP_10B<br/>RK_FORMAT_YCrCb_422_SP_10B<br/>RK_FORMAT_BPP1 (only for color palette)<br/>RK_FORMAT_BPP2 (only for color palette)<br/>RK_FORMAT_BPP4 (only for color palette)<br/>RK_FORMAT_BPP8 (only for color palette)
360      </td>
361      <td rowspan="5">
362RK_FORMAT_RGBA_8888<br/>RK_FORMAT_BGRA_8888<br/>RK_FORMAT_ARGB_8888<br/>RK_FORMAT_ABGR_8888<br/>RK_FORMAT_RGBX_8888<br/>RK_FORMAT_BGRX_8888<br/>RK_FORMAT_XRGB_8888<br/>RK_FORMAT_XBGR_8888<br/>RK_FORMAT_RGBA_4444<br/>RK_FORMAT_BGRA_4444<br/>RK_FORMAT_ARGB_4444<br/>RK_FORMAT_ABGR_4444<br/>RK_FORMAT_RGBA_5551<br/>RK_FORMAT_BGRA_5551<br/>RK_FORMAT_ARGB_5551<br/>RK_FORMAT_ABGR_5551<br/>RK_FORMAT_RGB_888<br/>RK_FORMAT_BGR_888<br/>RK_FORMAT_RGB_565<br/>RK_FORMAT_BGR_565<br>RK_FORMAT_YCbCr_420_SP<br/>RK_FORMAT_YCrCbr_420_SP<br/>RK_FORMAT_YCbCr_422_SP<br/>RK_FORMAT_YCrCbr_422_SP<br/>RK_FORMAT_YCbCr_420_P<br/>RK_FORMAT_YCrCbr_420_P<br/>RK_FORMAT_YCbCr_422_P<br/>RK_FORMAT_YCrCbr_422_P<br/>RK_FORMAT_YUYV_422<br/>RK_FORMAT_YVYU_422<br/>RK_FORMAT_UYVY_422<br/>RK_FORMAT_VYUY_422<br/>RK_FORMAT_YCbCr_400<br/>RK_FORMAT_Y4
363   	  </td>
364   </tr>
365   <tr>
366      <td>skylarkV2</td>
367      <td>RK3566/RK3568</td>
368   </tr>
369   <tr>
370   <td>Orion</td>
371      <td>RK3588</td>
372   </tr>
373   <tr>
374   <td>Otter</td>
375      <td>RV1106/1103</td>
376   </tr>
377   <td>Bull</td>
378      <td>RK3528</td>
379   </tr>
380   <tr>
381      <td rowspan="1">RGA3</td>
382      <td>Orion</td>
383      <td>RK3588</td>
384      <td rowspan="1">
385RK_FORMAT_RGBA_8888<br/>RK_FORMAT_BGRA_8888<br/>RK_FORMAT_ARGB_8888<br/>RK_FORMAT_ABGR_8888<br/>RK_FORMAT_RGBX_8888<br/>RK_FORMAT_BGRX_8888<br/>RK_FORMAT_XRGB_8888<br/>RK_FORMAT_XBGR_8888<br/>RK_FORMAT_RGB_888<br/>RK_FORMAT_BGR_888<br/>RK_FORMAT_RGB_565<br/>RK_FORMAT_BGR_565<br>RK_FORMAT_YCbCr_420_SP<br/>RK_FORMAT_YCrCbr_420_SP<br/>RK_FORMAT_YCbCr_422_SP<br/>RK_FORMAT_YCrCbr_422_SP<br/>RK_FORMAT_YUYV_422<br/>RK_FORMAT_YVYU_422<br/>RK_FORMAT_UYVY_422<br/>RK_FORMAT_VYUY_422<br/>RK_FORMAT_YCbCr_420_SP_10B<br/>RK_FORMAT_YCrCb_420_SP_10B<br/>RK_FORMAT_YCbCr_422_SP_10B<br/>RK_FORMAT_YCrCb_422_SP_10B
386      </td>
387      <td rowspan="1">
388RK_FORMAT_RGBA_8888<br/>RK_FORMAT_BGRA_8888<br/>RK_FORMAT_RGBX_8888<br/>RK_FORMAT_BGRX_8888<br/>RK_FORMAT_RGB_888<br/>RK_FORMAT_BGR_888<br/>RK_FORMAT_RGB_565<br/>RK_FORMAT_BGR_565<br>RK_FORMAT_YCbCr_420_SP<br/>RK_FORMAT_YCrCbr_420_SP<br/>RK_FORMAT_YCbCr_422_SP<br/>RK_FORMAT_YCrCbr_422_SP<br/>RK_FORMAT_YUYV_422<br/>RK_FORMAT_YVYU_422<br/>RK_FORMAT_UYVY_422<br/>RK_FORMAT_VYUY_422<br/>RK_FORMAT_YCbCr_420_SP_10B<br/>RK_FORMAT_YCrCb_420_SP_10B<br/>RK_FORMAT_YCbCr_422_SP_10B<br/>RK_FORMAT_YCrCb_422_SP_10B
389      </td>
390   </tr>
391</table>
392
393> 注:
394>
395> 1). ”RK_FORMAT_YCbCr_400“格式即YUV格式仅取Y通道,常用于256(2的8次方)阶灰度图,这里需要注意由于是YUV格式存在RGB/YUV色域转换时需要留意色域配置,例如需要完整的256阶灰度图需要在转换时配置为full range。
396>
397> 2). “RK_FORMAT_Y4”格式即YUV格式仅取Y通道,并dither至4bit,常用于16(2的4次方)阶灰度图,涉及色域转换时配置的注意事项同“RK_FORMAT_YCbCr_400”。
398
399
400
401### 图像格式对齐说明
402
403<table>
404    <tr>
405        <td>Version</td>
406        <td>Byte_stride</td>
407        <td>Format</td>
408        <td>Alignment</td>
409    </tr>
410	<tr>
411        <td rowspan="4">RGA1<br/>RGA1_Plus</td>
412        <td rowspan="4">4</td>
413        <td>
414RK_FORMAT_RGBA_8888<br/>RK_FORMAT_BGRA_8888<br/>RK_FORMAT_ARGB_8888<br/>RK_FORMAT_ABGR_8888<br/>RK_FORMAT_RGBX_8888<br/>RK_FORMAT_BGRX_8888<br/>RK_FORMAT_XRGB_8888<br/>RK_FORMAT_XBGR_8888
415        </td>
416        <td>width stride无对齐要求</td>
417    </tr>
418    <tr>
419        <td>
420RK_FORMAT_RGBA_4444<br/>RK_FORMAT_BGRA_4444<br/>RK_FORMAT_ARGB_4444<br/>RK_FORMAT_ABGR_4444<br/>RK_FORMAT_RGBA_5551<br/>RK_FORMAT_BGRA_5551<br/>RK_FORMAT_ARGB_5551<br/>RK_FORMAT_ABGR_5551<br/>RK_FORMAT_RGB_565<br/>RK_FORMAT_BGR_565
421        </td>
422        <td>width stride须2对齐</td>
423    </tr>
424    <tr>
425        <td>
426RK_FORMAT_RGB_888<br/>RK_FORMAT_BGR_888
427        </td>
428        <td>width stride须4对齐</td>
429    </tr>
430    <tr>
431        <td>
432RK_FORMAT_YCbCr_420_SP<br/>RK_FORMAT_YCrCbr_420_SP<br/>RK_FORMAT_YCbCr_422_SP<br/>RK_FORMAT_YCrCbr_422_SP<br/>RK_FORMAT_YCbCr_420_P<br/>RK_FORMAT_YCrCbr_420_P<br/>RK_FORMAT_YCbCr_422_P<br/>RK_FORMAT_YCrCbr_422_P
433        </td>
434        <td>width stride须4对齐,x_offset、y_offset、width、height、height stride均须2对齐</td>
435    </tr>
436    <tr>
437        <td rowspan="6">RGA2<br/>RGA2_Lite0<br/>RGA2_Lite1<br/>RGA2_Enhance</td>
438        <td rowspan="6">4</td>
439        <td>
440RK_FORMAT_RGBA_8888<br/>RK_FORMAT_BGRA_8888<br/>RK_FORMAT_ARGB_8888<br/>RK_FORMAT_ABGR_8888<br/>RK_FORMAT_RGBX_8888<br/>RK_FORMAT_BGRX_8888<br/>RK_FORMAT_XRGB_8888<br/>RK_FORMAT_XBGR_8888
441        </td>
442        <td>width stride无对齐要求</td>
443    </tr>
444    <tr>
445        <td>
446RK_FORMAT_RGBA_4444<br/>RK_FORMAT_BGRA_4444<br/>RK_FORMAT_ARGB_4444<br/>RK_FORMAT_ABGR_4444<br/>RK_FORMAT_RGBA_5551<br/>RK_FORMAT_BGRA_5551<br/>RK_FORMAT_ARGB_5551<br/>RK_FORMAT_ABGR_5551<br/>RK_FORMAT_RGB_565<br/>RK_FORMAT_BGR_565
447        </td>
448        <td>width stride须2对齐</td>
449    </tr>
450    <tr>
451    	<td>
452RK_FORMAT_YUYV_422<br/>RK_FORMAT_YVYU_422<br/>RK_FORMAT_UYVY_422<br/>RK_FORMAT_VYUY_422<br/>RK_FORMAT_YUYV_420<br/>RK_FORMAT_YVYU_420<br/>RK_FORMAT_UYVY_420<br/>RK_FORMAT_VYUY_420
453        </td>
454        <td>width stride须2对齐,x_offset、y_offset、width、height、height stride均须2对齐</td>
455    </tr>
456    <tr>
457        <td>
458RK_FORMAT_RGB_888<br/>RK_FORMAT_BGR_888
459        </td>
460        <td>width stride须4对齐</td>
461    </tr>
462    <tr>
463        <td>
464RK_FORMAT_YCbCr_420_SP<br/>RK_FORMAT_YCrCbr_420_SP<br/>RK_FORMAT_YCbCr_422_SP<br/>RK_FORMAT_YCrCbr_422_SP<br/>RK_FORMAT_YCbCr_420_P<br/>RK_FORMAT_YCrCbr_420_P<br/>RK_FORMAT_YCbCr_422_P<br/>RK_FORMAT_YCrCbr_422_P<br/>RK_FORMAT_YCbCr_400<br/>RK_FORMAT_Y4
465        </td>
466        <td>width stride须4对齐,x_offset、y_offset、width、height、height stride均须2对齐</td>
467    </tr>
468    <tr>
469        <td>
470RK_FORMAT_YCbCr_420_SP_10B<br/>RK_FORMAT_YCrCb_420_SP_10B<br/>RK_FORMAT_YCbCr_422_SP_10B<br/>RK_FORMAT_YCrCb_422_SP_10B
471        </td>
472        <td>width stride须16对齐,x_offset、y_offset、width、height、height stride均须2对齐</td>
473    </tr>
474	<tr>
475		<td rowspan="8">RGA3</td>
476        <td rowspan="8">16</td>
477        <td>
478RK_FORMAT_RGBA_8888<br/>RK_FORMAT_BGRA_8888<br/>RK_FORMAT_ARGB_8888<br/>RK_FORMAT_ABGR_8888<br/>RK_FORMAT_RGBX_8888<br/>RK_FORMAT_BGRX_8888<br/>RK_FORMAT_XRGB_8888<br/>RK_FORMAT_XBGR_8888
479        </td>
480        <td>width stride须4对齐</td>
481    </tr>
482    <tr>
483        <td>
484RK_FORMAT_RGB_565<br/>RK_FORMAT_BGR_565
485        </td>
486        <td>width stride须8对齐</td>
487    </tr>
488    <tr>
489    	<td>
490RK_FORMAT_YUYV_422<br/>RK_FORMAT_YVYU_422<br/>RK_FORMAT_UYVY_422<br/>RK_FORMAT_VYUY_422
491        </td>
492        <td>width stride须8对齐,x_offset、y_offset、width、height、height stride均须2对齐</td>
493    </tr>
494    <tr>
495        <td>
496RK_FORMAT_RGB_888<br/>RK_FORMAT_BGR_888
497        </td>
498        <td>width stride须16对齐</td>
499    </tr>
500	<tr>
501        <td>
502RK_FORMAT_YCbCr_420_SP<br/>RK_FORMAT_YCrCbr_420_SP<br/>RK_FORMAT_YCbCr_422_SP<br/>RK_FORMAT_YCrCbr_422_SP
503        </td>
504        <td>width stride须16对齐,x_offset、y_offset、width、height、height stride均须2对齐</td>
505	</tr>
506    <tr>
507        <td>
508RK_FORMAT_YCbCr_420_SP_10B<br/>RK_FORMAT_YCrCb_420_SP_10B<br/>RK_FORMAT_YCbCr_422_SP_10B<br/>RK_FORMAT_YCrCb_422_SP_10B
509        </td>
510        <td>width stride须64对齐,x_offset、y_offset、width、height、height stride均须2对齐</td>
511    </tr>
512    <tr>
513        <td>FBC mode</td>
514        <td>除上述格式对齐要求外,width stride、height stride须16对齐</td>
515    </tr>
516    <tr>
517        <td>TILE8*8 mode</td>
518        <td>除上述格式对齐要求外,width、height须8对齐,输入通道width stride、height stride须16对齐。</td>
519    </tr>
520</table>
521
522
523> 注:
524>
525> 1). 对齐要求计算公式:lcm(bpp,byte_stride * 8) / pixel_stride。
526>
527> 2). 当芯片平台搭载多版本硬件时,为了保证硬件利用率,librga会按最严格的对齐要求进行约束。
528
529
530
531---
532
533## 版本说明
534
535RGA的支持库librga.so按照一定规则更新版本号,标识着功能新增、兼容性、问题修正的更新提交,并提供几种方式查询版本号,方便开发者在使用librga.so时可以清楚的辨别当前的库文件版本是否适合于当前的开发环境。详细版本更新日志以及版本差异可以查阅源码根目录下**CHANGLOG.md**。
536
537
538
539### librga API版本说明
540
541#### 版本号格式与递增规则
542
543##### 版本号格式
544
545```
546major.minor.revision_[build]
547```
548
549例如:
550
551> 1.0.0_[0]
552
553
554
555##### 递增规则
556
557| 名称     | 规则                                                   |
558| -------- | ------------------------------------------------------ |
559| major    | 主版本号,当提交不向下兼容的版本。                     |
560| minor    | 次版本号,当向下兼容的功能性API新增。                  |
561| revision | 修订版本号,当提交向下兼容的功能补充或致命的问题修正。 |
562| build    | 编译版本号,当向下兼容的问题修正。                     |
563
564
565
566#### 版本号查询
567
568##### strings命令查询:
569
570以Android R 64位为例:
571
572```shell
573:/# strings vendor/lib64/librga.so |grep rga_api |grep version
574rga_api version 1.0.0_[0]
575```
576
577
578
579##### 日志打印:
580
581当每个进程首次调用RGA API时,会打印版本号。
582
583```
584rockchiprga: rga_api version 1.0.0_[0]
585```
586
587
588
589##### 函数接口查询
590
591调用以下API,可以查询代码版本号、编译版本号、RGA硬件版本信息。具体使用说明可以查看 **应用接口说明** 章节。
592
593```
594querystring(RGA_VERSION);
595```
596
597> 字符串格式如下:
598>
599> RGA_api version       : v1.0.0_[0]
600> RGA version               : RGA_2_Enhance
601
602
603
604##### 属性查询
605
606该方式查询版本号仅Android系统支持,并且须已有进程调用RGA后,属性设置方生效。
607
608```shell
609:/# getprop |grep rga
610[vendor.rga_api.version]: [1.0.0_[0]]
611```
612
613
614
615### 驱动版本说明
616
617librga是基于驱动调用RGA硬件的,必须要保证驱动版本在使用的librga库的支持范围内。
618
619#### 版本号格式与递增规则
620
621##### 版本号格式
622
623```
624<driver_name>: v major.minor.revision
625```
626
627例如:
628
629> RGA2 Device Driver: v2.1.0
630>
631> RGA multicore Device Driver: v1.2.23
632
633
634
635##### 递增规则
636
637| 名称     | 规则                                                   |
638| -------- | ------------------------------------------------------ |
639| major    | 主版本号,当提交不向下兼容的版本。                     |
640| minor    | 次版本号,当向下兼容的功能性API新增。                  |
641| revision | 修订版本号,当提交向下兼容的功能补充或致命的问题修正。 |
642
643
644
645#### 版本号查询
646
647##### 开机日志查询:
648
649开机后使用以下命令查询RGA驱动初始化日志,部分早期的驱动没有打印版本号,该方法仅适用部分驱动。
650
651```
652 dmesg |grep rga
653```
654
655例如:
656
657> [    2.382393] rga3_core0 fdb60000.rga: Adding to iommu group 2
658>[    2.382651] rga: rga3_core0, irq = 33, match scheduler
659> [    2.383058] rga: rga3_core0 hardware loaded successfully, hw_version:3.0.76831.
660> [    2.383121] rga: rga3_core0 probe successfully
661> [    2.383687] rga3_core1 fdb70000.rga: Adding to iommu group 3
662> [    2.383917] rga: rga3_core1, irq = 34, match scheduler
663> [    2.384313] rga: rga3_core1 hardware loaded successfully, hw_version:3.0.76831.
664> [    2.384412] rga: rga3_core1 probe successfully
665> [    2.384893] rga: rga2, irq = 35, match scheduler
666> [    2.385238] rga: rga2 hardware loaded successfully, hw_version:3.2.63318.
667> [    2.385257] rga: rga2 probe successfully
668> [    2.385455] rga_iommu: IOMMU binding successfully, default mapping core[0x1]
669> [    2.385586] rga: Module initialized. v1.2.23
670>
671
672其中 “v1.2.23” 便是驱动版本号。
673
674
675
676##### 调试节点查询
677
678可以通过驱动调试节点查询版本号,如果没有以下节点则说明当前运行的是不支持查询的驱动版本。
679
680- 使用默认使能CONFIG_ROCKCHIP_RGA_DEBUG_FS编译选项的kernel。
681
682```shell
683cat /sys/kernel/debug/rkrga/driver_version
684```
685
686- 使能ROCKCHIP_RGA_PROC_FS编译选项的kernel。
687
688```shell
689cat /proc/rkrga/driver_version
690```
691
692例如:
693
694> cat /sys/kernel/debug/rkrga/driver_version
695>RGA multicore Device Driver: v1.2.23
696
697这里 “RGA multicore Device Driver”是指驱动名称为RGA multicore Device Driver,“v1.2.23” 是指版本为1.2.23,即说明当前驱动为1.2.23版本的RGA multicore Device Driver(通常简称multi_rga driver)驱动。
698
699> cat /sys/kernel/debug/rkrga/driver_version
700>RGA2 Device Driver: v2.1.0
701
702这里 “RGA2 Device Driver” 是指驱动名称为RGA2 Device Driver,“v2.1.0” 是指版本号为2.1.0,即说明当前驱动为2.1.0版本的RGA2 Device Driver(通常简称rga2 driver)驱动。
703
704
705
706### 版本对应关系
707
708使用RGA时需要确认保证当前的运行环境是可以正常工作的,下表为常用的librga与驱动版本对应关系。
709
710| librga版本    | 对应驱动                                                     | 硬件支持         |
711| ------------- | ------------------------------------------------------------ | ---------------- |
712| 无版本号      | 对应SDK内驱动                                                | RGA1、RGA2       |
713| 1.0.0 ~ 1.3.2 | RGA Device Driver(kernel - 4.4及以上)<br/>RGA2 Device Driver(无版本号或v2.1.0) | RGA1、RGA2       |
714| > 1.4.0       | RGA multicore Device Driver(v1.2.0及以上)                  | RGA2、RGA3       |
715| > 1.9.0       | RGA Device Driver(kernel-4.4及以上)<br/>RGA2 Device Driver(无版本号和v2.1.0)<br/>RGA multicore Device Driver(v1.2.0及以上) | RGA1、RGA2、RGA3 |
716
717
718
719---
720
721## 应用接口
722
723RGA模块支持库为librga.so,通过对图像缓冲区结构体struct rga_info进行配置,实现相应的2D图形操作。为了获得更友好的开发体验,在此基础上进一步封装常用的2D图像操作接口。新的接口主要包含以下特点:
724- 接口定义参考opencv/matlab中常用的2D图形接口定义,以减少二次开发的学习成本。
725- 为消除RGA硬件版本差异带来的兼容问题,加入RGA query查询功能。查询内容主要包括版本信息,输入输出大分辨率及图像格式的支持。
726- 执行图像操作之前,需要对输入输出图像缓冲区进行处理。调用wrapbuffer_T接口将输入输出图像信息填充到结构体struct rga_buffer_t,结构体中包含分辨率及图像格式等信息。
727- 对于2D图像复合操作,增加improcess接口。通过传入一系列预定义的usage执行复合操作。
728- 支持对单次无法完成的图像复合操作进行绑定为一个RGA图像任务,统一提交到驱动内逐个执行。
729
730
731
732### 概述
733
734该软件支持库提供以下API,异步模式仅支持C++实现。
735
736- **querystring**: 查询获取当前芯片平台RGA硬件版本与功能支持信息,以字符串的形式返回。
737- **imcheckHeader**:  校验当前使用头文件版本与librga版本差异。
738- **importbuffer_T**: 将外部内存(dma_fd、虚拟地址、物理地址)导入RGA驱动内部,实现硬件快速访问物理连续/非物理连续的内存。
739- **releasebuffer_handle**: 将外部buffer从RGA驱动内部解除引用与映射。
740- **wrapbuffer_handle**: 快速封装图像缓冲区结构(rga_buffer_t)。
741- **imbeginJob**:创建RGA图像处理任务。
742- **imendJob**: 提交并执行RGA图像处理任务。
743- **imcancelJob**: 取消并删除RGA图像处理任务。
744- **imcopy**: 调用RGA实现快速图像拷贝操作。
745- **imcopyTask**: 向RGA图像任务中添加快速图像拷贝操作。
746- **imresize**: 调用RGA实现快速图像缩放操作。
747- **imresizeTask**: 向RGA图像任务中添加快速图像缩放操作。
748- **impyramind**: 调用RGA实现快速图像金字塔操作。
749- **imcrop**: 调用RGA实现快速图像裁剪操作。
750- **imcropTask**: 向RGA图像任务中添加快速图像裁剪操作。
751- **imtranslate**: 调用RGA实现快速图像平移操作。
752- **imtranslateTask**: 向RGA图像任务中添加快速图像平移操作。
753- **imcvtcolor**: 调用RGA实现快速图像格式转换。
754- **imcvtcolorTask**: 向RGA图像任务中添加快速图像格式转换。
755- **imrotate**: 调用RGA实现快速图像旋转操作。
756- **imrotateTask**: 向RGA图像任务中添加快速图像旋转操作。
757- **imflip**: 调用RGA实现快速图像翻转操作。
758- **imflipTask**: 向RGA图像任务中添加快速图像翻转操作。
759- **imblend**: 调用RGA实现双通道快速图像合成操作。
760- **imblendTask**: 向RGA图像任务中添加双通道快速图像合成操作。
761- **imcomposite**: 调用RGA实现三通道快速图像合成操作。
762- **imcompositeTask**: 向RGA图像任务中添加三通道快速图像合成操作。
763- **imcolorkey**: 调用RGA实现快速图像颜色键操作。
764- **imcolorkeyTask**: 向RGA图像任务中添加快速图像颜色键操作。
765- **imosd**:调用RGA实现快速图像OSD字幕叠加。
766- **imosdTask**:向RGA图像任务中添加快速图像OSD字幕叠加。
767- **imquantize**: 调用RGA实现快速图像运算点前处理(量化)操作。
768- **imquantizeTask**: 向RGA图像任务中添加快速图像运算点前处理(量化)操作。
769- **imrop**: 调用RGA实现快速图像光栅操作。
770- **imropTask**: 向RGA图像任务中添加快速图像光栅操作。
771- **imfill**: 调用RGA实现快速图像填充操作。
772- **imfillArray**: 调用RGA实现多组快速图像填充操作。
773- **imfillTask**: 向RGA图像任务中添加快速图像填充操作。
774- **imfillTaskArray**: 向RGA图像任务中添加多组快速图像填充操作。
775- **imrectangle**: 调用RGA实现等距矩形边框快速绘制操作。
776- **imrectangleArray**: 调用RGA实现多组等距矩形边框快速绘制操作。
777- **imrectangleTask**: 向RGA图像任务中添加等距矩形边框快速绘制操作。
778- **imrectangleTaskArray**: 向RGA图像任务中添加多组等距矩形边框快速绘制操作。
779- **immakeBorder**: 调用RGA实现矩形边框快速绘制操作。
780- **immosaic**:调用RGA实现快速图像马赛克遮盖。
781- **immosaicArray**:调用RGA实现快速图像马赛克遮盖。
782- **immosaicTask**:向RGA图像任务中添加快速图像马赛克遮盖。
783- **immosaicTaskArray**:向RGA图像任务中添加快速图像马赛克遮盖。
784- **improcess**: 调用RGA实现快速图像复合处理操作。
785- **improcessTask**: 向RGA图像任务中添加快速图像复合处理操作。
786- **imcheck**: 校验参数是否合法,以及当前硬件是否支持该操作。
787- **imsync**: 用于异步模式时,同步任务完成状态。
788- **imconfig**: 向当前线程上下文添加默认配置。
789
790
791
792### 获取RGA 版本及支持信息
793
794#### querystring
795
796```C++
797const char* querystring(int name);
798```
799
800> 查询RGA基础信息及分辨率格式等支持情况
801
802| **Parameters** | **Description**                                              |
803| -------------- | ------------------------------------------------------------ |
804| name           | RGA_VENDOR                 - 厂商信息<br/>RGA_VERSION                 - 版本信息<br/>RGA_MAX_INPUT            - 支持的最大输入分辨率<br/>RGA_MAX_OUTPUT        - 支持的最大输出分辨率<br/>RGA_BYTE_STRIDE          - 支持的stride对齐要求<br/>RGA_SCALE_LIMIT           - 支持得缩放倍数<br/>RGA_INPUT_FORMAT     - 支持的输入格式<br/>RGA_OUTPUT_FORMAT - 支持的输出格式<br/>RGA_EXPECTED               - 预期性能<br/>RGA_ALL                           - 输出所有信息 |
805
806 **Returns** a string describing properties of RGA.
807
808
809
810### 头文件版本校验
811
812#### imcheckHeader
813
814```C++
815IM_API IM_STATUS imcheckHeader(im_api_version_t header_version = RGA_CURRENT_API_HEADER_VERSION);
816```
817
818> 校验当前使用头文件版本与librga版本差异。
819
820| **Parameters** | **Description**                                             |
821| -------------- | ----------------------------------------------------------- |
822| header_version | 头文件版本,通常使用宏 RGA_CURRENT_API_HEADER_VERSION即可。 |
823
824**Return** IM_STATUS_SUCCESS on success or else negative error code.
825
826
827
828### 图像缓冲区预处理
829
830#### importbuffer_T
831
832> 对于需要RGA处理的外部内存,可以使用importbuffer_T接口将缓冲区对应的物理地址信息映射到RGA驱动内部,并获取缓冲区相应的地址信息,方便后续的稳定、快速地调用RGA完成工作。
833
834| **Parameters(T)**    | Data Type       | Description                                                  |
835| -------------------- | --------------- | ------------------------------------------------------------ |
836| virtual address      | void *          | 图像缓冲区虚拟地址                                           |
837| physical address     | uint64_t        | 图像缓冲区连续的物理地址                                     |
838| fd                   | int             | 图像缓冲区DMA的文件描述符                                    |
839| GraphicBuffer handle | buffer_handle_t | 图像缓冲区handle, 包含缓冲区地址,文件描述符,分辨率及格式等信息 |
840| GraphicBuffer        | GraphicBuffer   | android graphic buffer                                       |
841| AHardwareBuffer      | AHardwareBuffer | chunks of memory that can be accessed by various hardware components in the system. https://developer.android.com/ndk/reference/group/a-hardware-buffer |
842
843> 不同的buffer类型调用RGA的性能是不同的,性能排序如下所示:
844>
845> physical address > fd > virtual address
846>
847> 一般推荐使用fd作为buffer类型。
848
849```c++
850IM_API rga_buffer_handle_t importbuffer_fd(int fd, int size);
851IM_API rga_buffer_handle_t importbuffer_virtualaddr(void *va, int size);
852IM_API rga_buffer_handle_t importbuffer_physicaladdr(uint64_t pa, int size);
853```
854
855| Parameter | **Description**                |
856| --------- | ------------------------------ |
857| fd/va/pa  | **[required]** external buffer |
858| size      | **[required]** memory size     |
859
860```c++
861IM_API rga_buffer_handle_t importbuffer_fd(int fd, int width, int height, int format);
862IM_API rga_buffer_handle_t importbuffer_virtualaddr(void *va, int width, int height, int format);
863IM_API rga_buffer_handle_t importbuffer_physicaladdr(uint64_t pa, int width, int height, int format);
864```
865
866| Parameter | **Description**                                        |
867| --------- | ------------------------------------------------------ |
868| fd/va/pa  | **[required]** external buffer                         |
869| width     | **[required]** pixel width stride of the image buffer  |
870| height    | **[required]** pixel height stride of the image buffer |
871| format    | **[required]** pixel format of the image buffer        |
872
873```c++
874IM_API rga_buffer_handle_t importbuffer_fd(int fd, im_handle_param_t *param);
875IM_API rga_buffer_handle_t importbuffer_virtualaddr(void *va, im_handle_param_t *param);
876IM_API rga_buffer_handle_t importbuffer_physicaladdr(uint64_t pa, im_handle_param_t *param);
877```
878
879| Parameter | **Description**                            |
880| --------- | ------------------------------------------ |
881| fd/va/pa  | **[required]** external buffer             |
882| param     | **[required]** configure buffer parameters |
883
884```c++
885IM_API rga_buffer_handle_t importbuffer_GraphicBuffer_handle(buffer_handle_t hnd);
886IM_API rga_buffer_handle_t importbuffer_GraphicBuffer(sp<GraphicBuffer> buf);
887IM_API rga_buffer_handle_t importbuffer_AHardwareBuffer(AHardwareBuffer *buf);
888```
889
890| Parameter | **Description**                |
891| --------- | ------------------------------ |
892| hnd/buf   | **[required]** external buffer |
893
894**Returns** rga_buffer_handle_t to describe the memory handle.
895
896
897
898#### releasebuffer_handle
899
900> 当使用外部内存调用RGA完毕后,需要通过内存句柄 handle 调用 releasebuffer_handle解除该缓冲区与RGA驱动的映射和绑定关系,并释放RGA驱动内部对应的资源。
901
902```c++
903IM_API IM_STATUS releasebuffer_handle(rga_buffer_handle_t handle);
904```
905
906**Return** IM_STATUS_SUCCESS on success or else negative error code.
907
908
909
910#### wrapbuffer_handle
911
912> IM2D图形库接口参数中,输入源图像及输出目标图像应支持多种类型,它主要包含内存、图像格式、图像宽高等信息。在执行相应的图像操作之前,需要先调用wrapbuffer_handle将输入输出的图像参数转化为统一的 rga_buffer_t 结构作为user API的输入参数。
913
914```C++
915rga_buffer_t wrapbuffer_handle(rga_buffer_handle_t handle,
916                               int width,
917                               int height,
918                               int format,
919                               int wstride = width,
920                               int hstride = height);
921```
922| Parameter | **Description**                                              |
923| --------- | ------------------------------------------------------------ |
924| handle    | **[required]** RGA buffer handle                             |
925| width     | **[required]** pixel width of the image that needs to be processed |
926| height    | **[required]** pixel height of the image that needs to be processed |
927| format    | **[required]** pixel format                                  |
928| wtride    | **[optional]** pixel width stride of the image               |
929| hstride   | **[optional]** pixel width stride of the image               |
930
931 **Returns** a rga_buffer_t to desribe image information.
932
933
934
935### 图像处理任务创建
936
937#### imbeginJob
938
939```c++
940IM_API im_job_handle_t imbeginJob(uint64_t flags = 0);
941```
942
943> 创建一个RGA图像处理任务,将返回一个任务句柄,job_handle 可用于添加/删除RGA图像操作、提交/执行该任务。
944
945| Parameter | **Description**          |
946| --------- | ------------------------ |
947| flags     | **[optional]** job flags |
948
949**Returns** im_job_handle_t to describe the job handle.
950
951
952
953### 图像处理任务提交
954
955#### imendJob
956
957```c++
958IM_API IM_STATUS imendJob(im_job_handle_t job_handle,
959                          int sync_mode = IM_SYNC,
960                          int acquire_fence_fd = 0,
961                          int *release_fence_fd = NULL);
962```
963
964> 提交并执行已创建的RGA图像处理任务。完成后将自动删除当前完成的RGA图像处理任务资源。
965
966| Parameter        | **Description**                                              |
967| ---------------- | ------------------------------------------------------------ |
968| job_handle       | **[required]** job handle                                    |
969| sync_mode        | **[optional]** wait until operation complete                 |
970| acquire_fence_fd | **[optional]** Used in async mode, run the job after waiting foracquire_fence signal |
971| release_fence_fd | **[optional]** Used in async mode, as a parameter of imsync() |
972
973**Return** IM_STATUS_SUCCESS on success or else negative error code.
974
975
976
977### 图像处理任务取消
978
979#### imcancelJob
980
981```c++
982IM_API IM_STATUS imcancelJob(im_job_handle_t job_handle);
983```
984
985> 取消并删除已创建的RGA图像处理任务。
986
987| Parameter  | **Description**           |
988| ---------- | ------------------------- |
989| job_handle | **[required]** job handle |
990
991**Return** IM_STATUS_SUCCESS on success or else negative error code.
992
993
994
995### 图像拷贝
996
997#### imcopy
998
999```C++
1000IM_STATUS imcopy(const rga_buffer_t src,
1001                 rga_buffer_t dst,
1002                 int sync = 1,
1003                 int *release_fence_fd = NULL);
1004```
1005
1006> 执行单次快速图像拷贝操作,将图像从src通道图像缓冲区拷贝到dst通道图像缓冲区上。
1007
1008| Parameter        | **Description**                                              |
1009| ---------------- | ------------------------------------------------------------ |
1010| src              | **[required]** input image                                   |
1011| dst              | **[required]** output image                                  |
1012| sync             | **[optional]** wait until operation complete                 |
1013| release_fence_fd | **[optional]**Used in async mode, as a parameter of imsync() |
1014
1015**Return** IM_STATUS_SUCCESS on success or else negative error code.
1016
1017
1018
1019#### imcopyTask
1020
1021```C++
1022IM_API IM_STATUS imcopyTask(im_job_handle_t job_handle,
1023                            const rga_buffer_t src,
1024                            rga_buffer_t dst);
1025```
1026
1027> 通过job_handle向指定的任务中添加图像拷贝操作,用法和imcopy一致。
1028
1029| Parameter  | **Description**             |
1030| ---------- | --------------------------- |
1031| job_handle | **[required]** job handle   |
1032| src        | **[required]** input image  |
1033| dst        | **[required]** output image |
1034
1035**Return** IM_STATUS_SUCCESS on success or else negative error code.
1036
1037
1038
1039### 图像缩放、图像金字塔
1040
1041#### imresize
1042
1043```C++
1044IM_STATUS imresize(const rga_buffer_t src,
1045                   rga_buffer_t dst,
1046                   double fx = 0,
1047                   double fy = 0,
1048                   int interpolation = INTER_LINEAR,
1049                   int sync = 1,
1050                   int *release_fence_fd = NULL);
1051```
1052
1053> 根据不同的应用场景,可选择配置dst来描述缩放的目标图像大小,或配置缩放系数fx/fy实现缩放指定倍率的效果。同时配置dst和缩放系数fx/fy时,将采用缩放系数fx/fy计算后的结果作为目标图像大小。
1054>
1055> interpolation 仅硬件版本RGA1/RGA1 plus 可以支持配置,其他硬件版本RGA须查询对应TRM确认缩放算法。
1056>
1057> 注意:使用缩放系数fx/fy进行倍率缩放时,YUV等对宽高对齐有要求的格式将强制向下对齐至符合要求,使用该功能有可能会改变预期缩放效果。
1058
1059| Parameters       | Description                                                  |
1060| ---------------- | ------------------------------------------------------------ |
1061| src              | **[required]** input image                                   |
1062| dst              | **[required]** output image; it has the size dsize (when it is non-zero) or the size computed from src.size(), fx, and fy; the type of dst is the same as of src. |
1063| fx               | **[optional]** scale factor along the horizontal axis; when it equals 0, it is computed as:<br/>fx = (double) dst.width / src.width |
1064| fy               | **[optional]** scale factor along the vertical axis; when it equals 0, it is computed as:<br/>fy = (double) dst.height / src.height |
1065| interpolation    | **[optional]** interpolation method:<br/>INTER_NEAREST - a nearest-neighbor interpolation<br/>INTER_LINEAR - a bilinear interpolation (used by default)<br/>INTER_CUBIC - a bicubic interpolation over 4x4 pixel neighborhood |
1066| sync             | **[optional]** wait until operation complete                 |
1067| release_fence_fd | **[optional]**Used in async mode, as a parameter of imsync() |
1068
1069**Return** IM_STATUS_SUCCESS on success or else negative error code.
1070
1071
1072
1073#### impyramid
1074
1075```C++
1076IM_STATUS impyramid (const rga_buffer_t src,
1077                     rga_buffer_t dst,
1078                     IM_SCALE direction)
1079```
1080
1081> 金字塔缩放。根据direction 宽高同时做1/2 或者 2 倍的缩放。
1082
1083| Parameters       | Description                                                  |
1084| ---------------- | ------------------------------------------------------------ |
1085| src              | **[required]** input image                                   |
1086| dst              | **[required]** output image;                                 |
1087| direction        | **[required]** scale mode<br/>IM_UP_SCALE  ——  up scale <br/>IM_DOWN_SCALE —— down scale |
1088| release_fence_fd | **[optional]**Used in async mode, as a parameter of imsync() |
1089
1090**Return** IM_STATUS_SUCCESS on success or else negative error code.
1091
1092
1093
1094#### imresizeTask
1095
1096```C++
1097IM_API IM_STATUS imresizeTask(im_job_handle_t job_handle,
1098                              const rga_buffer_t src,
1099                              rga_buffer_t dst,
1100                              double fx = 0,
1101                              double fy = 0,
1102                              int interpolation = 0);
1103```
1104
1105> 通过job_handle向指定的任务中添加图像缩放操作,用法和imresize一致。
1106
1107| Parameters    | Description                                                  |
1108| ------------- | ------------------------------------------------------------ |
1109| job_handle    | **[required]** job handle                                    |
1110| src           | **[required]** input image                                   |
1111| dst           | **[required]** output image; it has the size dsize (when it is non-zero) or the size computed from src.size(), fx, and fy; the type of dst is the same as of src. |
1112| fx            | **[optional]** scale factor along the horizontal axis; when it equals 0, it is computed as:<br/>fx = (double) dst.width / src.width |
1113| fy            | **[optional]** scale factor along the vertical axis; when it equals 0, it is computed as:<br/>fy = (double) dst.height / src.height |
1114| interpolation | **[optional]** interpolation method:<br/>INTER_NEAREST - a nearest-neighbor interpolation<br/>INTER_LINEAR - a bilinear interpolation (used by default)<br/>INTER_CUBIC - a bicubic interpolation over 4x4 pixel neighborhood |
1115
1116**Return** IM_STATUS_SUCCESS on success or else negative error code.
1117
1118
1119
1120### 图像裁剪
1121
1122#### imcrop
1123
1124```C++
1125IM_STATUS imcrop(const rga_buffer_t src,
1126                 rga_buffer_t dst,
1127                 im_rect rect,
1128                 int sync = 1,
1129                 int *release_fence_fd = NULL);
1130```
1131
1132> 通过指定Rect 的大小区域执行图像裁剪。
1133
1134| Parameter        | Description                                                  |
1135| ---------------- | ------------------------------------------------------------ |
1136| src              | **[required] **input image                                   |
1137| dst              | **[required]** output image                                  |
1138| rect             | **[required]** crop region<br/>x - upper-left x coordinate<br/>y - upper-left y coordinate<br/>width - region width<br/>height - region height |
1139| sync             | **[optional]** wait until operation complete                 |
1140| release_fence_fd | **[optional]**Used in async mode, as a parameter of imsync() |
1141
1142**Return** IM_STATUS_SUCCESS on success or else negative error code.
1143
1144
1145
1146#### imcropTask
1147
1148```C++
1149IM_API IM_STATUS imcropTask(im_job_handle_t job_handle,
1150                            const rga_buffer_t src,
1151                            rga_buffer_t dst,
1152                            im_rect rect);
1153```
1154
1155> 通过job_handle向指定的任务中添加图像裁剪操作,用法和imcrop一致。
1156
1157| Parameter  | Description                                                  |
1158| ---------- | ------------------------------------------------------------ |
1159| job_handle | **[required]** job handle                                    |
1160| src        | **[required] **input image                                   |
1161| dst        | **[required]** output image                                  |
1162| rect       | **[required]** crop region<br/>x - upper-left x coordinate<br/>y - upper-left y coordinate<br/>width - region width<br/>height - region height |
1163
1164**Return** IM_STATUS_SUCCESS on success or else negative error code.
1165
1166
1167
1168### 图像平移
1169
1170#### imtranslate
1171
1172```C++
1173IM_STATUS imtranslate(const rga_buffer_t src,
1174                      rga_buffer_t dst,
1175                      int x,
1176                      int y,
1177                      int sync = 1,
1178                      int *release_fence_fd = NULL);
1179```
1180
1181> 对图像做平移操作,移动到(x, y)坐标位置,src和dst 宽高须一致,超出部分会被裁剪。
1182
1183| Parameter        | Description                                                  |
1184| ---------------- | ------------------------------------------------------------ |
1185| src              | **[required]**input image                                    |
1186| dst              | **[required]** output image                                  |
1187| x                | **[required]** horizontal translation                        |
1188| y                | **[required]** vertical translation                          |
1189| sync             | **[optional]** wait until operation complete                 |
1190| release_fence_fd | **[optional]**Used in async mode, as a parameter of imsync() |
1191
1192**Return** IM_STATUS_SUCCESS on success or else negative error code.
1193
1194
1195
1196#### imtranslateTask
1197
1198```C++
1199IM_API IM_STATUS imtranslateTask(im_job_handle_t job_handle,
1200                                 const rga_buffer_t src,
1201                                 rga_buffer_t dst,
1202                                 int x,
1203                                 int y);
1204```
1205
1206> 通过job_handle向指定的任务中添加图像平移操作,用法和imtranslate一致。
1207
1208| Parameter  | Description                           |
1209| ---------- | ------------------------------------- |
1210| job_handle | **[required]** job handle             |
1211| src        | **[required]**input image             |
1212| dst        | **[required]** output image           |
1213| x          | **[required]** horizontal translation |
1214| y          | **[required]** vertical translation   |
1215
1216**Return** IM_STATUS_SUCCESS on success or else negative error code.
1217
1218
1219
1220### 图像格式转换
1221
1222#### imcvtcolor
1223
1224```C++
1225IM_STATUS imcvtcolor(rga_buffer_t src,
1226                     rga_buffer_t dst,
1227                     int sfmt,
1228                     int dfmt,
1229                     int mode = IM_COLOR_SPACE_DEFAULT,
1230                     int sync = 1,
1231                     int *release_fence_fd = NULL);
1232```
1233
1234> 格式转换功能,具体格式支持根据soc有不同请查阅**图像格式支持**章节。
1235>
1236> 格式可以通过rga_buffer_t 设置,也可以通过sfmt/dfmt分别配置源图像及输出图像格式,当涉及YUV/RGB色域转换时可以通过mode配置转换的色域,默认按照BT.601 limit range进行转换。
1237
1238| parameter        | Description                                                  |
1239| ---------------- | ------------------------------------------------------------ |
1240| src              | **[required]** input image                                   |
1241| dst              | **[required]** output image                                  |
1242| sfmt             | **[optional]** source image format                           |
1243| dfmt             | **[optional]** destination image format                      |
1244| Mode             | **[optional]** color space mode:<br/>IM_YUV_TO_RGB_BT601_LIMIT<br/>IM_YUV_TO_RGB_BT601_FULL<br/>IM_YUV_TO_RGB_BT709_LIMIT<br/>IM_RGB_TO_YUV_BT601_LIMIT<br/>IM_RGB_TO_YUV_BT601_FULL<br/>IM_RGB_TO_YUV_BT709_LIMIT |
1245| sync             | **[optional]** wait until operation complete                 |
1246| release_fence_fd | **[optional]**Used in async mode, as a parameter of imsync() |
1247
1248**Return** IM_STATUS_SUCCESS  on success or else negative error code.
1249
1250
1251
1252#### imcvtcolorTask
1253
1254```C++
1255IM_API IM_STATUS imcvtcolorTask(im_job_handle_t job_handle,
1256                                rga_buffer_t src,
1257                                rga_buffer_t dst,
1258                                int sfmt,
1259                                int dfmt,
1260                                int mode = IM_COLOR_SPACE_DEFAULT);
1261```
1262
1263> 通过job_handle向指定的任务中添加图像平移操作,用法和imcvtcolor一致。
1264
1265| parameter  | Description                                                  |
1266| ---------- | ------------------------------------------------------------ |
1267| job_handle | **[required]** job handle                                    |
1268| src        | **[required]** input image                                   |
1269| dst        | **[required]** output image                                  |
1270| sfmt       | **[optional]** source image format                           |
1271| dfmt       | **[optional]** destination image format                      |
1272| Mode       | **[optional]** color space mode:<br/>IM_YUV_TO_RGB_BT601_LIMIT<br/>IM_YUV_TO_RGB_BT601_FULL<br/>IM_YUV_TO_RGB_BT709_LIMIT<br/>IM_RGB_TO_YUV_BT601_LIMIT<br/>IM_RGB_TO_YUV_BT601_FULL<br/>IM_RGB_TO_YUV_BT709_LIMIT |
1273
1274**Return** IM_STATUS_SUCCESS  on success or else negative error code.
1275
1276
1277
1278### 图像旋转
1279
1280#### imrotate
1281
1282```c++
1283IM_STATUS imrotate(const rga_buffer_t src,
1284                   rga_buffer_t dst,
1285                   int rotation,
1286                   int sync = 1,
1287                   int *release_fence_fd = NULL);
1288```
1289
1290>
1291>  支持图像旋转90,180,270度。
1292
1293| Parameter        | Description                                                  |
1294| ---------------- | ------------------------------------------------------------ |
1295| src              | **[required]** input image                                   |
1296| dst              | **[required]** output image                                  |
1297| rotation         | **[required]** rotation angle:<br/>IM_HAL_TRANSFORM_ROT_90<br/>IM_HAL_TRANSFORM_ROT_180<br/>IM_HAL_TRANSFORM_ROT_270 |
1298| sync             | **[optional]** wait until operation complete                 |
1299| release_fence_fd | **[optional]**Used in async mode, as a parameter of imsync() |
1300
1301**Return** IM_STATUS_SUCCESS on success or else negative error code.
1302
1303
1304
1305#### imrotateTask
1306
1307```c++
1308IM_API IM_STATUS imrotateTask(im_job_handle_t job_handle,
1309                              const rga_buffer_t src,
1310                              rga_buffer_t dst,
1311                              int rotation);
1312```
1313
1314>通过job_handle向指定的任务中添加图像旋转操作,用法和imrotate一致。
1315
1316| Parameter  | Description                                                  |
1317| ---------- | ------------------------------------------------------------ |
1318| job_handle | **[required]** job handle                                    |
1319| src        | **[required]** input image                                   |
1320| dst        | **[required]** output image                                  |
1321| rotation   | **[required]** rotation angle:<br/>IM_HAL_TRANSFORM_ROT_90<br/>IM_HAL_TRANSFORM_ROT_180<br/>IM_HAL_TRANSFORM_ROT_270 |
1322
1323**Return** IM_STATUS_SUCCESS on success or else negative error code.
1324
1325
1326
1327### 图像镜像翻转
1328
1329#### imfilp
1330
1331```c++
1332IM_STATUS imflip (const rga_buffer_t src,
1333                  rga_buffer_t dst,
1334                  int mode,
1335                  int sync = 1,
1336                  int *release_fence_fd = NULL);
1337```
1338
1339> 支持图像做水平、垂直镜像翻转。
1340
1341| Parameter        | Description                                                  |
1342| ---------------- | ------------------------------------------------------------ |
1343| src              | **[required]** input image                                   |
1344| dst              | **[required]** output image                                  |
1345| mode             | **[required]** flip mode:<br/>IM_HAL_TRANSFORM_FLIP_H_V<br/>IM_HAL_TRANSFORM_FLIP_H<br/>IM_HAL_TRANSFORM_FLIP_V |
1346| sync             | **[optional]** wait until operation complete                 |
1347| release_fence_fd | **[optional]**Used in async mode, as a parameter of imsync() |
1348
1349**Return** IM_STATUS_SUCCESS on success or else negative error code.
1350
1351
1352
1353#### imflipTask
1354
1355```c++
1356IM_API IM_STATUS imflipTask(im_job_handle_t job_handle,
1357                            const rga_buffer_t src,
1358                            rga_buffer_t dst,
1359                            int mode);
1360```
1361
1362> 通过job_handle向指定的任务中添加图像镜像翻转操作,用法和imflip一致。
1363
1364| Parameter  | Description                                                  |
1365| ---------- | ------------------------------------------------------------ |
1366| job_handle | **[required]** job handle                                    |
1367| src        | **[required]** input image                                   |
1368| dst        | **[required]** output image                                  |
1369| mode       | **[required]** flip mode:<br/>IM_HAL_TRANSFORM_FLIP_H_V<br/>IM_HAL_TRANSFORM_FLIP_H<br/>IM_HAL_TRANSFORM_FLIP_V |
1370
1371**Return** IM_STATUS_SUCCESS on success or else negative error code.
1372
1373
1374
1375### 图像合成
1376
1377#### imblend/imcomposite
1378
1379```c++
1380IM_STATUS imblend(const rga_buffer_t fg_image,
1381                  rga_buffer_t bg_image,
1382                  int mode = IM_ALPHA_BLEND_SRC_OVER,
1383                  int sync = 1,
1384                  int *release_fence_fd = NULL);
1385```
1386
1387> RGA使用A+B -> B 的图像双通道合成模式, 将前景图像(srcA通道)与背景图像(dst通道)根据配置的混合模型执行对应的Alpha叠加计算,并将合成结果输出至dst通道上,当没有配置混合模式时则默认设置为src-over模式。
1388
1389```c++
1390IM_STATUS imcomposite(const rga_buffer_t fg_image,
1391                      const rga_buffer_t bg_image,
1392                      rga_buffer_t output_image,
1393                      int mode = IM_ALPHA_BLEND_SRC_OVER,
1394                      int sync = 1,
1395                      int *release_fence_fd = NULL);
1396```
1397
1398> RGA使用A+B -> C 的图像三通道合成模式,将前景图像(srcA通道)与背景图像(srcB通道)根据配置的混合模型执行对应的Alpha叠加计算,并将合成结果输出至dst通道上,当没有配置混合模式时则默认设置为src-over模式。
1399
1400两种图像合成模式中mode 可以配置不同的**Porter-Duff混合模型**:
1401
1402> 说明Porter-Duff混合模型前,先做出如下定义:
1403>
1404> - S -**标识两个混合图像中的源图像**,即前景图像,为souce的缩写。
1405> - D -**标识两个混合图像中的目标图像**,即背景图像,为destination的缩写。
1406> - R -**标识两个图像混合的结果**,为result的缩写。
1407> - c -**标识像素的颜色**,即(RGBA)的RGB部分,描述图像本身色彩,为color的缩写。(**注意**,Porter-Duff混合模型中的色彩值(RGB)均为左乘后的结果,即原始色彩与透明度的乘积,如色彩值未左乘则需要进行预乘(Xc = Xc * Xa)操作。)
1408> - a -**标识像素的透明度**,即(RGBA)的A部分,描述图像本身的透明度,为Alpha的缩写。
1409> - f -**标识作用于C或者A上的因子**,为factor的缩写。
1410>
1411> Porter-Duff混合模型的核心公式如下:
1412>
1413> Rc = Sc * Sf + Dc * Df;
1414>
1415> 即: 结果色 = 源色彩 * 源因子 + 目标色彩 * 目标因子。
1416>
1417> Ra = Sa * Sf + Da * Df;
1418>
1419> 即: 结果透明度 = 源透明度 * 源因子 + 目标透明度 * 目标因子。
1420
1421RGA支持以下几种混合模型:
1422
1423> SRC:
1424>
1425> ​		Sf = 1, Df = 0;
1426>
1427> ​		[Rc,Ra] = [Sc,Sa];
1428>
1429> DST:
1430>
1431> ​		Sf = 0, Df = 1;
1432>
1433> ​		[Rc,Ra] = [Dc,Da];
1434>
1435> SRC_OVER:
1436>
1437> ​		Sf = 1, Df = (1 - Sa);
1438>
1439> ​		[Rc,Ra] = [ Sc + (1 - Sa) * Dc, Sa + (1 - Sa) * Da ];
1440>
1441> DST_OVER:
1442>
1443> ​		Sf = (1 - Da) , Df = 1;
1444>
1445> ​		[Rc,Ra] = [ Sc * (1 - Da)  + Dc, Sa * (1 - Da) + Da ] ;
1446
1447【注意】图像合成模式不支持YUV格式之间合成,imblend函数dst图像不支持YUV格式,imcomposite函数srcB图像不支持YUV格式。
1448
1449| Parameter        | Description                                                  |
1450| ---------------- | ------------------------------------------------------------ |
1451| fg_image         | **[required]** foreground image                              |
1452| bg_image         | **[required]** background image, when A+B->B it is also the output destination image. |
1453| output_image     | **[required]** output destination image.                     |
1454| mode             | **[optional]** blending mode:<br/>IM_ALPHA_BLEND_SRC —— SRC模式<br/>IM_ALPHA_BLEND_DST —— DST模式  <br/>IM_ALPHA_BLEND_SRC_OVER —— SRC OVER模式<br/>IM_ALPHA_BLEND_DST_OVER —— DST OVER模式<br />IM_ALPHA_BLEND_PRE_MUL —— 预乘使能,当需要预乘时须将该标识与其他模式标识进行或处理,再赋值给mode |
1455| sync             | **[optional]** wait until operation complete                 |
1456| release_fence_fd | **[optional]**Used in async mode, as a parameter of imsync() |
1457
1458**Return** IM_STATUS_SUCCESS on success or else negative error code.
1459
1460
1461
1462#### imblendTask/imcompositeTask
1463
1464```c++
1465IM_API IM_STATUS imblendTask(im_job_handle_t job_handle,
1466                             const rga_buffer_t fg_image,
1467                             rga_buffer_t bg_image,
1468                             int mode = IM_ALPHA_BLEND_SRC_OVER);
1469```
1470
1471> 通过job_handle向指定的任务中添加A+B -> B模式的图像合成操作,用法和imblend一致,当没有配置混合模式时则默认设置为src-over模式。
1472
1473```c++
1474IM_API IM_STATUS imcompositeTask(im_job_handle_t job_handle,
1475                                 const rga_buffer_t fg_image,
1476                                 const rga_buffer_t bg_image,
1477                                 rga_buffer_t output_image,
1478                                 int mode = IM_ALPHA_BLEND_SRC_OVER);
1479```
1480
1481> 通过job_handle向指定的任务中添加A+B -> C模式的图像合成操作,用法和imcomposite一致,当没有配置混合模式时则默认设置为src-over模式。
1482
1483【注意】图像合成模式不支持YUV格式之间合成,imblend函数dst图像不支持YUV格式,imcomposite函数srcB图像不支持YUV格式。
1484
1485| Parameter    | Description                                                  |
1486| ------------ | ------------------------------------------------------------ |
1487| job_handle   | **[required]** job handle                                    |
1488| fg_image     | **[required]** foreground image                              |
1489| bg_image     | **[required]** background image, when A+B->B it is also the output destination image. |
1490| output_image | **[required]** output destination image.                     |
1491| mode         | **[optional]** blending mode:<br/>IM_ALPHA_BLEND_SRC —— SRC模式<br/>IM_ALPHA_BLEND_DST —— DST模式  <br/>IM_ALPHA_BLEND_SRC_OVER —— SRC OVER模式<br/>IM_ALPHA_BLEND_DST_OVER —— DST OVER模式<br />IM_ALPHA_BLEND_PRE_MUL —— 预乘使能,当需要预乘时须将该标识与其他模式标识进行或处理,再赋值给mode |
1492
1493**Return** IM_STATUS_SUCCESS on success or else negative error code.
1494
1495
1496
1497### 色键(Color Key)
1498
1499#### imcolorkey
1500
1501```C++
1502IM_STATUS imcolorkey(const rga_buffer_t src,
1503                     rga_buffer_t dst,
1504                     im_colorkey_range range,
1505                     int mode = IM_ALPHA_COLORKEY_NORMAL,
1506                     int sync = 1,
1507                     int *release_fence_fd = NULL);
1508```
1509
1510> Color Key技术是对源图像进行预处理,将符合色键过滤条件的像素的alpha分量置零,其中所述色键过滤条件为非透明的颜色值,并将预处理后的源图像与目标图像进行alpha混合模式。
1511>
1512> 该模式仅支持在源图像(src)区域的图像上针对设定的颜色范围实现Color Key功能,并叠加在目标图像(dst)区域上。
1513
1514> IM_ALPHA_COLORKEY_NORMAL为正常模式,即在设定的颜色范围内的颜色作为过滤条件,在该色彩范围内的像素点Alpha分量清零,IM_ALPHA_COLORKEY_INVERTED则反之,当没有配置模式时则默认设置为IM_ALPHA_COLORKEY_NORMAL模式。
1515
1516| **Parameters** | **Range**        | **Description**                           |
1517| -------------- | ---------------- | ----------------------------------------- |
1518| max            | 0x0 ~ 0xFFFFFFFF | 需要消去/抠取的颜色范围最大值,排列为ABGR |
1519| min            | 0x0 ~ 0xFFFFFFFF | 需要消去/抠取的颜色范围最小值,排列为ABGR |
1520
1521| parameter        | Description                                                  |
1522| ---------------- | ------------------------------------------------------------ |
1523| src              | **[required]** input image                                   |
1524| dst              | **[required]** output image                                  |
1525| range            | **[required]** Target color range<br/>typedef struct im_colorkey_range {<br/>    int max;<br/>    int min;<br/>} im_colorkey_value; |
1526| Mode             | **[required]** Color Key mode:<br/>IM_ALPHA_COLORKEY_NORMAL<br/>IM_ALPHA_COLORKEY_INVERTED |
1527| sync             | **[optional]** wait until operation complete                 |
1528| release_fence_fd | **[optional]**Used in async mode, as a parameter of imsync() |
1529
1530**Return** IM_STATUS_SUCCESS  on success or else negative error code.
1531
1532
1533
1534#### imcolorkeyTask
1535
1536```C++
1537IM_API IM_STATUS imcolorkeyTask(im_job_handle_t job_handle,
1538                                const rga_buffer_t fg_image,
1539                                rga_buffer_t bg_image,
1540                                im_colorkey_range range,
1541                                int mode = IM_ALPHA_COLORKEY_NORMAL);
1542```
1543
1544> 通过job_handle向指定的任务中添加图像Color Key操作,用法和imcolorkey一致,当没有配置模式时则默认设置为IM_ALPHA_COLORKEY_NORMAL模式。
1545
1546| **Parameters** | **Range**        | **Description**                           |
1547| -------------- | ---------------- | ----------------------------------------- |
1548| max            | 0x0 ~ 0xFFFFFFFF | 需要消去/抠取的颜色范围最大值,排列为ABGR |
1549| min            | 0x0 ~ 0xFFFFFFFF | 需要消去/抠取的颜色范围最小值,排列为ABGR |
1550
1551| parameter  | Description                                                  |
1552| ---------- | ------------------------------------------------------------ |
1553| job_handle | **[required]** job handle                                    |
1554| src        | **[required]** input image                                   |
1555| dst        | **[required]** output image                                  |
1556| range      | **[required]** Target color range<br/>typedef struct im_colorkey_range {<br/>    int max;<br/>    int min;<br/>} im_colorkey_value; |
1557| Mode       | **[required]** Color Key mode:<br/>IM_ALPHA_COLORKEY_NORMAL<br/>IM_ALPHA_COLORKEY_INVERTED |
1558
1559**Return** IM_STATUS_SUCCESS  on success or else negative error code.
1560
1561
1562
1563### 图像字幕叠加(OSD)
1564
1565#### imosd
1566
1567```c++
1568IM_API IM_STATUS imosd(const rga_buffer_t osd,
1569                       const rga_buffer_t bg_image,
1570                       const im_rect osd_rect,
1571                       im_osd_t *osd_config,
1572                       int sync = 1,
1573                       int *release_fence_fd = NULL);
1574```
1575
1576> OSD(On-Screen-Display)功能,可以将文字信息叠加在视频图片上,并对字体进行亮度统计、自动反色功能。
1577
1578| parameter        | Description                                                  |
1579| ---------------- | ------------------------------------------------------------ |
1580| OSD              | **[required]** osd block image                               |
1581| bg_image         | **[required]** output image                                  |
1582| osd_rect         | **[required]** image region to OSD                           |
1583| osd_config       | **[required]** OSD function config                           |
1584| sync             | **[optional]** wait until operation complete                 |
1585| release_fence_fd | **[optional]**Used in async mode, as a parameter of imsync() |
1586
1587**Return** IM_STATUS_SUCCESS  on success or else negative error code.
1588
1589
1590
1591#### imosdTask
1592
1593```c++
1594IM_API IM_STATUS imosdTask(im_job_handle_t job_handle,
1595                           const rga_buffer_t osd,
1596                           const rga_buffer_t bg_image,
1597                           const im_rect osd_rect,
1598                           im_osd_t *osd_config);
1599```
1600
1601> 通过job_handle向指定的任务中添加图像OSD操作,用法和imosd一致。
1602
1603| parameter  | Description                        |
1604| ---------- | ---------------------------------- |
1605| job_handle | **[required]** job handle          |
1606| OSD        | **[required]** osd block image     |
1607| dst        | **[required]** output image        |
1608| osd_rect   | **[required]** image region to OSD |
1609| osd_config | **[required]** OSD function config |
1610
1611**Return** IM_STATUS_SUCCESS  on success or else negative error code.
1612
1613
1614
1615### NN运算点前处理(量化)
1616
1617#### imquantize
1618
1619```c++
1620IM_STATUS imquantize(const rga_buffer_t src,
1621                     rga_buffer_t dst,
1622                     rga_nn_t nn_info,
1623                     int sync = 1,
1624                     int *release_fence_fd = NULL);
1625```
1626
1627> 目前仅RV1126 / RV1109上支持。NN运算点前处理,图像RGB 三个通道可以分开单独配置offset以及scale。
1628
1629公式:
1630
1631```
1632dst = 【(src + offset) * scale 】
1633```
1634
1635参数范围:
1636
1637| **Parameters** | **Range**  | **Description**                                              |
1638| -------------- | ---------- | ------------------------------------------------------------ |
1639| **scale**      | 0 ~ 3.99   | 10bit,从左往右,高位2个bit 表示整数部分,低位8bit表示小数部分 |
1640| **offset**     | -255 ~ 255 | 9bit,从左往右,高位表示符号位,地位表示0~255的偏移量       |
1641
1642| parameter        | Description                                                  |
1643| ---------------- | ------------------------------------------------------------ |
1644| src              | **[required]** input image                                   |
1645| dst              | **[required]** output image                                  |
1646| nn_info          | **[required]** rga_nn_t结构体对RGB三个通道offset及scale进行单独配置<br />typedef struct rga_nn { <br/>  int nn_flag;<br/>  int scale_r;<br/>  int scale_g;<br/>  int scale_b;<br/>  int offset_r;<br/>  int offset_g;<br/>  int offset_b;<br/>} rga_nn_t; |
1647| sync             | **[optional]** wait until operation complete                 |
1648| release_fence_fd | **[optional]**Used in async mode, as a parameter of imsync() |
1649
1650**Return** IM_STATUS_SUCCESS on success or else negative error code.
1651
1652
1653
1654#### imquantizeTask
1655
1656```c++
1657IM_API IM_STATUS imquantizeTask(im_job_handle_t job_handle,
1658                                const rga_buffer_t src,
1659                                rga_buffer_t dst,
1660                                im_nn_t nn_info);
1661```
1662
1663> 通过job_handle向指定的任务中添加图像量化操作,用法和imquantize一致。
1664
1665| parameter  | Description                                                  |
1666| ---------- | ------------------------------------------------------------ |
1667| job_handle | **[required]** job handle                                    |
1668| src        | **[required]** input image                                   |
1669| dst        | **[required]** output image                                  |
1670| nn_info    | **[required]** rga_nn_t结构体对RGB三个通道offset及scale进行单独配置<br />typedef struct rga_nn { <br/>  int nn_flag;<br/>  int scale_r;<br/>  int scale_g;<br/>  int scale_b;<br/>  int offset_r;<br/>  int offset_g;<br/>  int offset_b;<br/>} rga_nn_t; |
1671
1672**Return** IM_STATUS_SUCCESS on success or else negative error code.
1673
1674
1675
1676### 图像光栅操作 ROP
1677
1678#### imrop
1679
1680```C++
1681IM_STATUS imrop(const rga_buffer_t src,
1682                rga_buffer_t dst,
1683                int rop_code,
1684                int sync = 1,
1685                int *release_fence_fd = NULL);
1686```
1687
1688> 对两个图形做ROP运算
1689
1690| parameter        | Description                                                  |
1691| ---------------- | ------------------------------------------------------------ |
1692| src              | **[required]** input image                                   |
1693| dst              | **[required]** output image                                  |
1694| rop_code         | **[required]** rop code mode <br /><br/> IM_ROP_AND : dst = dst **AND** src;<br/> IM_ROP_OR : dst = dst **OR** src <br/> IM_ROP_NOT_DST : dst = **NOT** dst<br/> IM_ROP_NOT_SRC : dst = **NOT** src<br/> IM_ROP_XOR : dst = dst **XOR** src<br/> IM_ROP_NOT_XOR : dst = **NOT** (dst **XOR** src)<br/> |
1695| sync             | **[optional]** wait until operation complete                 |
1696| release_fence_fd | **[optional]**Used in async mode, as a parameter of imsync() |
1697
1698**Return** IM_STATUS_SUCCESS on success or else negative error code.
1699
1700
1701
1702#### imropTask
1703
1704```C++
1705IM_API IM_STATUS imropTask(im_job_handle_t job_handle,
1706                           const rga_buffer_t src,
1707                           rga_buffer_t dst,
1708                           int rop_code);
1709```
1710
1711> 通过job_handle向指定的任务中添加图像ROP运算操作,用法和imrop一致。
1712
1713| parameter  | Description                                                  |
1714| ---------- | ------------------------------------------------------------ |
1715| job_handle | **[required]** job handle                                    |
1716| src        | **[required]** input image                                   |
1717| dst        | **[required]** output image                                  |
1718| rop_code   | **[required]** rop code mode <br /><br/> IM_ROP_AND : dst = dst **AND** src;<br/> IM_ROP_OR : dst = dst **OR** src <br/> IM_ROP_NOT_DST : dst = **NOT** dst<br/> IM_ROP_NOT_SRC : dst = **NOT** src<br/> IM_ROP_XOR : dst = dst **XOR** src<br/> IM_ROP_NOT_XOR : dst = **NOT** (dst **XOR** src) |
1719
1720**Return** IM_STATUS_SUCCESS on success or else negative error code.
1721
1722
1723
1724### 图像颜色填充、边框绘制
1725
1726#### imfill
1727
1728```C++
1729IM_STATUS imfill(rga_buffer_t dst,
1730                 im_rect rect,
1731                 int color,
1732                 int sync = 1,
1733                 int *release_fence_fd = NULL);
1734```
1735
1736> 对图像的指定区域rect进行颜色填充。
1737>
1738> color参数按照RGBA格式填写颜色值,由高到低位分别是A,B,G,R,例如,红色:color = 0x000000ff.
1739
1740【注意】填充区域rect宽高须大于或等于2
1741
1742| Parameter        | Description                                                  |
1743| ---------------- | ------------------------------------------------------------ |
1744| dst              | **[required]** target image                                  |
1745| rect             | **[required]** image region to fill specified color<br/>width and height of rect must be greater than or equal to 2 |
1746| color            | **[required]** fill with color                               |
1747| sync             | **[optional]** wait until operation complete                 |
1748| release_fence_fd | **[optional]**Used in async mode, as a parameter of imsync() |
1749
1750**Return** IM_STATUS_SUCCESS on success or else negative error code.
1751
1752
1753
1754#### imfillArray
1755
1756```C++
1757IM_API IM_STATUS imfillArray(rga_buffer_t dst,
1758                             im_rect *rect_array,
1759                             int array_size,
1760                             uint32_t color,
1761                             int sync = 1,
1762                             int *release_fence_fd = NULL);
1763```
1764
1765> 对图像的多个区域逐个进行颜色填充。
1766>
1767> color参数按照RGBA格式填写颜色值,由高到低位分别是A,B,G,R,例如,红色:color = 0x000000ff.
1768
1769【注意】填充区域rect宽高须大于或等于2
1770
1771| Parameter        | Description                                                  |
1772| ---------------- | ------------------------------------------------------------ |
1773| dst              | **[required]** target image                                  |
1774| rect_array       | **[required]** image region array_ptr to fill specified color<br/>width and height of rect must be greater than or equal to 2 |
1775| array_size       | **[required]** size of region arrays.                        |
1776| color            | **[required]** fill with color                               |
1777| sync             | **[optional]** wait until operation complete                 |
1778| release_fence_fd | **[optional]**Used in async mode, as a parameter of imsync() |
1779
1780**Return** IM_STATUS_SUCCESS on success or else negative error code.
1781
1782
1783
1784#### imfillTask
1785
1786```C++
1787IM_API IM_STATUS imfillTask(im_job_handle_t job_handle,
1788                            rga_buffer_t dst,
1789                            im_rect rect,
1790                            uint32_t color);
1791```
1792
1793> 通过job_handle向指定的任务中添加图像填充操作,用法和imfill一致。
1794
1795【注意】填充区域rect宽高须大于或等于2
1796
1797| Parameter  | Description                                                  |
1798| ---------- | ------------------------------------------------------------ |
1799| job_handle | **[required]** job handle                                    |
1800| dst        | **[required]** target image                                  |
1801| rect       | **[required]** image region to fill specified color<br/>width and height of rect must be greater than or equal to 2 |
1802| color      | **[required]** fill with color                               |
1803
1804**Return** IM_STATUS_SUCCESS on success or else negative error code.
1805
1806
1807
1808#### imfillTaskArray
1809
1810```C++
1811IM_API IM_STATUS imfillTaskArray(im_job_handle_t job_handle,
1812                                 rga_buffer_t dst,
1813                                 im_rect *rect_array,
1814                                 int array_size,
1815                                 uint32_t color);
1816```
1817
1818> 通过job_handle向指定的任务中添加对图像多个区域进行颜色填充的操作,用法和imfillArray一致。
1819
1820【注意】填充区域rect宽高须大于或等于2
1821
1822| Parameter  | Description                                                  |
1823| ---------- | ------------------------------------------------------------ |
1824| job_handle | **[required]** job handle                                    |
1825| dst        | **[required]** target image                                  |
1826| rect_array | **[required]** image region array_ptr to fill specified color<br/>width and height of rect must be greater than or equal to 2 |
1827| array_size | **[required]** size of region arrays.                        |
1828| color      | **[required]** fill with color                               |
1829
1830**Return** IM_STATUS_SUCCESS on success or else negative error code.
1831
1832
1833
1834#### imrectangle
1835
1836```C++
1837IM_API IM_STATUS imrectangle(rga_buffer_t dst,
1838                             im_rect rect,
1839                             uint32_t color,
1840                             int thickness,
1841                             int sync = 1,
1842                             int *release_fence_fd = NULL);
1843```
1844
1845> 对图像的指定区域rect(描述为边框外径)根据指定颜色color进行绘制粗细为thickness的边框,当thickness为负时填充一个实心的矩形。
1846>
1847> color参数按照RGBA格式填写颜色值,由高到低位分别是A,B,G,R,例如,红色:color = 0x000000ff.
1848
1849【注意】填充区域rect宽高须大于或等于2
1850
1851| Parameter        | Description                                                  |
1852| ---------------- | ------------------------------------------------------------ |
1853| dst              | **[required]** target image                                  |
1854| rect             | **[required]** image region to fill specified color<br/>width and height of rect must be greater than or equal to 2 |
1855| color            | **[required]** fill with color                               |
1856| thickness        | **[required]** Thickness of lines that make up the rectangle.<br/>Negative values, like -1, mean that the function has to draw a filled rectangle. |
1857| sync             | **[optional]** wait until operation complete                 |
1858| release_fence_fd | **[optional]**Used in async mode, as a parameter of imsync() |
1859
1860**Return** IM_STATUS_SUCCESS on success or else negative error code.
1861
1862
1863
1864#### imrectangleArray
1865
1866```C++
1867IM_API IM_STATUS imrectangleArray(rga_buffer_t dst,
1868                                  im_rect *rect_array,
1869                                  int array_size,
1870                                  uint32_t color,
1871                                  int thickness,
1872                                  int sync = 1,
1873                                  int *release_fence_fd = NULL);
1874```
1875
1876> 对图像的多个指定区域rect(描述为边框外径)逐个根据指定颜色color进行绘制粗细为thickness的边框,当thickness为负时填充一个实心的矩形。
1877>
1878> color参数按照RGBA格式填写颜色值,由高到低位分别是A,B,G,R,例如,红色:color = 0x000000ff.
1879
1880【注意】填充区域rect宽高须大于或等于2
1881
1882| Parameter        | Description                                                  |
1883| ---------------- | ------------------------------------------------------------ |
1884| dst              | **[required]** target image                                  |
1885| rect_array       | **[required]** image region array_ptr to fill specified color<br/>width and height of rect must be greater than or equal to 2 |
1886| array_size       | **[required]** size of region arrays.                        |
1887| color            | **[required]** fill with color                               |
1888| thickness        | **[required]** Thickness of lines that make up the rectangle.<br/>Negative values, like -1, mean that the function has to draw a filled rectangle. |
1889| sync             | **[optional]** wait until operation complete                 |
1890| release_fence_fd | **[optional]**Used in async mode, as a parameter of imsync() |
1891
1892**Return** IM_STATUS_SUCCESS on success or else negative error code.
1893
1894
1895
1896#### imrectangleTask
1897
1898```C++
1899IM_API IM_STATUS imrectangleTask(im_job_handle_t job_handle,
1900                                 rga_buffer_t dst,
1901                                 im_rect rect,
1902                                 uint32_t color,
1903                                 int thickness);
1904```
1905
1906> 通过job_handle向指定的任务中添加图像填充矩形边框操作,用法和imrectangle一致。
1907
1908【注意】填充区域rect宽高须大于或等于2
1909
1910| Parameter  | Description                                                  |
1911| ---------- | ------------------------------------------------------------ |
1912| job_handle | **[required]** job handle                                    |
1913| dst        | **[required]** target image                                  |
1914| rect       | **[required]** image region to fill specified color<br/>width and height of rect must be greater than or equal to 2 |
1915| color      | **[required]** fill with color                               |
1916| thickness  | **[required]** Thickness of lines that make up the rectangle.<br/>Negative values, like -1, mean that the function has to draw a filled rectangle. |
1917
1918**Return** IM_STATUS_SUCCESS on success or else negative error code.
1919
1920
1921
1922#### imrectangleTaskArray
1923
1924```C++
1925IM_API IM_STATUS imrectangleTaskArray(im_job_handle_t job_handle,
1926                                      rga_buffer_t dst,
1927                                      im_rect *rect_array,
1928                                      int array_size,
1929                                      uint32_t color,
1930                                      int thickness);
1931```
1932
1933> 通过job_handle向指定的任务中添加对图像绘制多个矩形边框的操作,用法和imrectangleArray一致。
1934
1935【注意】填充区域rect宽高须大于或等于2
1936
1937| Parameter  | Description                                                  |
1938| ---------- | ------------------------------------------------------------ |
1939| job_handle | **[required]** job handle                                    |
1940| dst        | **[required]** target image                                  |
1941| rect_array | **[required]** image region array_ptr to fill specified color<br/>width and height of rect must be greater than or equal to 2 |
1942| array_size | **[required]** size of region arrays.                        |
1943| color      | **[required]** fill with color                               |
1944| thickness  | **[required]** Thickness of lines that make up the rectangle.<br/>Negative values, like -1, mean that the function has to draw a filled rectangle. |
1945
1946**Return** IM_STATUS_SUCCESS on success or else negative error code.
1947
1948
1949
1950#### immakeBorder
1951
1952```C++
1953IM_API IM_STATUS immakeBorder(rga_buffer_t src,
1954                              rga_buffer_t dst,
1955                              int top,
1956                              int bottom,
1957                              int left,
1958                              int right,
1959                              int border_type,
1960                              int value = 0,
1961                              int sync = 1,
1962                              int acquir_fence_fd = -1,
1963                              int *release_fence_fd = NULL);
1964```
1965
1966> 根据配置的top/bottom/left/right像素数,对输入图像绘制边框后,输出到输出的目标图像缓冲区上。
1967
1968【注意】top/bottom/left/right值须大于或等于2
1969
1970| Parameter        | Description                                                  |
1971| ---------------- | ------------------------------------------------------------ |
1972| src              | **[required]** input source image                            |
1973| dst              | **[required]** output target image                           |
1974| top              | **[required]** number of top pixels                          |
1975| bottom           | **[required]** number of bottom pixels                       |
1976| left             | **[required]** number of left pixels                         |
1977| right            | **[required] **number of right pixels                        |
1978| border_type      | **[required]** Border type<br/>IM_BORDER_CONSTANT // iiiiii abcdefgh iiiiiii with some specified value 'i' <br/>IM_BORDER_REFLECT     //fedcba abcdefgh hgfedcb<br/>IM_BORDER_WRAP         //cdefgh abcdefgh abcdefg |
1979| value            | **[optional]** the pixel value at which the border is filled |
1980| sync             | **[optional]** wait until operation complete                 |
1981| acquire_fence_fd | **[required]** used in async mode, run the job after waiting foracquire_fence signal |
1982| release_fence_fd | **[required]** used in async mode, as a parameter of imsync() |
1983
1984**Return** IM_STATUS_SUCCESS on success or else negative error code.
1985
1986
1987
1988### 图像马赛克
1989
1990#### immosaic
1991
1992```c++
1993IM_API IM_STATUS immosaic(const rga_buffer_t image,
1994                          im_rect rect,
1995                          int mosaic_mode,
1996                          int sync = 1,
1997                          int *release_fence_fd = NULL);
1998```
1999
2000> 对图像指定区域进行马赛克遮盖。
2001
2002| Parameter        | Description                                                  |
2003| ---------------- | ------------------------------------------------------------ |
2004| image            | **[required]** target image                                  |
2005| rect             | **[required]** image region to mosaic                        |
2006| mosaic_mode      | **[required]** set mosaic mode<br />    IM_MOSAIC_8<br/>    IM_MOSAIC_16<br/>    IM_MOSAIC_32<br/>    IM_MOSAIC_64<br/>    IM_MOSAIC_128 |
2007| sync             | **[optional]** wait until operation complete                 |
2008| release_fence_fd | **[optional]**Used in async mode, as a parameter of imsync() |
2009
2010**Return** IM_STATUS_SUCCESS on success or else negative error code.
2011
2012
2013
2014#### immosaicArray
2015
2016```c++
2017IM_API IM_STATUS immosaicArray(const rga_buffer_t image,
2018                               im_rect *rect_array,
2019                               int array_size,
2020                               int mosaic_mode,
2021                               int sync = 1,
2022                               int *release_fence_fd = NULL);
2023```
2024
2025> 对图像的多个区域逐个进行马赛克遮盖。
2026
2027| Parameter        | Description                                                  |
2028| ---------------- | ------------------------------------------------------------ |
2029| image            | **[required]** target image                                  |
2030| rect_array       | **[required]** image region array_ptr to mosaic              |
2031| array_size       | **[required]** size of region arrays.                        |
2032| mosaic_mode      | **[required]** set mosaic mode<br />    IM_MOSAIC_8<br/>    IM_MOSAIC_16<br/>    IM_MOSAIC_32<br/>    IM_MOSAIC_64<br/>    IM_MOSAIC_128 |
2033| sync             | **[optional]** wait until operation complete                 |
2034| release_fence_fd | **[optional]**Used in async mode, as a parameter of imsync() |
2035
2036**Return** IM_STATUS_SUCCESS on success or else negative error code.
2037
2038
2039
2040#### immosaicTask
2041
2042```c++
2043IM_API IM_STATUS immosaicTask(im_job_handle_t job_handle,
2044                              const rga_buffer_t image,
2045                              im_rect rect,
2046                              int mosaic_mode);
2047```
2048
2049> 通过job_handle向指定的任务中添加图像马赛克遮盖操作,用法和immosaic一致。
2050
2051| Parameter   | Description                                                  |
2052| ----------- | ------------------------------------------------------------ |
2053| job_handle  | **[required]** job handle                                    |
2054| image       | **[required]** target image                                  |
2055| rect        | **[required]** image region to mosaic                        |
2056| mosaic_mode | **[required]** set mosaic mode<br />    IM_MOSAIC_8<br/>    IM_MOSAIC_16<br/>    IM_MOSAIC_32<br/>    IM_MOSAIC_64<br/>    IM_MOSAIC_128 |
2057
2058**Return** IM_STATUS_SUCCESS on success or else negative error code.
2059
2060
2061
2062#### immosaicTaskArray
2063
2064```c++
2065IM_API IM_STATUS immosaicTaskArray(im_job_handle_t job_handle,
2066                                   const rga_buffer_t image,
2067                                   im_rect *rect_array,
2068                                   int array_size,
2069                                   int mosaic_mode);
2070```
2071
2072> 通过job_handle向指定的任务中添加对图像多个区域的马赛克遮盖操作,用法和immosaicArray一致。
2073
2074| Parameter   | Description                                                  |
2075| ----------- | ------------------------------------------------------------ |
2076| job_handle  | **[required]** job handle                                    |
2077| image       | **[required]** target image                                  |
2078| rect_array  | **[required]** image region array_ptr to mosaic              |
2079| array_size  | **[required]** size of region arrays.                        |
2080| mosaic_mode | **[required]** set mosaic mode<br />    IM_MOSAIC_8<br/>    IM_MOSAIC_16<br/>    IM_MOSAIC_32<br/>    IM_MOSAIC_64<br/>    IM_MOSAIC_128 |
2081
2082**Return** IM_STATUS_SUCCESS on success or else negative error code.
2083
2084
2085
2086### 图像处理
2087
2088#### improcess
2089
2090```C++
2091IM_STATUS improcess(rga_buffer_t src,
2092                    rga_buffer_t dst,
2093                    rga_buffer_t pat,
2094                    im_rect srect,
2095                    im_rect drect,
2096                    im_rect prect,
2097                    int acquire_fence_fd,
2098                    int *release_fence_fd,
2099                    im_opt_t *opt,
2100                    int usage);
2101```
2102
2103> RGA 图像复合操作函数,其他API都是基于此API开发,improcess 可以实现更复杂的复合操作。
2104>
2105> 图像操作通过usage 的方式进行配置。
2106
2107usage 参照定义:
2108
2109```c++
2110typedef enum {
2111    /* Rotation */
2112    IM_HAL_TRANSFORM_ROT_90     = 1 << 0,
2113    IM_HAL_TRANSFORM_ROT_180    = 1 << 1,
2114    IM_HAL_TRANSFORM_ROT_270    = 1 << 2,
2115    IM_HAL_TRANSFORM_FLIP_H     = 1 << 3,
2116    IM_HAL_TRANSFORM_FLIP_V     = 1 << 4,
2117    IM_HAL_TRANSFORM_FLIP_H_V   = 1 << 5,
2118    IM_HAL_TRANSFORM_MASK       = 0x3f,
2119
2120    /*
2121     * Blend
2122     * Additional blend usage, can be used with both source and target configs.
2123     * If none of the below is set, the default "SRC over DST" is applied.
2124     */
2125    IM_ALPHA_BLEND_SRC_OVER     = 1 << 6,     /* Default, Porter-Duff "SRC over DST" */
2126    IM_ALPHA_BLEND_SRC          = 1 << 7,     /* Porter-Duff "SRC" */
2127    IM_ALPHA_BLEND_DST          = 1 << 8,     /* Porter-Duff "DST" */
2128    IM_ALPHA_BLEND_SRC_IN       = 1 << 9,     /* Porter-Duff "SRC in DST" */
2129    IM_ALPHA_BLEND_DST_IN       = 1 << 10,    /* Porter-Duff "DST in SRC" */
2130    IM_ALPHA_BLEND_SRC_OUT      = 1 << 11,    /* Porter-Duff "SRC out DST" */
2131    IM_ALPHA_BLEND_DST_OUT      = 1 << 12,    /* Porter-Duff "DST out SRC" */
2132    IM_ALPHA_BLEND_DST_OVER     = 1 << 13,    /* Porter-Duff "DST over SRC" */
2133    IM_ALPHA_BLEND_SRC_ATOP     = 1 << 14,    /* Porter-Duff "SRC ATOP" */
2134    IM_ALPHA_BLEND_DST_ATOP     = 1 << 15,    /* Porter-Duff "DST ATOP" */
2135    IM_ALPHA_BLEND_XOR          = 1 << 16,    /* Xor */
2136    IM_ALPHA_BLEND_MASK         = 0x1ffc0,
2137
2138    IM_ALPHA_COLORKEY_NORMAL    = 1 << 17,
2139    IM_ALPHA_COLORKEY_INVERTED  = 1 << 18,
2140    IM_ALPHA_COLORKEY_MASK      = 0x60000,
2141
2142    IM_SYNC                     = 1 << 19,
2143    IM_ASYNC                    = 1 << 26,
2144    IM_CROP                     = 1 << 20,    /* Unused */
2145    IM_COLOR_FILL               = 1 << 21,
2146    IM_COLOR_PALETTE            = 1 << 22,
2147    IM_NN_QUANTIZE              = 1 << 23,
2148    IM_ROP                      = 1 << 24,
2149    IM_ALPHA_BLEND_PRE_MUL      = 1 << 25,
2150} IM_USAGE;
2151```
2152
2153| Parameter        | Description                                                  |
2154| ---------------- | ------------------------------------------------------------ |
2155| src              | **[required]** input imageA                                  |
2156| dst              | **[required]** output image                                  |
2157| pat              | **[required]** input imageB                                  |
2158| srect            | **[required]** src crop region                               |
2159| drect            | **[required]** dst crop region                               |
2160| prect            | **[required]** pat crop region                               |
2161| acquire_fence_fd | **[required]** Used in async mode, run the job after waiting foracquire_fence signal |
2162| release_fence_fd | **[required]** Used in async mode, as a parameter of imsync() |
2163| opt              | **[required]** operation options<br/>typedef struct im_opt {<br/>    int color;<br/>    im_colorkey_range colorkey_range; <br/>    im_nn_t nn;<br/>    int rop_code;<br/>     <br/>    int priority;<br/>    int core;<br/>} im_opt_t; |
2164| usage            | **[required]** image operation usage                         |
2165
2166**Return** IM_STATUS_SUCCESS on success or else negative error code.
2167
2168
2169
2170#### improcessTask
2171
2172```C++
2173IM_API IM_STATUS improcessTask(im_job_handle_t job_handle,
2174                               rga_buffer_t src,
2175                               rga_buffer_t dst,
2176                               rga_buffer_t pat,
2177                               im_rect srect,
2178                               im_rect drect,
2179                               im_rect prect,
2180                               im_opt_t *opt_ptr,
2181                               int usage);
2182```
2183
2184> 通过job_handle向指定的任务中添加复合图像处理操作,用法和improcess一致。
2185
2186| Parameter        | Description                                                  |
2187| ---------------- | ------------------------------------------------------------ |
2188| job_handle       | **[required]** job handle                                    |
2189| src              | **[required]** input imageA                                  |
2190| dst              | **[required]** output image                                  |
2191| pat              | **[required]** input imageB                                  |
2192| srect            | **[required]** src crop region                               |
2193| drect            | **[required]** dst crop region                               |
2194| prect            | **[required]** pat crop region                               |
2195| acquire_fence_fd | **[required]** Used in async mode, run the job after waiting foracquire_fence signal |
2196| release_fence_fd | **[required]** Used in async mode, as a parameter of imsync() |
2197| opt              | **[required]** operation options<br/>typedef struct im_opt {<br/>    int color;<br/>    im_colorkey_range colorkey_range; <br/>    im_nn_t nn;<br/>    int rop_code;<br/>     <br/>    int priority;<br/>    int core;<br/>} im_opt_t; |
2198| usage            | **[required]** image operation usage                         |
2199
2200**Return** IM_STATUS_SUCCESS on success or else negative error code.
2201
2202
2203
2204### 参数校验
2205
2206#### imcheck
2207
2208```c++
2209IM_API IM_STATUS imcheck(const rga_buffer_t src, const rga_buffer_t dst,
2210                         const im_rect src_rect, const im_rect dst_rect,
2211                         const int mode_usage);
2212IM_API IM_STATUS imcheck_composite(const rga_buffer_t src, const rga_buffer_t dst, const rga_buffer_t pat,
2213                                   const im_rect src_rect, const im_rect dst_rect, const im_rect pat_rect,
2214                                   const int mode_usage);
2215```
2216
2217> 在配置完毕RGA任务参数后,可以通过该接口校验当前参数是否合法,并根据当前硬件情况判断硬件是否支持。
2218>
2219> 建议该接口仅在开发调试阶段使用,避免多次校验导致性能损耗。
2220
2221| Parameter | Description                          |
2222| --------- | ------------------------------------ |
2223| src       | **[required]** input imageA          |
2224| dst       | **[required]** output image          |
2225| pat       | **[optional]** input imageB          |
2226| srect     | **[required]** src crop region       |
2227| drect     | **[required]** dst crop region       |
2228| prect     | **[optional]** pat crop region       |
2229| usage     | **[optional]** image operation usage |
2230
2231**Return** IM_STATUS_NOERROR on success or else negative error code.
2232
2233
2234
2235### 同步操作
2236
2237#### imsync
2238
2239```C++
2240IM_STATUS imsync(int fence_fd);
2241```
2242
2243> RGA异步模式需要调用该接口等待操作完成,将返回的release_fence_fd作为传入参数。
2244>
2245> 其他API 将 形参sync 设置为0时,使能异步调用模式,效果相当于opengl中的 glFlush,如果进一步调用imsync 可以达到glFinish的效果。
2246
2247| Parameter | Description                     |
2248| --------- | ------------------------------- |
2249| fence_fd  | **[required]** fence_fd to wait |
2250
2251**Return** IM_STATUS_SUCCESS on success or else negative error code.
2252
2253
2254
2255### 线程上下文配置
2256
2257#### imconfig
2258
2259```C++
2260IM_STATUS  imconfig(IM_CONFIG_NAME name, uint64_t value);
2261```
2262
2263> 通过不同的配置名对当前线程的上下文进行配置,该上下文将作为该线程的默认配置。
2264>
2265> 线程上下文的配置优先级低于接口的传参配置。如果接口传参配置未配置相关参数,则本地调用使用上下文默认配置完成本地调用;如果接口传参配置相关参数,以接口传参的配置完成本次调用。
2266
2267| parameter | Description                                                  |
2268| --------- | ------------------------------------------------------------ |
2269| name      | **[required]** context config name:<br/>IM_CONFIG_SCHEDULER_CORE —— 指定任务处理核心<br/>IM_CONFIG_PRIORITY                  —— 任务优先级<br/>IM_CHECK_CONFIG                      —— 校验使能 |
2270| value     | **[required]** config value<br/>IM_CONFIG_SCHEDULER_CORE :<br/>    IM_SCHEDULER_RGA3_CORE0<br/>    IM_SCHEDULER_RGA3_CORE1<br/>    IM_SCHEDULER_RGA2_CORE0<br/>    IM_SCHEDULER_RGA3_DEFAULT<br/>    IM_SCHEDULER_RGA2_DEFAULT<br/>IM_CONFIG_PRIORITY:<br/>    0 ~ 6<br/>IM_CHECK_CONFIG:<br/>    TRUE<br/>    FALSE |
2271
2272> 注意:priority、core权限极高,操作不当可能导致系统崩溃或死锁,建议仅用于开发调试阶段,极度不建议在实际产品场景进行配置。
2273
2274**Return** IM_STATUS_SUCCESS on success or else negative error code
2275
2276
2277
2278---
2279
2280## 数据结构
2281
2282本章节将详细描述应用接口中涉及的数据结构。
2283
2284### 概述
2285
2286| 数据结构            | 说明                     |
2287| ------------------- | ------------------------ |
2288| rga_buffer_t        | 描述图像缓冲区信息       |
2289| im_rect             | 描述图像实际操作区域     |
2290| im_opt_t            | 描述图像操作选项         |
2291| im_job_handle_t     | RGA任务句柄              |
2292| rga_buffer_handle_t | RGA驱动图像缓冲区句柄    |
2293| im_handle_param_t   | 描述待导入图像缓冲区属性 |
2294| im_context_t        | 当前线程默认上下文       |
2295| im_nn_t             | 描述运算点前处理参数     |
2296| im_colorkey_range   | Colorkey关键色范围       |
2297
2298
2299
2300### 详细描述
2301
2302#### rga_buffer_t
2303
2304- **说明**
2305
2306描述单一通道的图像缓冲区信息。
2307
2308- **路径**
2309
2310im2d_api/im2d_type.h
2311
2312- **定义**
2313
2314```c++
2315typedef struct {
2316    void* vir_addr;                     /* virtual address */
2317    void* phy_addr;                     /* physical address */
2318    int fd;                             /* shared fd */
2319    rga_buffer_handle_t handle;         /* buffer handle */
2320
2321    int width;                          /* width */
2322    int height;                         /* height */
2323    int wstride;                        /* wstride */
2324    int hstride;                        /* hstride */
2325    int format;                         /* format */
2326
2327    int color_space_mode;               /* color_space_mode */
2328    int global_alpha;                   /* global_alpha */
2329    int rd_mode;
2330} rga_buffer_t;
2331```
2332
2333| 成员参数         | 描述                                    |
2334| ---------------- | --------------------------------------- |
2335| vir_addr         | 图像缓冲区虚拟地址。                    |
2336| phy_addr         | 图像缓冲区连续的物理地址。              |
2337| fd               | 图像缓冲区DMA的文件描述符。             |
2338| handle           | 导入RGA驱动的图像缓冲区对应的内存句柄。 |
2339| width            | 图像实际操作区域的宽度,以像素为单位。  |
2340| height           | 图像实际操作区域的高度,以像素为单位。  |
2341| wstride          | 图像宽度的步幅,以像素为单位。          |
2342| hstride          | 图像高度的步幅,以像素为单位。          |
2343| format           | 图像格式。                              |
2344| color_space_mode | 图像色域空间。                          |
2345| global_alpha     | 全局Alpha配置。                         |
2346| rd_mode          | 当前通道读取数据模式。                  |
2347
2348- **注意事项**
2349
2350vir_addr、phy_addr、fd、handle只需选择其一作为图像缓冲区的描述即可,如多项赋值,则只会根据默认优先级选择其一作为图像缓冲区描述,优先级如下:handle > phy_addr > fd > vir_addr。
2351
2352
2353
2354#### im_rect
2355
2356- **说明**
2357
2358描述单一通道的图形实际操作区域。
2359
2360- **路径**
2361
2362im2d_api/im2d_type.h
2363
2364- **定义**
2365
2366```c++
2367typedef struct {
2368    int x;        /* upper-left x */
2369    int y;        /* upper-left y */
2370    int width;    /* width */
2371    int height;   /* height */
2372} im_rect;
2373```
2374
2375| 成员参数 | 描述                                         |
2376| -------- | -------------------------------------------- |
2377| x        | 图像实际操作区域的起始横坐标,以像素为单位。 |
2378| y        | 图像实际操作区域的起始纵坐标,以像素为单位。 |
2379| width    | 图像实际操作区域的宽度,以像素为单位。       |
2380| height   | 图像实际操作区域的高度,以像素为单位。       |
2381
2382- **注意事项**
2383
2384实际操作区域不能超出图像大小,即(x + width)<= wstride, (y + height) <= hstride。
2385
2386
2387
2388#### im_opt_t
2389
2390- **说明**
2391
2392描述当前任务图像操作选项。
2393
2394- **路径**
2395
2396im2d_api/im2d_type.h
2397
2398- **定义**
2399
2400```c++
2401typedef struct im_opt {
2402    im_api_version_t version DEFAULT_INITIALIZER(RGA_CURRENT_API_HEADER_VERSION);
2403    int color;                          /* color, used by color fill */
2404    im_colorkey_range colorkey_range;   /* range value of color key */
2405    im_nn_t nn;
2406    int rop_code;
2407    int priority;
2408    int core;
2409    int mosaic_mode;
2410    im_osd_t osd_config;
2411    im_intr_config_t intr_config;
2412    char reserve[128];
2413} im_opt_t;
2414```
2415
2416| 成员参数       | 描述                       |
2417| -------------- | -------------------------- |
2418| version        | 当前头文件版本             |
2419| color          | 填充图像颜色配置。         |
2420| colorkey_range | Colorkey关键色范围配置。   |
2421| nn             | 运算点前处理(量化)配置。 |
2422| rop_code       | 光栅操作ROP操作码配置。    |
2423| priority       | 当前任务优先级配置。       |
2424| core           | 当前任务指定硬件核心。     |
2425| mosaic_mode    | 马赛克模式配置。           |
2426| osd_config     | osd字幕叠加反色/统计配置。 |
2427| intr_config    | 提前中断模式配置。         |
2428| reserve        | 预留位。                   |
2429
2430- **注意事项**
2431
2432priority、core权限极高,操作不当可能导致系统崩溃或死锁,建议仅用于开发调试阶段,极度不建议在实际产品场景进行配置。
2433
2434
2435
2436#### im_job_handle_t
2437
2438- **说明**
2439
2440RGA任务句柄,用于标识当前配置的RGA任务。
2441
2442- **路径**
2443
2444im2d_api/im2d_type.h
2445
2446- **定义**
2447
2448```c++
2449typedef uint32_t im_job_handle_t;
2450```
2451
2452- **注意事项**
2453
2454配置失败后须使用 imcancelJob 释放当前任务句柄,避免内存泄漏。
2455
2456
2457
2458#### rga_buffer_handle_t
2459
2460- **说明**
2461
2462RGA驱动图像缓冲区句柄。
2463
2464- **路径**
2465
2466im2d_api/im2d_type.h
2467
2468- **定义**
2469
2470```c++
2471typedef int rga_buffer_handle_t;
2472```
2473
2474- **注意事项**
2475
2476当该内存使用完毕后须使用 releasebuffer_handle 释放内存,避免内存泄漏。
2477
2478
2479
2480#### im_handle_param_t
2481
2482- **说明**
2483
2484描述待导入的图像缓冲区描述参数。
2485
2486- **路径**
2487
2488im2d_api/im2d_type.h
2489
2490- **定义**
2491
2492```c++
2493typedef struct im_handle_param {
2494    uint32_t width;
2495    uint32_t height;
2496    uint32_t format;
2497} im_handle_param_t;
2498```
2499
2500| 成员参数      | 描述                                               |
2501| ------------- | -------------------------------------------------- |
2502| width_stride  | 描述待导入图像缓冲区的水平方向步幅,以像素为单位。 |
2503| height_stride | 描述待导入图像缓冲区的垂直方向步幅,以像素为单位。 |
2504| format        | 描述待导入图像缓冲区的格式。                       |
2505
2506- **注意事项**
2507
2508该结构描述为缓冲区内存开辟大小,如若实际开辟内存大小小于该结构配置大小,会导致 importbuffer_T 接口错误。
2509
2510
2511
2512#### im_nn_t
2513
2514- **说明**
2515
2516描述运算点前处理(量化)的参数。
2517
2518- **路径**
2519
2520im2d_api/im2d_type.h
2521
2522- **定义**
2523
2524```c++
2525typedef struct im_nn {
2526    int scale_r;                /* scaling factor on R channal */
2527    int scale_g;                /* scaling factor on G channal */
2528    int scale_b;                /* scaling factor on B channal */
2529    int offset_r;               /* offset on R channal */
2530    int offset_g;               /* offset on G channal */
2531    int offset_b;               /* offset on B channal */
2532} im_nn_t;
2533```
2534
2535| 成员参数 | 描述                |
2536| -------- | ------------------- |
2537| scale_r  | red分量缩放系数。   |
2538| scale_g  | green分量缩放系数。 |
2539| scale_b  | blue分量缩放系数。  |
2540| offset_r | red分量偏移值。     |
2541| offset_g | green分量偏移值。   |
2542| offset_b | blue分量偏移值。    |
2543
2544- **注意事项**
2545
25462547
2548
2549
2550#### im_colorkey_range
2551
2552- **说明**
2553
2554Colorkey关键色范围。
2555
2556- **路径**
2557
2558im2d_api/im2d_type.h
2559
2560- **定义**
2561
2562```c++
2563typedef struct {
2564    int max;                    /* The Maximum value of the color key */
2565    int min;                    /* The minimum value of the color key */
2566} im_colorkey_range;
2567```
2568
2569| 成员参数 | 描述               |
2570| -------- | ------------------ |
2571| max      | 关键色范围最大值。 |
2572| min      | 关键色范围最小值。 |
2573
2574- **注意事项**
2575
25762577
2578
2579
2580#### im_osd_block_t
2581
2582- **说明**
2583
2584OSD字块描述参数配置。
2585
2586- **路径**
2587
2588im2d_api/im2d_type.h
2589
2590- **定义**
2591
2592```c++
2593typedef struct im_osd_block {
2594    int width_mode;                 // normal or different
2595                                    //   IM_OSD_BLOCK_MODE_NORMAL
2596                                    //   IM_OSD_BLOCK_MODE_DIFFERENT
2597    union {
2598        int width;                  // normal_mode block width
2599        int width_index;            // different_mode block width index in RAM
2600    };
2601
2602    int block_count;                // block count
2603
2604    int background_config;          // background config is bright or dark
2605                                    //   IM_OSD_BACKGROUND_DEFAULT_BRIGHT
2606                                    //   IM_OSD_BACKGROUND_DEFAULT_DARK
2607
2608    int direction;                  // osd block direction
2609                                    //   IM_OSD_MODE_HORIZONTAL
2610                                    //   IM_OSD_MODE_VERTICAL
2611
2612    int color_mode;                 // using src1 color or config color
2613                                    //   IM_OSD_COLOR_PIXEL
2614                                    //   IM_OSD_COLOR_EXTERNAL
2615    im_color_t normal_color;        // config color: normal
2616    im_color_t invert_color;        // config color: invert
2617} im_osd_block_t;
2618```
2619
2620| 成员参数          | 描述                                                         |
2621| ----------------- | ------------------------------------------------------------ |
2622| width_mode        | 字块宽度模式配置:<br />    字块宽度相同:IM_OSD_BLOCK_MODE_NORMAL<br />    字块宽度不同:IM_OSD_BLOCK_MODE_DIFFERENT |
2623| width/width_index | width:字块宽度相同模式时使用,标识当前task OSD字块宽度。<br />width_index:字块宽度不同模式时使用,标识当前使用RAM内部的宽度配置表的索引。 |
2624| block_count       | 字块数量                                                     |
2625| background_config | 文字背景亮度描述:<br />    白底黑字:IM_OSD_BACKGROUND_DEFAULT_BRIGHT<br />    黑底白字:IM_OSD_BACKGROUND_DEFAULT_DARK |
2626| direction         | OSD方向:<br />    垂直方向:IM_OSD_MODE_VERTICAL<br />    水平方向:IM_OSD_MODE_HORIZONTAL |
2627| color_mode        | OSD字块颜色模式:<br />    像素颜色:IM_OSD_COLOR_PIXEL<br />    外部指导颜色:IM_OSD_COLOR_EXTERNAL |
2628| normal_color      | 外部指导颜色:正常时(非反色状态)字块颜色。                 |
2629| invert_color      | 外部指导颜色:反色时字块颜色。                               |
2630
2631- **注意事项**
2632
26332634
2635
2636
2637#### im_osd_invert_factor_t
2638
2639- **说明**
2640
2641OSD反色公式配置。
2642
2643- **路径**
2644
2645im2d_api/im2d_type.h
2646
2647- **定义**
2648
2649```c++
2650typedef struct im_osd_invert_factor {
2651    uint8_t alpha_max;
2652    uint8_t alpha_min;
2653    uint8_t yg_max;
2654    uint8_t yg_min;
2655    uint8_t crb_max;
2656    uint8_t crb_min;
2657} im_osd_invert_factor_t;
2658```
2659
2660计算公式如下:
2661
2662​		**MAX**(channel_min_factor, channel_max_factor - channel_value)
2663
2664
2665- **注意事项**
2666
26672668
2669
2670
2671#### im_osd_invert_t
2672
2673- **说明**
2674
2675OSD反色功能配置。
2676
2677- **路径**
2678
2679im2d_api/im2d_type.h
2680
2681- **定义**
2682
2683```c++
2684typedef struct im_osd_invert {
2685    int invert_channel;         // invert channel config:
2686                                //   IM_OSD_INVERT_CHANNEL_NONE
2687                                //   IM_OSD_INVERT_CHANNEL_Y_G
2688                                //   IM_OSD_INVERT_CHANNEL_C_RB
2689                                //   IM_OSD_INVERT_CHANNEL_ALPHA
2690                                //   IM_OSD_INVERT_CHANNEL_COLOR
2691                                //   IM_OSD_INVERT_CHANNEL_BOTH
2692    int flags_mode;             // use external or inertnal RAM invert flags
2693                                //   IM_OSD_FLAGS_EXTERNAL
2694                                //   IM_OSD_FLAGS_INTERNAL
2695    int flags_index;            // flags index when using internal RAM invert flags
2696
2697    uint64_t invert_flags;      // external invert flags
2698    uint64_t current_flags;     // current flags
2699
2700    int invert_mode;            // invert use swap or factor
2701                                //   IM_OSD_INVERT_USE_FACTOR
2702                                //   IM_OSD_INVERT_USE_SWAP
2703    im_osd_invert_factor_t factor;
2704
2705    int threash;
2706} im_osd_invert_t;
2707```
2708
2709| 成员参数       | 描述                                                         |
2710| -------------- | ------------------------------------------------------------ |
2711| invert_channel | 反色通道配置:<br />    默认无通道反色使能:IM_OSD_INVERT_CHANNEL_NONE<br />    Y/G分量反色使能:IM_OSD_INVERT_CHANNEL_Y_G<br />    C(UV)/RB分量反色使能:IM_OSD_INVERT_CHANNEL_C_RB<br />    Alpha分量反色使能:IM_OSD_INVERT_CHANNEL_ALPHA<br />    颜色值反色使能:IM_OSD_INVERT_CHANNEL_COLOR<br />                                   即(IM_OSD_INVERT_CHANNEL_Y_G \| IM_OSD_INVERT_CHANNEL_C_RB)。<br />    全部通道反色使能:IM_OSD_INVERT_CHANNEL_BOTH<br />                                       即(IM_OSD_INVERT_CHANNEL_COLOR \| IM_OSD_INVERT_CHANNEL_ALPHA)。 |
2712| flags_mode     | 反色指导模式:<br />    内部指导:IM_OSD_FLAGS_EXTERNAL,使用内部RAM统计的反色flag指导反色功能。<br />    外部指导:IM_OSD_FLAGS_INTERNAL,由外部指导反色功能。 |
2713| flags_index    | 当前使用RAM内部的反色指导flag表的索引。                      |
2714| invert_flags   | 外部指导反色配置表,共64个bit。                              |
2715| current_flags  | 当前task统计的反色配置表,共64个bit,task执行结束后读取。    |
2716| invert_mode    | 反色模式:<br />    自定义公式:IM_OSD_INVERT_USE_FACTOR<br />    默认公式:IM_OSD_INVERT_USE_SWAP,YUV格式对U、V分量进行交换,RGB格式对R、B分量进行交换。 |
2717| factor         | 反色公式配置。                                               |
2718| threash        | 反色阈值。                                                   |
2719
2720- **注意事项**
2721
27222723
2724
2725
2726#### im_osd_bpp2_t
2727
2728- **说明**
2729
2730OSD BPP2 RGB格式映射配置。
2731
2732- **路径**
2733
2734im2d_api/im2d_type.h
2735
2736- **定义**
2737
2738```c++
2739typedef struct im_osd_bpp2 {
2740    uint8_t  ac_swap;       // ac swap flag
2741                            // 0: CA
2742                            // 1: AC
2743    uint8_t  endian_swap;   // rgba2bpp endian swap
2744                            // 0: Big endian
2745                            // 1: Little endian
2746    im_color_t color0;
2747    im_color_t color1;
2748} im_osd_bpp2_t;
2749```
2750
2751| 成员参数    | 描述                     |
2752| ----------- | ------------------------ |
2753| ac_swap     | AC排布模式。             |
2754| endian_swap | 大小端配置。             |
2755| color0      | color值为0时映射的颜色。 |
2756| color1      | color值为1时映射的颜色。 |
2757
2758- **注意事项**
2759
27602761
2762
2763
2764#### im_osd_t
2765
2766- **说明**
2767
2768OSD功能配置。
2769
2770- **路径**
2771
2772im2d_api/im2d_type.h
2773
2774- **定义**
2775
2776```c++
2777typedef struct im_osd {
2778
2779  int osd_mode;            		// osd mode: statistics or auto_invert
2780  im_osd_block_t block_parm;    // osd block info config
2781  im_osd_invert_t invert_config;
2782  im_osd_bpp2_t bpp2_info;
2783} im_osd_t;
2784```
2785
2786| 成员参数      | 描述                                                         |
2787| ------------- | ------------------------------------------------------------ |
2788| osd_mode      | OSD模式:<br />    统计模式:IM_OSD_MODE_STATISTICS<br />    反色模式:IM_OSD_MODE_AUTO_INVERT |
2789| block_parm    | OSD block参数配置。                                          |
2790| invert_config | 反色功能配置。                                               |
2791| bpp2_info     | bpp2-rgb格式配置。                                           |
2792
2793- **注意事项**
2794
27952796
2797
2798
2799---
2800
2801## 测试用例及调试方法
2802
2803> 为了让开发者更加快捷的上手上述的新接口,这里通过运行demo和对demo源码的解析以加速开发者对API的理解和运用。
2804
2805
2806
2807### 测试文件说明
2808
2809> 用于测试的输入与输出二进制文件需提前准备好,在/sample/sample_file目录下,存放着默认的RGBA8888格式的源图像文件可以直接使用。
2810>
2811> Android系统须将源图片存储在设备/data/目录下,Linux系统须将源图储存在设备/usr/data目录下,文件命名规则如下:
2812
2813```
2814in%dw%d-h%d-%s.bin
2815out%dw%d-h%d-%s.bin
2816
2817示例:
28181280×720 RGBA8888的输入图像: in0w1280-h720-rgba8888.bin
28191280×720 RGBA8888的输出图像: out0w1280-h720-rgba8888.bin
2820```
2821
2822参数解释如下:
2823
2824> 输入文件为 in , 输出文件为 out
2825> --->第一个%d 是文件的索引, 一般为 0, 用于区别格式及宽高完全相同的文件
2826> --->第二个%d 是宽的意思, 这里的宽一般指虚宽
2827> --->第三个%d 是高的意思, 这里的高一般指虚高
2828> --->第四个%s 是格式的名字。
2829>
2830>  预置测试的部分常用图像格式如下,其他格式对应字符串名可以查看rgaUtils.cpp中查看:
2831
2832| format(Android)                 | format(Linux)            | name        |
2833| :-------------------------------- | -------------------------- | ----------- |
2834| HAL_PIXEL_FORMAT_RGB_565          | RK_FORMAT_RGB_565          | "rgb565"    |
2835| HAL_PIXEL_FORMAT_RGB_888          | RK_FORMAT_RGB_888          | "rgb888"    |
2836| HAL_PIXEL_FORMAT_RGBA_8888        | RK_FORMAT_RGBA_8888        | "rgba8888"  |
2837| HAL_PIXEL_FORMAT_RGBX_8888        | RK_FORMAT_RGBX_8888        | "rgbx8888"  |
2838| HAL_PIXEL_FORMAT_BGRA_8888        | RK_FORMAT_BGRA_8888        | "bgra8888"  |
2839| HAL_PIXEL_FORMAT_YCrCb_420_SP     | RK_FORMAT_YCrCb_420_SP     | "crcb420sp" |
2840| HAL_PIXEL_FORMAT_YCrCb_NV12       | RK_FORMAT_YCbCr_420_SP     | "nv12"      |
2841| HAL_PIXEL_FORMAT_YCrCb_NV12_VIDEO | /                          | "nv12"      |
2842| HAL_PIXEL_FORMAT_YCrCb_NV12_10    | RK_FORMAT_YCbCr_420_SP_10B | "nv12_10"   |
2843
2844> demo中默认的输入图像文件分辨率为1280x720,格式为RGBA8888, 则须在/data或/usr/data目录下提前准备好名为in0w1280-h720-rgba8888.bin的源图像文件,图像合成模式还须额外在/data或/usr/data目录下提前准备好名为in1w1280-h720-rgba8888.bin的源图像文件。
2845
2846
2847
2848### 调试方法说明
2849
2850> 运行demo后打印日志如下(以图像拷贝为例):
2851>
2852> Android中打印日志如下:
2853
2854```C++
2855# rgaImDemo --copy
2856
2857librga:RGA_GET_VERSION:3.02,3.020000					//RGA版本
2858ctx=0x7ba35c1520,ctx->rgaFd=3							//RGA上下文
2859Start selecting mode
2860im2d copy ..											//RGA运行模式
2861GraphicBuffer check ok
2862GraphicBuffer check ok
2863lock buffer ok
2864open file ok											//src文件的状态,如果/data/目录下没有对应文件这里会报错
2865unlock buffer ok
2866lock buffer ok
2867unlock buffer ok
2868copying .... successfully								//标志运行成功
2869open /data/out0w1280-h720-rgba8888.bin and write ok		//输出文件名以及目录
2870```
2871
2872> Linux系统中打印日志如下:
2873
2874```C++
2875# rgaImDemo --copy
2876
2877librga:RGA_GET_VERSION:3.02,3.020000					//RGA版本
2878ctx=0x2b070,ctx->rgaFd=3								//RGA上下文
2879Rga built version:version:1.00
2880Start selecting mode
2881im2d copy ..											//RGA运行模式
2882open file												//src文件的状态,如果/usr/data/目录下没有对应文件这里会报错
2883copying .... Run successfully							//标志运行成功
2884open /usr/data/out0w1280-h720-rgba8888.bin and write ok	//输出文件名以及目录
2885```
2886
2887> 当需要查看RGA运行更加详细的日志时,Android系统可以通过设置属性vendor.rga.log(Android 8及以下是sys.rga.log)来打开RGA配置log打印:
2888
2889```
2890setprop vendor.rga.log 1		打开RGA log打印
2891logcat -s librga				开启并过滤log打印
2892setprop vendor.rga.log 0		关闭RGA log打印
2893```
2894
2895> Linux系统中需要打开代码core/NormalRgaContext.h,将__DEBUG设置为1,重新编译即可
2896
2897```
2898#ifdef LINUX
2899
2900-#define __DEBUG 0
2901+#define __DEBUG 1
2902```
2903
2904> 一般打印log如下,可将此log上传至RedMine,由RK有关工程师分析:
2905>
2906> Android系统中打印日志如下:
2907
2908```
2909 D librga  : <<<<-------- print rgaLog -------->>>>
2910 D librga  : src->hnd = 0x0 , dst->hnd = 0x0
2911 D librga  : srcFd = 11 , phyAddr = 0x0 , virAddr = 0x0
2912 D librga  : dstFd = 15 , phyAddr = 0x0 , virAddr = 0x0
2913 D librga  : srcBuf = 0x0 , dstBuf = 0x0
2914 D librga  : blend = 0 , perpixelAlpha = 1
2915 D librga  : scaleMode = 0 , stretch = 0;
2916 D librga  : rgaVersion = 3.020000  , ditherEn =0
2917 D librga  : srcMmuFlag = 1 , dstMmuFlag = 1 , rotateMode = 0
2918 D librga  : <<<<-------- rgaReg -------->>>>
2919 D librga  : render_mode=0 rotate_mode=0
2920 D librga  : src:[b,0,e1000],x-y[0,0],w-h[1280,720],vw-vh[1280,720],f=0
2921 D librga  : dst:[f,0,e1000],x-y[0,0],w-h[1280,720],vw-vh[1280,720],f=0
2922 D librga  : pat:[0,0,0],x-y[0,0],w-h[0,0],vw-vh[0,0],f=0
2923 D librga  : ROP:[0,0,0],LUT[0]
2924 D librga  : color:[0,0,0,0,0]
2925 D librga  : MMU:[1,0,80000521]
2926 D librga  : mode[0,0,0,0]
2927```
2928
2929> Linux系统打印日志如下:
2930
2931```C++
2932render_mode=0 rotate_mode=0
2933src:[0,a681a008,a68fb008],x-y[0,0],w-h[1280,720],vw-vh[1280,720],f=0
2934dst:[0,a6495008,a6576008],x-y[0,0],w-h[1280,720],vw-vh[1280,720],f=0
2935pat:[0,0,0],x-y[0,0],w-h[0,0],vw-vh[0,0],f=0
2936ROP:[0,0,0],LUT[0]
2937color:[0,0,0,0,0]
2938MMU:[1,0,80000521]
2939mode[0,0,0,0,0]
2940gr_color_x [0, 0, 0]
2941gr_color_x [0, 0, 0]
2942```
2943
2944
2945
2946### 测试用例说明
2947
2948- 测试路径位于librga源码目录下 sample/im2d_api_demo ,开发者可以根据需求修改demo的配置,建议第一次运行demo使用默认配置。
2949- 测试用例的编译不同的平台编译是不同的,Android平台可以使用 ‘mm’ 命令进行编译,linux平台上在使用cmake编译librga.so时会在同目录下生成对应的测试用例。
2950
2951- 将对应的测试用例编译后生成的可执行文件通过adb传入设备,添加执行权限,执行demo,查看打印log。
2952- 查看输出文件,检查是否与预期相符。
2953
2954
2955
2956#### 申请图像缓冲
2957
2958> demo中提供了两种buffer用于RGA合成——Graphicbuffer、AHardwareBuffer。这两种buffer通过宏USE_AHARDWAREBUFFER区分。
2959
2960```c++
2961目录:librga/samples/im2d_api_demo/Android.mk
2962(line +15)
2963
2964ifeq (1,$(strip $(shell expr $(PLATFORM_SDK_VERSION) \> 25)))
2965/*USE_AHARDWAREBUFFER为1则使用AHardwareBuffer,为0使用Graphicbuffer*/
2966LOCAL_CFLAGS += -DUSE_AHARDWAREBUFFER=1
2967endif
2968```
2969
2970
2971
2972##### Graphicbuffer
2973
2974> 主要通过三个函数完成Graphicbuffer的初始化、填充/清空、填充rga_buffer_t结构体。
2975
2976```c++
2977	/*传入src/dst的宽、高、图像格式,初始化Graphicbuffer*/
2978	src_buf = GraphicBuffer_Init(SRC_WIDTH, SRC_HEIGHT, SRC_FORMAT);
2979	dst_buf = GraphicBuffer_Init(DST_WIDTH, DST_HEIGHT, DST_FORMAT);
2980
2981	/*通过枚举值FILL_BUFF/EMPTY_BUFF,执行填充/清空Graphicbuffer*/
2982	GraphicBuffer_Fill(src_buf, FILL_BUFF, 0);
2983	if(MODE == MODE_BLEND)
2984		GraphicBuffer_Fill(dst_buf, FILL_BUFF, 1);
2985	else
2986		GraphicBuffer_Fill(dst_buf, EMPTY_BUFF, 1);
2987
2988	/*填充rga_buffer_t结构体:src、dst*/
2989	src = wrapbuffer_GraphicBuffer(src_buf);
2990	dst = wrapbuffer_GraphicBuffer(dst_buf);
2991```
2992
2993
2994
2995##### AHardwareBuffer
2996
2997> 主要通过三个函数完成AHardwareBuffer的初始化、填充/清空、填充rga_buffer_t结构体。
2998
2999```c++
3000	/*传入src/dst的宽、高、图像格式,初始化AHardwareBuffer*/
3001	AHardwareBuffer_Init(SRC_WIDTH, SRC_HEIGHT, SRC_FORMAT, &src_buf);
3002	AHardwareBuffer_Init(DST_WIDTH, DST_HEIGHT, DST_FORMAT, &dst_buf);
3003
3004	/*通过枚举值FILL_BUFF/EMPTY_BUFF,执行填充/清空AHardwareBuffer*/
3005	AHardwareBuffer_Fill(&src_buf, FILL_BUFF, 0);
3006	if(MODE == MODE_BLEND)
3007		AHardwareBuffer_Fill(&dst_buf, FILL_BUFF, 1);
3008	else
3009		AHardwareBuffer_Fill(&dst_buf, EMPTY_BUFF, 1);
3010
3011	/*填充rga_buffer_t结构体:src、dst*/
3012	src = wrapbuffer_AHardwareBuffer(src_buf);
3013	dst = wrapbuffer_AHardwareBuffer(dst_buf);
3014```
3015
3016
3017
3018#### 查看帮助信息
3019
3020> 使用如下命令获取测试用例帮助信息
3021
3022```
3023rgaImDemo -h
3024rgaImDemo --help
3025rgaImDemo
3026```
3027
3028> 运行成功后,便可以根据帮助信息使用demo,打印信息如下:
3029
3030```
3031rk3399_Android10:/ # rgaImDemo
3032librga:RGA_GET_VERSION:3.02,3.020000
3033ctx=0x7864d7c520,ctx->rgaFd=3
3034
3035=============================================================================================
3036   usage: rgaImDemo [--help/-h] [--while/-w=(time)] [--querystring/--querystring=<options>]
3037                    [--copy] [--resize=<up/down>] [--crop] [--rotate=90/180/270]
3038                    [--flip=H/V] [--translate] [--blend] [--cvtcolor]
3039                    [--fill=blue/green/red]
3040         --help/-h     Call help
3041         --while/w     Set the loop mode. Users can set the number of cycles by themselves.
3042         --querystring You can print the version or support information corresponding to the current version of RGA according to the options.
3043                       If there is no input options, all versions and support information of the current version of RGA will be printed.
3044                       <options>:
3045                       vendor           Print vendor information.
3046                       version          Print RGA version, and librga/im2d_api version.
3047                       maxinput         Print max input resolution.
3048                       maxoutput        Print max output resolution.
3049                       scalelimit       Print scale limit.
3050                       inputformat      Print supported input formats.
3051                       outputformat     Print supported output formats.
3052                       expected         Print expected performance.
3053                       all              Print all information.
3054         --copy        Copy the image by RGA.The default is 720p to 720p.
3055         --resize      resize the image by RGA.You can choose to up(720p->1080p) or down(720p->480p).
3056         --crop        Crop the image by RGA.By default, a picture of 300*300 size is cropped from (100,100).
3057         --rotate      Rotate the image by RGA.You can choose to rotate 90/180/270 degrees.
3058
3059         --flip        Flip the image by RGA.You can choice of horizontal flip or vertical flip.
3060         --translate   Translate the image by RGA.Default translation (300,300).
3061         --blend       Blend the image by RGA.Default, Porter-Duff 'SRC over DST'.
3062         --cvtcolor    Modify the image format and color space by RGA.The default is RGBA8888 to NV12.
3063         --fill        Fill the image by RGA to blue, green, red, when you set the option to the corresponding color.
3064=============================================================================================
3065```
3066
3067> 所有的参数解析在目录/librga/demo/im2d_api_demo/args.cpp中。
3068
3069
3070
3071#### 循环执行demo
3072
3073> 使用如下命令循环执行示例demo,循环命令必须在所有参数之前,循环次数为int型,默认每次循环间隔200ms。
3074
3075```
3076rgaImDemo -w6 --copy
3077rgaImDemo --while=6 --copy
3078```
3079
3080
3081
3082#### 获取RGA版本及支持信息
3083
3084> 使用如下命令获取版本及支持信息:
3085
3086```
3087rgaImDemo --querystring
3088rgaImDemo --querystring=<options>
3089```
3090
3091> 该命令有可选options,没有options则默认视为选择=all,可选options如下:
3092
3093```
3094options:
3095	=vendor				打印厂商信息
3096	=version			打印版本信息
3097	=maxinput			打印支持的最大输入分辨率
3098	=maxoutput			打印支持的最大输出分辨率
3099	=scalelimit			打印支持的缩放倍数
3100	=inputformat		打印支持的输入格式
3101	=outputformat		打印支持的输出格式
3102	=expected			打印预期性能
3103	=all				打印所有信息
3104```
3105
3106##### 代码解析
3107
3108> 根据main()传参决定打印出的不同信息。
3109
3110```c++
3111	/*将main()传参转化为QUERYSTRING_INFO枚举值*/
3112	IM_INFO = (QUERYSTRING_INFO)parm_data[MODE_QUERYSTRING];
3113	/*打印querystring()返回的字符串,即所需要的信息*/
3114	printf("\n%s\n", querystring(IM_INFO));
3115```
3116
3117
3118
3119#### 图像缩放
3120
3121> 使用如下命令进行图像缩放测试
3122
3123```
3124rgaImDemo --resize=up
3125rgaImDemo --resize=down
3126```
3127
3128> 该功能必须填入可选options,可选options如下:
3129
3130```
3131options:
3132	=up					图像分辨率放大至1920x1080
3133	=down 				图像分辨率缩小至720x480
3134```
3135
3136##### 代码解析
3137
3138> 根据main()传参(up/down)决定放大或是缩小,即针对不同场景,重新初始化、清空buffer,填充rga_buffer_t结构体,并将最终的存储src、dst图像数据的rga_buffer_t结构体传入imresize()。
3139
3140```c++
3141	switch(parm_data[MODE_RESIZE])
3142	{
3143        /*放大图像*/
3144		case IM_UP_SCALE :
3145            /*重新初始化Graphicbuffer为分辨率1920x1080对应大小*/
3146			dst_buf = GraphicBuffer_Init(1920, 1080, DST_FORMAT);
3147            /*清空buffer*/
3148			GraphicBuffer_Fill(dst_buf, EMPTY_BUFF, 1);
3149            /*重新填充存储dst数据的rga_buffer_t结构体*/
3150			dst = wrapbuffer_GraphicBuffer(dst_buf);
3151			break;
3152
3153		case IM_DOWN_SCALE :
3154            /*重新初始化Graphicbuffer为分辨率1920x1080对应大小*/
3155			dst_buf = GraphicBuffer_Init(720, 480, DST_FORMAT);
3156            /*清空buffer*/
3157			GraphicBuffer_Fill(dst_buf, EMPTY_BUFF, 1);
3158            /*重新填充存储dst数据的rga_buffer_t结构体*/
3159			dst = wrapbuffer_GraphicBuffer(dst_buf);
3160			break;
3161	}
3162	/*将rga_buffer_t格式的结构体src、dst传入imresize()*/
3163	STATUS = imresize(src, dst);
3164	/*根据返回的IM_STATUS枚举值打印运行状态*/
3165	printf("resizing .... %s\n", imStrError(STATUS));
3166```
3167
3168
3169
3170#### 图像裁剪
3171
3172> 使用如下命令测试图像裁剪
3173
3174```
3175rgaImDemo --crop
3176```
3177
3178> 该功能无可选options,默认裁剪坐标LT(100,100),RT(400,100),LB(100,400),RB(400,400)内的图像。
3179
3180##### 代码解析
3181
3182> 将需要裁剪的大小在存储src矩形数据的im_rect结构体中赋值,并将存储src、dst图像数据的rga_buffer_t结构体传入imcrop()。
3183
3184```c++
3185	/*这里通过x、y确定裁剪顶点的坐标,width、height确定裁剪区域大小*/
3186	src_rect.x      = 100;
3187	src_rect.y      = 100;
3188	src_rect.width  = 300;
3189	src_rect.height = 300;
3190
3191	/*将im_rect格式的结构体src_rect与rga_buffer_t格式的结构体src、dst传入imcrop()*/
3192	STATUS = imcrop(src, dst, src_rect);
3193	/*根据返回的IM_STATUS枚举值打印运行状态*/
3194	printf("cropping .... %s\n", imStrError(STATUS));
3195```
3196
3197
3198
3199#### 图像旋转
3200
3201> 使用如下命令测试图像旋转
3202
3203```
3204rgaImDemo --rotate=90
3205rgaImDemo --rotate=180
3206rgaImDemo --rotate=270
3207```
3208
3209> 该功能必须填入可选options,可选options如下:
3210
3211```
3212options:
3213	=90					图像旋转90° ,输出图像分辨率宽高交换
3214	=180 				图像旋转180°,输出图像分辨率不变
3215	=270 				图像旋转270°,输出图像分辨率宽高交换
3216```
3217
3218##### 代码解析
3219
3220> 根据main()传参(90/180/270)决定旋转角度,并将传参转化为IM_USAGE枚举值,与存储src、dst图像数据的rga_buffer_t结构体一同传入imrotate()。
3221
3222```c++
3223	/*将main()传参转化为IM_USAGE枚举值*/
3224	ROTATE = (IM_USAGE)parm_data[MODE_ROTATE];
3225
3226	/*将标识旋转角度的IM_USAGE枚举值与rga_buffer_t格式的结构体src、dst一同传入imrotate()*/
3227	STATUS = imrotate(src, dst, ROTATE);
3228	/*根据返回的IM_STATUS枚举值打印运行状态*/
3229	printf("rotating .... %s\n", imStrError(STATUS));
3230```
3231
3232
3233
3234#### 图像镜像翻转
3235
3236> 使用如下命令测试镜像翻转
3237
3238```
3239rgaImDemo --flip=H
3240rgaImDemo --flip=V
3241```
3242
3243> 该功能必须填入可选options,可选options如下:
3244
3245```
3246options:
3247	=H					图像水平镜像翻转
3248	=V 					图像垂直镜像翻转
3249```
3250
3251##### 代码解析
3252
3253> 根据main函数传参(H/V)决定镜像翻转方向,并将传参转化为IM_USAGE枚举值,与存储src、dst图像数据的rga_buffer_t结构体一同传入imflip()。
3254
3255```c++
3256	/*将main()传参转化为IM_USAGE枚举值*/
3257	FLIP = (IM_USAGE)parm_data[MODE_FLIP];
3258
3259	/*将标识镜像反转方向的IM_USAGE枚举值与rga_buffer_t格式的结构体src、dst一同传入imflip()*/
3260	STATUS = imflip(src, dst, FLIP);
3261	/*根据返回的IM_STATUS枚举值打印运行状态*/
3262	printf("flipping .... %s\n", imStrError(STATUS));
3263```
3264
3265
3266
3267#### 图像颜色填充
3268
3269> 使用如下命令测试颜色填充
3270
3271```
3272rgaImDemo --fill=blue
3273rgaImDemo --fill=green
3274rgaImDemo --fill=red
3275```
3276
3277该功能必须填入可选options,默认填充颜色在坐标LT(100,100),RT(400,100),LB(100,400),RB(400,400)内的图像,可选options如下:
3278
3279```
3280options:
3281	=blue				图像颜色填充为蓝色
3282	=green				图像颜色填充为绿色
3283	=red				图像颜色填充为红色
3284```
3285
3286##### 代码解析
3287
3288> 根据main函数传参(bule/green/red)决定填充颜色,将需要填充的大小在存储dst矩形数据的im_rect结构体中赋值,并将传参转化为对应颜色的16进制数,与存储dst图像数据的rga_buffer_t结构体一同传入imfill()。
3289
3290```c++
3291	/*将main()传参转化为对应颜色的16进制数*/
3292	COLOR = parm_data[MODE_FILL];
3293
3294	/*这里通过x、y确定裁剪顶点的坐标,width、height确定填充颜色区域大小*/
3295	dst_rect.x      = 100;
3296	dst_rect.y      = 100;
3297	dst_rect.width  = 300;
3298	dst_rect.height = 300;
3299
3300	/*将im_rect格式的结构体dst_rect、对应颜色的16进制数与rga_buffer_t格式的结构体src、dst一同传入imfill()*/
3301	STATUS = imfill(dst, dst_rect, COLOR);
3302	/*根据返回的IM_STATUS枚举值打印运行状态*/
3303	printf("filling .... %s\n", imStrError(STATUS));
3304```
3305
3306
3307
3308#### 图像平移
3309
3310> 使用如下命令测试图像平移操作
3311
3312```
3313rgaImDemo --translate
3314```
3315
3316> 该功能无可选options,默认顶点(左上角坐标)平移至(300,300),即向右平移300个像素,再向下平移300个像素。
3317
3318##### 代码解析
3319
3320> 将需要平移的偏移量在存储src矩形数据的im_rect结构体中赋值,并将存储src、dst图像数据的rga_buffer_t结构体传入imtranslate()。
3321
3322```c++
3323	/*这里通过x、y确定平移后图像的顶点的坐标*/
3324	src_rect.x = 300;
3325	src_rect.y = 300;
3326
3327	/*将im_rect格式的结构体src_rect与rga_buffer_t格式的结构体src、dst一同传入imtranslate()*/
3328	STATUS = imtranslate(src, dst, src_rect.x, src_rect.y);
3329	/*根据返回的IM_STATUS枚举值打印运行状态*/
3330	printf("translating .... %s\n", imStrError(STATUS));
3331```
3332
3333
3334
3335#### 图像拷贝
3336
3337> 使用如下命令测试图像拷贝
3338
3339```
3340rgaImDemo --copy
3341```
3342
3343> 该功能无可选options,默认拷贝分辨率为1280x720,格式为RGBA8888的图像。
3344
3345##### 代码解析
3346
3347> 将存储src、dst图像数据的rga_buffer_t结构体传入imcopy()。
3348
3349```c++
3350	/*rga_buffer_t格式的结构体src、dst传入imcopy()*/
3351	STATUS = imcopy(src, dst);
3352	/*根据返回的IM_STATUS枚举值打印运行状态*/
3353	printf("copying .... %s\n", imStrError(STATUS));
3354```
3355
3356
3357
3358#### 图像合成
3359
3360> 使用如下命令测试图像合成
3361
3362```
3363rgaImDemo --blend
3364```
3365
3366> 该功能无可选options,默认合成模式为 IM_ALPHA_BLEND_DST 模式。
3367
3368##### 代码解析
3369
3370> 将存储src、dst图像数据的rga_buffer_t结构体传入imblend()。
3371
3372```c++
3373	/*rga_buffer_t格式的结构体src、dst传入imblend()*/
3374	STATUS = imblend(src, dst);
3375	/*根据返回的IM_STATUS枚举值打印运行状态*/
3376	printf("blending .... %s\n", imStrError(STATUS));
3377```
3378
3379
3380
3381#### 图像格式转换
3382
3383> 使用如下命令测试图像格式转换
3384
3385```
3386rgaImDemo --cvtcolor
3387```
3388
3389> 该功能无可选options,默认将分辨率为1280x720的图像从RGBA8888格式转换为NV12格式。
3390
3391##### 代码解析
3392
3393将需要转换的格式在rga_buffer_t的成员变量format中赋值,并将存储src、dst图像数据的rga_buffer_t结构体传入imcvtcolor()。
3394
3395```c++
3396	/*将转换前后的格式赋值给对应的rga_buffer_t结构体的成员变量format*/
3397	src.format = HAL_PIXEL_FORMAT_RGBA_8888;
3398	dst.format = HAL_PIXEL_FORMAT_YCrCb_NV12;
3399
3400	/*将需要转换的格式与rga_buffer_t格式的结构体src、dst一同传入imcvtcolor()*/
3401	STATUS = imcvtcolor(src, dst, src.format, dst.format);
3402	/*根据返回的IM_STATUS枚举值打印运行状态*/
3403	printf("cvtcolor .... %s\n", imStrError(STATUS));
3404```
3405