-
Notifications
You must be signed in to change notification settings - Fork 2
MPP_JpegEncoder
SweerItTer edited this page Feb 1, 2026
·
3 revisions
JpegEncoder 是 utilsCore MPP 模块的核心类,提供 Rockchip MPP JPEG 编码功能,支持直接从 DMA-BUF 捕获并保存为 JPEG 文件。
- JPEG 图像编码
- 支持从 DMA-BUF 捕获
- 自动文件命名
- 质量控制
- 图像快照
- 图像保存
- 视频帧捕获
- 依赖: Rockchip MPP 库
- 依赖: MppEncoderContext
- 依赖: DmaBuffer
JpegEncoder 是 JPEG 编码器的封装类,提供:
- JPEG 编码初始化
- 从 DMA-BUF 捕获并编码
- 自动文件命名和保存
- 编码参数配置
- RAII: 自动管理 MPP 资源
struct Config {
uint32_t width;
uint32_t height;
MppFrameFormat format = MPP_FMT_YUV420SP;
int quality = 8; // 0-10, 值越大质量越高
std::string save_dir;
// 转换为 MPP 配置
MppEncoderContext::Config toMppConfig() const {
return DefaultConfigs::createJpegConfig(
width, height, format, quality
);
}
};| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
width |
uint32_t |
- | 图像宽度(像素) |
height |
uint32_t |
- | 图像高度(像素) |
format |
MppFrameFormat |
MPP_FMT_YUV420SP |
输入格式 |
quality |
int |
8 | JPEG 质量(0-10,值越大质量越高) |
save_dir |
std::string |
- | 保存目录 |
MppEncoderContext::Config toMppConfig() const;返回值: MppEncoderContext 配置
explicit JpegEncoder(const Config& cfg);
~JpegEncoder() = default;参数说明:
-
cfg(输入): 编码配置
返回值: 无
所有权归属:
- JpegEncoder 拥有 MPP 资源的所有权
注意事项:
- 构造时会初始化 MPP 编码器
- 失败时 initialized_ 会设置为 false
- 析构时自动清理 MPP 资源
使用例程:
JpegEncoder::Config cfg;
cfg.width = 1920;
cfg.height = 1080;
cfg.format = MPP_FMT_YUV420SP;
cfg.quality = 8;
cfg.save_dir = "/tmp/jpeg";
JpegEncoder encoder(cfg);bool resetConfig(const Config& cfg);参数说明:
-
cfg(输入): 新的编码配置
返回值:
-
true: 成功 -
false: 失败
所有权归属:
- 无所有权转移
注意事项:
- 重新初始化编码器
- 会重置所有配置
- 失败时不会改变原有配置
使用例程:
JpegEncoder encoder(cfg);
// 重新配置
JpegEncoder::Config new_cfg;
new_cfg.width = 1280;
new_cfg.height = 720;
new_cfg.format = MPP_FMT_YUV420SP;
new_cfg.quality = 10;
new_cfg.save_dir = "/tmp/jpeg";
if (encoder.resetConfig(new_cfg)) {
printf("Reset config success\n");
} else {
printf("Reset config failed\n");
}bool captureFromDmabuf(const DmaBufferPtr dmabuf);参数说明:
-
dmabuf(输入): DMA-BUF 指针
返回值:
-
true: 成功 -
false: 失败
所有权归属:
- JpegEncoder 不持有 DMA-BUF 的所有权
注意事项:
- 从 DMA-BUF 获取图像数据
- 自动编码为 JPEG
- 自动生成文件名并保存
- 文件保存在 save_dir 目录中
使用例程:
JpegEncoder encoder(cfg);
// 从 DMA-BUF 捕获
if (encoder.captureFromDmabuf(dma_buffer)) {
printf("Capture success\n");
} else {
printf("Capture failed\n");
}bool encodeToFile(MppFrame frame, const std::string& filepath);参数说明:
-
frame(输入): MPP 帧 -
filepath(输入): 文件路径
返回值:
-
true: 成功 -
false: 失败
说明: 编码 MPP 帧并保存为 JPEG 文件
std::string generateFilename();返回值: 生成的文件名
说明: 生成唯一的 JPEG 文件名
1. 初始化编码器
↓
2. 从 DMA-BUF 获取图像
↓
3. 生成文件名
↓
4. 编码为 JPEG
↓
5. 保存到文件
DMA-BUF → JpegEncoder → MPP 编码 → JPEG 文件
-
状态管理: 使用
std::atomic_bool保护初始化状态 - MPP 操作: MPP 编码器本身是线程安全的
- 每个线程应该有自己的 JpegEncoder 实例
- 不要共享 JpegEncoder 实例
JpegEncoder::Config cfg;
cfg.width = 1920;
cfg.height = 1080;
cfg.format = MPP_FMT_YUV420SP;
cfg.quality = 8;
cfg.save_dir = "/tmp/jpeg";
JpegEncoder encoder(cfg);
// 从 DMA-BUF 捕获
encoder.captureFromDmabuf(dma_buffer);JpegEncoder encoder(cfg);
// 按键触发快照
button.onPress([&]() {
encoder.captureFromDmabuf(current_frame);
printf("Snapshot saved\n");
});JpegEncoder encoder(cfg);
// 每秒捕获一次
std::thread([&]() {
while (running) {
encoder.captureFromDmabuf(current_frame);
sleep(1);
}
}).detach();JpegEncoder encoder(cfg);
// 重新配置
JpegEncoder::Config new_cfg;
new_cfg.width = 1280;
new_cfg.height = 720;
new_cfg.format = MPP_FMT_YUV420SP;
new_cfg.quality = 10;
new_cfg.save_dir = "/tmp/jpeg_hd";
encoder.resetConfig(new_cfg);// 低质量
JpegEncoder::Config cfg;
cfg.width = 1920;
cfg.height = 1080;
cfg.quality = 3;
cfg.save_dir = "/tmp/jpeg_low";
// 高质量
JpegEncoder::Config cfg;
cfg.width = 1920;
cfg.height = 1080;
cfg.quality = 10;
cfg.save_dir = "/tmp/jpeg_high";- 格式匹配: 输入格式必须与配置一致
- 质量范围: 质量值必须在 0-10 范围内,值越大质量越高
- 保存目录: save_dir 必须存在且有写权限
- DMA-BUF: DMA-BUF 必须包含有效的图像数据
- 线程安全: 每个线程应该有自己的实例
- 错误处理: 检查返回值
-
文件名: 文件名自动生成,格式为
timestamp.jpg
- EncoderContext - 编码器上下文
- EncoderCore - 编码器核心
- StreamWriter - 流写入器
- DmaBuffer - DMA 缓冲区
- MPP 模块总览
主页
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 监视器