MPP Encoder 设计及接口说明
2 Dec 2024
Read time: 2 minute(s)
MPP Encoder 目前只支持 JPEG 图片编码。接口设计如下:
函数原型 | int mpp_encode_jpeg(struct mpp_frame* frame, int quality, int dma_buf_fd, int buf_len, int* len) |
---|---|
功能说明 | 编码一帧 JPEG 图片 |
参数定义 |
|
返回值 | 0: 成功 <0:失败 |
注意事项 | - |
提示: 输出 JPEG 图片的缓存 buffer 由调用者申请,但调用者并不知道编码后图片的实际大小, 为避免
VE 写输出数据时越界,该 buffer 需要预先申请较大的内存。
MPP Decoder 参考 demo
以下 demo 为基本流程调用,具体实现可以参考代码 mpp/mpp_test/jpeg_encoder_test.c
//* 1. 获取 dma-buf device 句柄
int dma_fd = dmabuf_device_open();
//* 2. 设置输入 YUV 数据结构体
struct mpp_frame frame;
// ....
//* 3. 申请编码输出 buffer
int len = 0;
int buf_len = width * height * 4/5 * quality / 100;
int jpeg_data_fd = dmabuf_alloc(dma_fd, buf_len);
//* 4. 编码 JPEG 图片
mpp_encode_jpeg(&frame, quality, jpeg_data_fd, buf_len, &len)。
//* 5. 保存编码后 JPEG 图片
unsigned char* jpeg_vir_addr = dmabuf_mmap(jpeg_data_fd, buf_len);
FILE* fp_save = fopen("/save.jpg", "wb");
fwrite(jpeg_vir_addr, 1, len, fp_save);
fclose(fp_save);
//* 6. 释放资源
dmabuf_munmap(jpeg_vir_addr, buf_len);
dmabuf_free(jpeg_data_fd);
dmabuf_device_close(dma_fd);