Camera HAL层的基类是CameraHardwareInterface,主要定义在CameraHardwareInterface.h中。OEM厂商可以根据需要实现CameraHardwareInterface,根据需要实现CameraHardwareInterface定义的接口。
目前查阅的android source code,没有按照google定义的规范和标准,而是自定义了一个CameraHAL类,以此类作为基类,代替CameraHardwareInterface。对于Cameraid=0的业务逻辑,主要实现是在CameraHardware中,此类实现CameraHAL中定义的函数。因此解析来首先分析CameraHardware类。
CameraHardware的构造函数中,一开始调用:
initDefaultParameters();
此类的实现如下:
/**
Init default parameters
*/
void CameraHardware::initDefaultParameters() {
//#ifndef NEON_MFEALIG64
const mmap_info_t * MmapPhyBuffInfo = NULL;
//#endif
CameraParameters &p = mParameters;
mWidth = MIN_WIDTH; //640
mHeight = MIN_HEIGHT; //480
mPictureWidth = MIN_WIDTH;
mPictureHeight = MIN_HEIGHT;
p.setPreviewSize(MIN_WIDTH, MIN_HEIGHT);
p.setPreviewFrameRate(30);
p.setPreviewFormat(CameraParameters::PIXEL_FORMAT_YUV420SP);
p.setPictureFormat("jpeg");
p.setPictureSize(MIN_WIDTH, MIN_HEIGHT);
p.setVideoSize(MIN_WIDTH, MIN_HEIGHT);
从此类中可以看到,camera预览的默认宽高是640和480,分别定义在CameraHardware.h中。preview的默认格式为YUV420SP,api可以设置preview的格式,不知道是否起作用,默认为YUV420SP,看起来在这里可以进行修改。preview的默认帧率为30fps,图像的默认格式为jpeg。(不懂这里jpeg是什么意思,可能与java层定义对应,后续研究)
构造函数中,初始化默认参数后,会实例化:
if (!mCamera) {
delete mCamera;
mCamera = new V4L2Camera();
}
V4L2Camera是一个独立的类,实现Camera部分功能。
total = scandir("/dev", &namelist, my_select, 0);
这一行是扫描camera device。
scandir将扫描/dev目录,将扫描的结果存放在namelist中,扫描的filter是my_select,返回非0的值存放在namelist中。
static int my_select(const struct dirent *dp) {
if (strstr(dp->d_name, "video"))
return 1;
return 0;
}
即/dev/video*的文件会放在namelist中。返回值total为扫描到的条目。
if (total > 0) {
for (int i = 0; i < 3; i++) {
snprintf(video_dev, 7, "video%d", i);
found = 0;
for (int j = 0; j < total; j++) {
if (strcmp(video_dev, namelist[j]->d_name) == 0) {