第一步:按照上一个日志的步骤,用自己的libcamera替换stub的camera。
第二步:配置视频方式,由于ZC0301输出的视频数据只能是jpeg的,而Android系统带的camera的应用程序预览只能是RGB或者YCbCr的,目前只调试成功RGB565,(YCbCr方式预览窗口不能显示正确的颜色)所以如下配置:
UsbCamera.cpp
fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_JPEG;
MyCameraHardware.cpp
p.setPreviewFormat("rgb565");//("yuv422sp");
p.setPictureFormat("jpeg");//("jpeg");
CameraService.cpp
ISurface::BufferHeap buffers(w, h, w, h,PIXEL_FORMAT_RGB_565, transform,0,
mHardware->getPreviewHeap());
第二步:按照V4l2编程要求的步骤,使用mmap方式的调用,并需要在析构函数中调用munmap函数。
第三步:每次上层调用获取数据时,再获取数据,底层不使用任务持续获取。
第四步:数据是JPEG拍照可以直接保存,但是预览就需要解码成rgb,于是增加libjpeg共享库。由于该共享库只解码文件,这里需要的是解码内存中的jpeg,所以增加内存jpeg的解码。详情见下一个日志
第五步:至此,就完成了这个工作。
需要注意的地方:
1、显示窗口的大小设置:经过测试发现设置成320*240是最佳的,如果设置成640*480,可以显示,但是明显比较慢,由于拍照的时候和预览的时候,都是将数据拷贝到别的模块,所以运行很吃力。如果设置成480*360,预览窗口显示不正常,会并列3个小窗口。
2、cpp文件调用c文件的函数时,一定要用extern ,否则编译连接会报错。
extern "C"{
#include "jpeglib.h"
}
3、进行jpeg解码时候,jpeg_read_header(&cinfo, 1);获取的cinfo信息里面的cinfo.num_components不正确,实际是2,获取的却是3,所以计算偏移的时候不能使用offset += cinfo.num_components * cinfo.output_width;而必须使用offset += 2 * cinfo.output_width;
需要改进的地方:
1、预览使用overlay方式,一定会快很多。
2、camera java应用程序的权限要改,正常启动程序,居然不能open video0
3、拍照时memcpy数据,效率太低,最好能够直接存成文件,不知道其他的camera应用程序怎么处理的。