A311D芯片集成了一个硬件JPEG Encoder来将yuv格式的图片压缩成jpeg格式的图片。
按照下面的步骤来实现你的jpeg encoder功能:
1) 请参考文章:开发环境准备
2) 请参照代码树/jpeg_encoder下的example.c来实现你的jpeg encoder代码
-- 因为只有一个硬件JPEG Encoder,对于多路视频解码后,调用jpeg encoder来生成jpeg图片的情况,配置参数中的config.multi_proc是用来决定多线程调用还是多进程调用,jpeg encoder库会决定使用不同的锁来保护压缩数据的完整性。
-- 考虑到实际应用中的原图和缩略图都需要压缩成jpeg图片,来保存到本地或者传输到远程服务器。amlJpegEncodeBothProc()函数就是为此目的来定义的,它的实现效率比调用两次amlJpegEncodeProc()来生成原图和缩略图的jpeg图片要高。
3) 完成你自己的代码后,可以参照Makefile.example来编译代码,并且scp到板子上实际运行。
示例程序如下:
#include "jpegenc.h"
JPEGEN_HANDLE_t jpegEnHandle;
JpegEnSetting_t config;
config.width = <输入YUV图片的宽度>
config.height = <输入YUV图片的高度>
config.channel_id = <对于多路jpeg encoder的应用,输入该路的index作为标识>
config.scale = <如果有对YUV图片resize的需要,输入resize的比例。例如 scale=2, 那么resize之后的宽和高均为原始图片的1/2>
<如果不需要resize,设置为0>
config.multi_proc = <因为Soc中只有一个硬件jpeg encoder,如果有多路jpeg encoder的需求时,需要设置这个参数,来保证同步访问时候的数据保护>
<如果是一个进程内的多线程应用来实现, 那么设置为:0>
<如果是多个进程的应用来实现, 那么设置为:1>
config.enParam = NULL <使用默认值:iformat(FMT_NV12),oformat(FMT_YUV420),quality(25),timeout(-1 nerver timeout),block_mode(0)>
自定义结构 JpegEncodeParam_t
quality: 数字越大质量越高 (default: 25)
iformat: 输入图片的格式(default: FMT_NV12)
oformat: 输出图片的格式(default: FMT_YUV420)
timeout: 编码是否等待超时(default: -1 永远不超时)
block_mode:块编码模式(default: 0)
除qulity可以根据需要调整外,其他参数最好使用默认值。
jpegEnHandle = amlJpegEncodeInit(&config); //在开始编码前初始化
while (一帧一帧图片数据输入) {
//参照jpegenc.h的注释来调用处理函数
amlJpegEncodeProc(); OR
amlJpegEncodeBothProc();
}
amlJpegEncodeRelease(jpegEnHandle); //所有图片处理完成后,释放jpeg encoder