Android系统camera模块调试完成

第一步:按照上一个日志的步骤,用自己的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应用程序怎么处理的。

 

 

 

你可能感兴趣的:(Android系统camera模块调试完成)