Camera HAL层代码分析1

本文分析了Android Camera HAL层的实现,重点探讨了CameraHardwareInterface基类及其替代实现CameraHAL。CameraHardware类在Cameraid=0的业务中扮演关键角色,其构造函数初始化默认参数,并使用V4L2Camera类处理部分功能。通过scandir扫描/dev目录寻找video设备,并在Java层调用Camera.open时进行设备检查和配置,确定支持的分辨率和颜色格式。
摘要由CSDN通过智能技术生成

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) {
			
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值