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 2546无 2547 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 2576无 2577 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 2633无 2634 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 2667无 2668 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 2722无 2723 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 2760无 2761 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 2795无 2796 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