当前位置: 首页 > news >正文

【Rockchip系列】官方函数:importbuffer_virtualaddr

importbuffer_virtualaddr

对于需要RGA处理的外部内存,可以使用importbuffer_virtualaddr接口将缓冲区对应的虚拟地址信息导入到RGA驱动内部,并获取缓冲区相应的地址信息,方便后续稳定、快速地调用RGA完成工作。

函数原型

RGA提供了三个版本的 importbuffer_virtualaddr 函数:

IM_API rga_buffer_handle_t importbuffer_virtualaddr(void *va, int size);
IM_API rga_buffer_handle_t importbuffer_virtualaddr(void *va, int width, int height, int format);
IM_API rga_buffer_handle_t importbuffer_virtualaddr(void *va, im_handle_param_t *param);
参数说明
参数描述
va[必填] 指向缓冲区的虚拟地址指针
size[必填] 缓冲区的大小(以字节为单位)
width[必填] 图像宽度(以像素为单位)
height[必填] 图像高度(以像素为单位)
format[必填] 图像格式(例如 RK_FORMAT_RGBA_8888)
param[必填] 指向 im_handle_param_t 结构体的指针,包含更多图像参数
返回值

返回 rga_buffer_handle_t 类型的句柄,用于描述导入的内存。如果导入失败,返回 0。

使用说明
  1. 第一个版本适用于只知道内存虚拟地址和大小的情况。
  2. 第二个版本适用于处理具有已知宽度、高度和格式的图像数据。
  3. 第三个版本提供最大的灵活性,允许通过 im_handle_param_t 结构体指定更多参数。
示例代码
#include <iostream>
#include "im2d.h"
#include "RgaUtils.h"int main() {int width = 1280;int height = 720;int format = RK_FORMAT_RGBA_8888;size_t size = width * height * get_bpp_from_format(format);// 分配内存void* buf = malloc(size);if (buf == nullptr) {std::cerr << "Failed to allocate buffer!" << std::endl;return -1;}// 使用第一个版本rga_buffer_handle_t handle1 = importbuffer_virtualaddr(buf, size);// 使用第二个版本rga_buffer_handle_t handle2 = importbuffer_virtualaddr(buf, width, height, format);// 使用第三个版本im_handle_param_t param;memset(&param, 0, sizeof(im_handle_param_t));param.width = width;param.height = height;param.format = format;rga_buffer_handle_t handle3 = importbuffer_virtualaddr(buf, &param);// 使用完毕后释放资源releasebuffer_handle(handle1);releasebuffer_handle(handle2);releasebuffer_handle(handle3);free(buf);return 0;
}
注意事项
  • 使用 importbuffer_virtualaddr 导入的缓冲区在不再需要时,应使用 releasebuffer_handle 释放。
  • 确保传递给函数的参数正确,特别是在使用第二和第三个版本时,图像的宽度、高度和格式必须准确。
  • 导入的缓冲区应该是连续的物理内存,以确保 RGA 能够正确访问。

相关文章:

  • 渗透测试入门学习——编写python脚本实现对网站登录页面的暴力破解
  • Performance Analysis Kit简介
  • 江科大笔记—LED闪烁 LED流水灯 蜂鸣器
  • 【数据结构笔记】2-3-3 单链表的查找
  • Springboot3保存日志到数据库
  • 移动会议:气膜馆的理想选择—轻空间
  • 设计模式 策略模式(Strategy Pattern)
  • SWAP、AquaCrop、FVCOM、Delft3D、SWAT、R+VIC、HSPF、HEC-HMS......
  • 【JAVA高级】 redis分布式双重加锁(业务校验:防止接口并发调用时数据重复)
  • excel-VBA知识点记录
  • 享元(轻量级)模式
  • B样条(B-spline)函数
  • 如何更改 Ubuntu/Linux 终端中命令行提示符的颜色
  • (11)(2.1.2) DShot ESCs(四)
  • C++文件内容加解密
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • crontab执行失败的多种原因
  • HashMap ConcurrentHashMap
  • JavaScript对象详解
  • Java的Interrupt与线程中断
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • learning koa2.x
  • leetcode-27. Remove Element
  • Lucene解析 - 基本概念
  • Spring Boot快速入门(一):Hello Spring Boot
  • win10下安装mysql5.7
  • 阿里云应用高可用服务公测发布
  • 搭建gitbook 和 访问权限认证
  • 回顾 Swift 多平台移植进度 #2
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 机器学习 vs. 深度学习
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • 优化 Vue 项目编译文件大小
  • 由插件封装引出的一丢丢思考
  • 《码出高效》学习笔记与书中错误记录
  • 如何在招聘中考核.NET架构师
  • 数据库巡检项
  • ​Benvista PhotoZoom Pro 9.0.4新功能介绍
  • (C++哈希表01)
  • (PADS学习)第二章:原理图绘制 第一部分
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (二十四)Flask之flask-session组件
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • (转)Mysql的优化设置
  • (转)程序员疫苗:代码注入
  • .aanva
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .Net Core与存储过程(一)
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .NET 材料检测系统崩溃分析
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • .NET/C# 获取一个正在运行的进程的命令行参数
  • .NET多线程执行函数
  • .net中我喜欢的两种验证码