-
Notifications
You must be signed in to change notification settings - Fork 1
RGA_FormatTool
SweerItTer edited this page Feb 21, 2026
·
4 revisions
FormatTool 是 utilsCore RGA 模块的工具函数集合,提供 RGA、DRM、V4L2 格式之间的转换功能。
- DRM 格式转 RGA 格式
- RGA 格式转 DRM 格式
- V4L2 格式转 RGA 格式
- RGA 格式转 V4L2 格式
- 跨模块格式转换
- RGA 处理
- 显示和编码格式匹配
- 依赖: Rockchip RGA SDK
- 依赖: DRM 格式定义
- 依赖: V4L2 格式定义
- 被依赖: RgaConverter, RgaProcessor 等模块
重要: RGA 采用低地址到高地址 B | G | R | A 命名,而 DRM 使用 fourcc_code 从高到低 A | R | G | B 命名。
例如:
- RGA:
RK_FORMAT_RGBA_8888→ DRM:DRM_FORMAT_ABGR8888 - RGA:
RK_FORMAT_BGRA_8888→ DRM:DRM_FORMAT_ARGB8888
namespace utils::rga {
int convertDRMtoRGAFormat(uint32_t drmFmt) noexcept;
}参数说明:
-
drmFmt(输入): DRM 格式(如 DRM_FORMAT_NV12)
返回值:
- 成功: RGA 格式(如 RK_FORMAT_YCbCr_420_SP)
- 失败: -1(表示无效或不受支持的格式)
所有权归属:
- 无所有权转移
性能优化:
- 使用编译时
constexpr数组作为查找表,避免运行时哈希计算 - 线性查找优化,支持编译器自动向量化
-
noexcept保证不抛出异常
错误处理:
- 自动验证输入格式有效性
- 返回明确的错误码(-1)
- 支持格式验证函数
isValidDrmFormat()
使用例程:
#include "utils/rga/formatTool.h"
// DRM NV12 转 RGA 格式
int rga_fmt = convertDRMtoRGAFormat(DRM_FORMAT_NV12);
if (rga_fmt != -1) {
printf("RGA format: %d\n", rga_fmt); // 输出: RK_FORMAT_YCbCr_420_SP
} else {
printf("Unsupported DRM format\n");
}
// 验证格式有效性
if (isValidDrmFormat(DRM_FORMAT_ABGR8888)) {
int rga_fmt = convertDRMtoRGAFormat(DRM_FORMAT_ABGR8888);
printf("RGA format: %d\n", rga_fmt); // 输出: RK_FORMAT_RGBA_8888
}
// 使用命名空间版本
using namespace utils::rga;
int rga_fmt2 = convertDRMtoRGAFormat(DRM_FORMAT_NV21);namespace utils::rga {
uint32_t convertRGAtoDrmFormat(int rgaFmt) noexcept;
}参数说明:
-
rgaFmt(输入): RGA 格式(如 RK_FORMAT_YCbCr_420_SP)
返回值:
- 成功: DRM 格式(如 DRM_FORMAT_NV12)
- 失败: 0xFFFFFFFF(表示无效或不受支持的格式)
所有权归属:
- 无所有权转移
性能优化:
- 编译时查找表,零动态内存分配
- 缓存友好的线性布局
-
noexcept保证异常安全
错误处理:
- 输入格式预验证
- 统一的错误返回值
- 支持
isValidRgaFormat()验证函数
使用例程:
#include "utils/rga/formatTool.h"
// RGA YCbCr_420_SP 转 DRM 格式
uint32_t drm_fmt = convertRGAtoDrmFormat(RK_FORMAT_YCbCr_420_SP);
if (drm_fmt != 0xFFFFFFFF) {
printf("DRM format: 0x%x\n", drm_fmt); // 输出: DRM_FORMAT_NV12
}
// RGA RGBA_8888 转 DRM 格式(注意字节序)
drm_fmt = convertRGAtoDrmFormat(RK_FORMAT_RGBA_8888);
printf("DRM format: 0x%x\n", drm_fmt); // 输出: DRM_FORMAT_ABGR8888namespace utils::rga {
int convertV4L2toRGAFormat(uint32_t v4l2Fmt) noexcept;
}参数说明:
-
v4l2Fmt(输入): V4L2 格式(如 V4L2_PIX_FMT_NV12)
返回值:
- 成功: RGA 格式(如 RK_FORMAT_YCbCr_420_SP)
- 失败: -1(表示无效或不受支持的格式)
所有权归属:
- 无所有权转移
性能优化:
- 编译时查找表,零运行时开销
- 缓存友好的数据布局
-
noexcept异常安全保证
错误处理:
- 输入格式自动验证
- 统一的错误返回值
- 支持
isValidV4l2Format()验证函数
使用例程:
#include "utils/rga/formatTool.h"
// V4L2 NV12 转 RGA 格式
int rga_fmt = convertV4L2toRGAFormat(V4L2_PIX_FMT_NV12);
if (rga_fmt != -1) {
printf("RGA format: %d\n", rga_fmt); // 输出: RK_FORMAT_YCbCr_420_SP
}
// 验证格式有效性
if (isValidV4l2Format(V4L2_PIX_FMT_YUYV)) {
int rga_fmt = convertV4L2toRGAFormat(V4L2_PIX_FMT_YUYV);
// 处理转换结果
}namespace utils::rga {
uint32_t convertRGAtoV4L2Format(int rgaFmt) noexcept;
}参数说明:
-
rgaFmt(输入): RGA 格式(如 RK_FORMAT_YCbCr_420_SP)
返回值:
- 成功: V4L2 格式(如 V4L2_PIX_FMT_NV12)
- 失败: 0xFFFFFFFF(表示无效或不受支持的格式)
所有权归属:
- 无所有权转移
性能优化:
- 反向查找优化,避免重复计算
- 编译时确定的查找算法
- 内存访问局部性优化
错误处理:
- 输入格式预检查
- 明确的错误返回值
- 支持格式验证链
使用例程:
#include "utils/rga/formatTool.h"
// RGA YCbCr_420_SP 转 V4L2 格式
uint32_t v4l2_fmt = convertRGAtoV4L2Format(RK_FORMAT_YCbCr_420_SP);
if (v4l2_fmt != 0xFFFFFFFF) {
printf("V4L2 format: 0x%x\n", v4l2_fmt); // 输出: V4L2_PIX_FMT_NV12
}
// 完整的格式转换链示例
int rga_fmt = convertDRMtoRGAFormat(DRM_FORMAT_NV12);
if (rga_fmt != -1) {
uint32_t v4l2_fmt = convertRGAtoV4L2Format(rga_fmt);
if (v4l2_fmt != 0xFFFFFFFF) {
printf("DRM->RGA->V4L2 conversion successful\n");
}
}| DRM 格式 | RGA 格式 |
|---|---|
| DRM_FORMAT_RGB565 | RK_FORMAT_RGB_565 |
| DRM_FORMAT_RGB888 | RK_FORMAT_RGB_888 |
| DRM_FORMAT_BGR888 | RK_FORMAT_BGR_888 |
| DRM_FORMAT_ABGR8888 | RK_FORMAT_RGBA_8888 |
| DRM_FORMAT_ARGB8888 | RK_FORMAT_BGRA_8888 |
| DRM_FORMAT_BGRA8888 | RK_FORMAT_ARGB_8888 |
| DRM_FORMAT_RGBA8888 | RK_FORMAT_ABGR_8888 |
| DRM_FORMAT_BGRX8888 | RK_FORMAT_XRGB_8888 |
| DRM_FORMAT_RGBX8888 | RK_FORMAT_XBGR_8888 |
| DRM_FORMAT_XBGR8888 | RK_FORMAT_RGBX_8888 |
| DRM_FORMAT_XRGB8888 | RK_FORMAT_BGRX_8888 |
| DRM_FORMAT_NV12 | RK_FORMAT_YCbCr_420_SP |
| DRM_FORMAT_NV21 | RK_FORMAT_YCrCb_420_SP |
| DRM_FORMAT_YUV420 | RK_FORMAT_YCbCr_420_P |
| DRM_FORMAT_YVU420 | RK_FORMAT_YCrCb_420_P |
| DRM_FORMAT_NV16 | RK_FORMAT_YCbCr_422_SP |
| DRM_FORMAT_NV61 | RK_FORMAT_YCrCb_422_SP |
| DRM_FORMAT_YUV422 | RK_FORMAT_YCbCr_422_P |
| DRM_FORMAT_YVU422 | RK_FORMAT_YCrCb_422_P |
| RGA 格式 | DRM 格式 |
|---|---|
| RK_FORMAT_RGB_565 | DRM_FORMAT_RGB565 |
| RK_FORMAT_RGB_888 | DRM_FORMAT_RGB888 |
| RK_FORMAT_BGR_888 | DRM_FORMAT_BGR888 |
| RK_FORMAT_RGBA_8888 | DRM_FORMAT_ABGR8888 |
| RK_FORMAT_BGRA_8888 | DRM_FORMAT_ARGB8888 |
| RK_FORMAT_ARGB_8888 | DRM_FORMAT_BGRA8888 |
| RK_FORMAT_ABGR_8888 | DRM_FORMAT_RGBA8888 |
| RK_FORMAT_XRGB_8888 | DRM_FORMAT_BGRX8888 |
| RK_FORMAT_XBGR_8888 | DRM_FORMAT_RGBX8888 |
| RK_FORMAT_RGBX_8888 | DRM_FORMAT_XBGR8888 |
| RK_FORMAT_BGRX_8888 | DRM_FORMAT_XRGB8888 |
| RK_FORMAT_YCbCr_420_SP | DRM_FORMAT_NV12 |
| RK_FORMAT_YCrCb_420_SP | DRM_FORMAT_NV21 |
| RK_FORMAT_YCbCr_420_P | DRM_FORMAT_YUV420 |
| RK_FORMAT_YCrCb_420_P | DRM_FORMAT_YVU420 |
| RK_FORMAT_YCbCr_422_SP | DRM_FORMAT_NV16 |
| RK_FORMAT_YCrCb_422_SP | DRM_FORMAT_NV61 |
| RK_FORMAT_YCbCr_422_P | DRM_FORMAT_YUV422 |
| RK_FORMAT_YCrCb_422_P | DRM_FORMAT_YVU422 |
| V4L2 格式 | RGA 格式 |
|---|---|
| V4L2_PIX_FMT_RGB565 | RK_FORMAT_RGB_565 |
| V4L2_PIX_FMT_RGB24 | RK_FORMAT_RGB_888 |
| V4L2_PIX_FMT_BGR24 | RK_FORMAT_BGR_888 |
| V4L2_PIX_FMT_ARGB32 | RK_FORMAT_ARGB_8888 |
| V4L2_PIX_FMT_ABGR32 | RK_FORMAT_ABGR_8888 |
| V4L2_PIX_FMT_NV12 | RK_FORMAT_YCbCr_420_SP |
| V4L2_PIX_FMT_NV21 | RK_FORMAT_YCrCb_420_SP |
| V4L2_PIX_FMT_YUV420 | RK_FORMAT_YCbCr_420_P |
| V4L2_PIX_FMT_YVU420 | RK_FORMAT_YCrCb_420_P |
| V4L2_PIX_FMT_NV16 | RK_FORMAT_YCbCr_422_SP |
| V4L2_PIX_FMT_NV61 | RK_FORMAT_YCrCb_422_SP |
| V4L2_PIX_FMT_YUYV | RK_FORMAT_YUYV_422 |
| V4L2_PIX_FMT_UYVY | RK_FORMAT_UYVY_422 |
| RGA 格式 | V4L2 格式 |
|---|---|
| RK_FORMAT_RGB_565 | V4L2_PIX_FMT_RGB565 |
| RK_FORMAT_RGB_888 | V4L2_PIX_FMT_RGB24 |
| RK_FORMAT_BGR_888 | V4L2_PIX_FMT_BGR24 |
| RK_FORMAT_ARGB_8888 | V4L2_PIX_FMT_ARGB32 |
| RK_FORMAT_ABGR_8888 | V4L2_PIX_FMT_ABGR32 |
| RK_FORMAT_YCbCr_420_SP | V4L2_PIX_FMT_NV12 |
| RK_FORMAT_YCrCb_420_SP | V4L2_PIX_FMT_NV21 |
| RK_FORMAT_YCbCr_420_P | V4L2_PIX_FMT_YUV420 |
| RK_FORMAT_YCrCb_420_P | V4L2_PIX_FMT_YVU420 |
| RK_FORMAT_YCbCr_422_SP | V4L2_PIX_FMT_NV16 |
| RK_FORMAT_YCrCb_422_SP | V4L2_PIX_FMT_NV61 |
| RK_FORMAT_YUYV_422 | V4L2_PIX_FMT_YUYV |
| RK_FORMAT_UYVY_422 | V4L2_PIX_FMT_UYVY |
// V4L2 相机输出 NV12 格式
uint32_t v4l2_fmt = V4L2_PIX_FMT_NV12;
// 转换为 RGA 格式
int rga_fmt = convertV4L2toRGAFormat(v4l2_fmt);
if (rga_fmt != -1) {
// 使用 RGA 处理
rga_buffer_t buffer = wrapbuffer_fd(fd, 1920, 1080, rga_fmt);
}// RGA 处理输出 RGBA8888
int rga_fmt = RK_FORMAT_RGBA_8888;
// 转换为 DRM 格式(注意字节序)
uint32_t drm_fmt = convertRGAtoDrmFormat(rga_fmt);
if (drm_fmt != -1) {
// 创建 DRM fb
uint32_t fb_id = create_drm_fb(drm_fd, dma_fd, 1920, 1080, drm_fmt);
}// DRM 格式
uint32_t drm_fmt = DRM_FORMAT_NV12;
// DRM → RGA → V4L2
int rga_fmt = convertDRMtoRGAFormat(drm_fmt);
uint32_t v4l2_fmt = convertRGAtoV4L2Format(rga_fmt);
if (v4l2_fmt != -1) {
printf("V4L2 format: 0x%x\n", v4l2_fmt);
}// RGA RGBA8888 输出(注意字节序)
int rga_fmt = RK_FORMAT_RGBA_8888;
uint32_t drm_fmt = convertRGAtoDrmFormat(rga_fmt);
// DRM 格式是 ABGR8888(因为 RGA 的 RGBA 对应 DRM 的 ABGR)
printf("DRM format: 0x%x\n", drm_fmt); // DRM_FORMAT_ABGR8888// 检查格式是否支持
uint32_t v4l2_fmt = V4L2_PIX_FMT_NV12;
int rga_fmt = convertV4L2toRGAFormat(v4l2_fmt);
if (rga_fmt == -1) {
printf("Format not supported by RGA\n");
} else {
printf("RGA format: %d\n", rga_fmt);
}- 字节序差异: RGA 和 DRM 字节序相反,注意转换
- 返回值检查: 未找到对应格式返回 -1
- 全局映射表: 使用 static const unordered_map 作为查找表
- 线程安全: 函数是线程安全的
- 格式支持: 只支持常用格式,不支持所有格式
- RGA SDK: 需要 RGA SDK 支持
- RgaConverter - RGA 转换器
- RgaProcessor - RGA 处理器
- DmaBuffer - DMA-BUF 缓冲区
- RGA 模块总览
主页
API 文档
DMA 模块
DRM 模块
- DRM 模块总览
- DeviceController - DRM 设备控制器
- DrmLayer - DRM 图层管理
- PlanesCompositor - DRM 平面合成器
- DrmBpp - DRM 格式定义
NET 模块
- NET 模块总览
- TcpServer - TCP 服务器
- SocketConnection - Socket 连接管理
- CommandHandler - 命令处理器
- DataPacket - 数据包
V4L2 模块
- V4L2 模块总览
- CameraController - V4L2 摄像头控制器
- Frame - V4L2 帧数据结构
- FormatTool - V4L2 格式工具
- Exception - V4L2 异常类
V4L2Param 模块
- V4L2Param 模块总览
- ParamControl - 参数控制
- ParamLogger - 参数日志
- ParamProcessor - 参数处理器
RGA 模块
- RGA 模块总览
- RgaConverter - RGA 转换器
- RgaProcessor - RGA 处理器
- FormatTool - RGA 格式工具
MPP 模块
- MPP 模块总览
- EncoderContext - 编码器上下文
- EncoderCore - 编码器核心
- JpegEncoder - JPEG 编码器
- StreamWriter - 流写入器
- MppResourceGuard - MPP 资源守护
- FileTools - 文件工具
- FormatTool - 格式工具
Sys 模块
- Sys 模块总览
- CpuMonitor - CPU 监控器
- MemoryMonitor - 内存监控器
- Base - 基础类
Mouse 模块
- Mouse 模块总览
- Watcher - 鼠标监视器
Utils 模块
- Utils 模块总览
- AsyncThreadPool - 异步线程池
- ConcurrentQueue - 并发队列
- FdWrapper - 文件描述符包装器
- FenceWatcher - 围栏监视器
- FixedSizePool - 固定大小对象池
- Logger - 日志记录器
- ObjectsPool - 对象池
- OrderedQueue - 有序队列
- ProgressBar - 进度条
- SafeQueue - 安全队列
- SharedBufferState - 共享缓冲区状态
- SimpleVariant - 简单变体类型
- ThreadPauser - 线程暂停器
- ThreadUtils - 线程工具
- Types - 类型定义
- UdevMonitor - Udev 监视器