Edit online

MPP Encoder 设计及接口说明

2 Dec 2024
Read time: 2 minute(s)

MPP Encoder 目前只支持 JPEG 图片编码。接口设计如下:

1. mpp_encode_jpeg
函数原型 int mpp_encode_jpeg(struct mpp_frame* frame, int quality, int dma_buf_fd, int buf_len, int* len)
功能说明 编码一帧 JPEG 图片
参数定义
  • frame: 待编码的原始 YUV 数据
  • quality: 编码质量,取值范围 1~100,1 表示编码图片质量最差,100 表示最好
  • dma_buf_fd:输出 JPEG 图片存放的 dma-buf fd
  • buf_len:输出 JPEG 图片 buf 的长度
  • 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);