Android Camera2 HAL3 高通Qualcomm Camera底层openCamera代码流程

本文列出代码调用流程,作为参考,要想了解高通驱动架构需要结核实际理解代码,不要一味的沉浸在代码中,这样是没有任何效果的。

 

openCamera

/*openCamera_flow*/
#if 1 
/*************************openCamera_flow_start******************************************************************/
QCamera2Factory.cpp
struct hw_module_methods_t QCamera2Factory::mModuleMethods = {
    .open = QCamera2Factory::camera_device_open,
};

QCamera2Factory.cpp
int QCamera2Factory::camera_device_open(const struct hw_module_t *module, const char *id,struct hw_device_t **hw_device)
	rc = gQCamera2Factory->cameraDeviceOpen(atoi(id), hw_device);
		int QCamera2Factory::cameraDeviceOpen(int camera_id,struct hw_device_t **hw_device)
			if(CAMERA_DEVICE_API_VERSION_3_0)
				QCamera3HardwareInterface *hw = new QCamera3HardwareInterface(mHalDescriptors[camera_id].cameraId,mCallbacks);
					mCameraId(cameraId),/* 传入cameraID*/
					mCallbacks(callbacks),/* camera_module_callbacks_t */
					mCameraDevice.common.close = close_camera_device;/* 关闭相机回调设置 */
					mCameraDevice.ops = &mCameraOps;/* 设置关键的回调函数 */
					mCameraDevice.priv = this;
					gCamCapability[cameraId]->version = CAM_HAL_V3;
				rc = hw->openCamera(hw_device);/* QCamera3HWI.cpp openCamera(struct hw_device_t **hw_device) */


				
QCamera3HWI.cpp
int QCamera3HardwareInterface::openCamera(struct hw_device_t **hw_device)
	mPerfLockMgr.acquirePerfLock(PERF_LOCK_OPEN_CAMERA);
	LOGI("[KPI Perf]: E PROFILE_OPEN_CAMERA camera id %d",mCameraId);
	/*有一个代码块,这里: */
	{  rc = mQCamera3HdrPlusListenerThread->run("QCamera3HdrPlusListenerThread");  }
	rc = openCamera(); 
			QCamera3HWI.cpp  int QCamera3HardwareInterface::openCamera()
				rc = QCameraFlash::getInstance().reserveFlashForCamera(mCameraId);/*?*/
				rc = camera_open((uint8_t)mCameraId, &mCameraHandle);/* mCameraId 在当前类初始化设置 ,设置mCameraHandle*/
					int32_t camera_open(uint8_t camera_idx, mm_camera_vtbl_t **camera_vtbl)/* camera_vtbl mm_camera_interface.c  */
						if(is_dual_camera_by_idx(camera_idx))/*判断是否是多相机*/
							is_multi_camera = 1; /* 设置多相机标志 */
							cam_idx = mm_camera_util_get_handle_by_num(0,g_cam_ctrl.cam_index[camera_idx]);/*主摄像机*/
							aux_idx = (get_aux_camera_handle(g_cam_ctrl.cam_index[camera_idx]);/*辅助摄像机*/
						/* 如果上面成功了,则执行 创建相机对象 */ 
						/* initialize camera obj 这个是主摄像机 */
						cam_obj = (mm_camera_obj_t *)malloc(sizeof(mm_camera_obj_t));
						cam_obj->ctrl_fd = -1;
						cam_obj->ds_fd = -1;
						cam_obj->ref_count++;
						cam_obj->my_num = 0;/*根据这个确认相机dev 名称当辅助相机时这个 = 1*/
						cam_obj->my_hdl = mm_camera_util_generate_handler(cam_idx);/*/* 生成相机句柄 */ 
						cam_obj->vtbl.camera_handle = cam_obj->my_hdl; /* set 相机 handler */
						cam_obj->vtbl.ops = &mm_camera_ops;/* 跳转到 mm_camera_interface.c */					    	
						rc = mm_camera_open(cam_obj);/* 打开相机 mm_camera.c 进入kernel open("/dev/video...")*/
							int32_t mm_camera_open(mm_camera_obj_t *my_obj)
								mm_camera_util_get_dev_name_by_num()/*my_hdl 和my_num 获取相机设备的名称字符串*/
								my_obj->ctrl_fd = open(dev_name, O_RDWR | O_NONBLOCK);/*打开相机*/
								mm_camera_get_session_id(my_obj, &my_obj->sessionid);/*设置sessionID*/
									int32_t mm_camera_get_session_id(mm_camera_obj_t *my_obj,uint32_t* sessionid)
										control.id = MSM_CAMERA_PRIV_G_SESSION_ID;
										control.value = value;
										rc = ioctl(my_obj->ctrl_fd, VIDIOC_G_CTRL, &control);/*获取控制权*/
										value = control.value;
										*sessionid = value;/* 将这个值付给 sessionid  */
								/************************************************************* 
									如果守护进程存在 还有其他操作,这里时deamon进程的设置
								**************************************************************/								
								mm_camera_cmd_thread_launch(&my_obj->evt_thread,mm_camera_dispatch_app_event,(void *)my_obj);
								/* launch event poll thread we will add evt fd into event poll thread upon user first register for evt */
								LOGD("Launch evt Poll Thread in Cam Open");
								snprintf(my_obj->evt_poll_thread.threadName, THREAD_NAME_SIZE, "CAM_evntPoll");
								mm_camera_poll_thread_launch(&my_obj->evt_poll_thread,MM_CAMERA_POLL_TYPE_EVT);
								mm_camera_evt_sub(my_obj, TRUE);
						if(is_multi_camera)/* 如果是多相机 还要再打开辅助相机 */
							rc = mm_camera_muxer_camera_open(aux_idx, cam_obj);
								int32_t mm_camera_muxer_camera_open(uint8_t cam_idx,mm_camera_obj_t *cam_obj)/*mm_camera_muxer.c*/
									/* initialize camera obj 辅助相机 */
									memset(my_obj, 0, sizeof(mm_camera_obj_t));
									my_obj->ctrl_fd = -1;
									my_obj->ds_fd = -1;
									my_obj->ref_count++;
									my_obj->my_num = my_num; /*  函数开始定义了 uint8_t my_num = 1; 辅助相机 */
									my_obj->my_hdl = mm_camera_util_generate_handler_by_num(my_num, cam_idx);/* 生成相机句柄 */
									rc = mm_camera_open(my_obj);/* 打开辅助相机,和主相机操作一样 */
									LOGD("Open succeded\n");/*当打开成功后,再组织主摄像头和辅助摄像头的关系*/
										rc  = mm_camera_util_set_camera_object(cam_idx, my_obj);
										my_obj->vtbl.camera_handle = (cam_obj->my_hdl | my_obj->my_hdl);
										cam_obj->vtbl.camera_handle = my_obj->vtbl.camera_handle;
										cam_obj->aux_cam_obj[cam_obj->num_s_cnt++] = my_obj;
										my_obj->master_cam_obj = cam_obj;
										cam_obj->master_cam_obj = NULL;/*??*/
						g_cam_ctrl.cam_obj[cam_idx] = cam_obj;/*设置相机obj*/
						*camera_vtbl = &cam_obj->vtbl; /* 主要设置:mCameraHandle->ops,用来跳转到 mm_camera_interface.c */
				rc = mCameraHandle->ops->register_event_notify(mCameraHandle->camera_handle, camEvtHandle, (void *)this);/*camEvtHandle*/
					static int32_t mm_camera_intf_register_event_notify(camera_handle,evt_cb,void * user_data)/*mm_camera_interface.c */
						uint32_t handle = get_main_camera_handle(camera_handle);/* get_main_camera_handle */
							uint32_t get_main_camera_handle(uint32_t handle)
								return mm_camera_util_get_handle_by_num(0, handle);
									uint32_t mm_camera_util_get_handle_by_num(uint8_t cam_num, uint32_t handler)
										(handler & (MM_CAMERA_HANDLE_BIT_MASK << (MM_CAMERA_HANDLE_SHIFT_MASK * cam_num)));/*16 0x0000ffff*/
						uint32_t aux_handle = get_aux_camera_handle(camera_handle);/* get_aux_camera_handle */
							uint32_t get_aux_camera_handle(uint32_t handle)
								return mm_camera_util_get_handle_by_num(1, handle);
									uint32_t mm_camera_util_get_handle_by_num(uint8_t cam_num, uint32_t handler)
										(handler & (MM_CAMERA_HANDLE_BIT_MASK <<(MM_CAMERA_HANDLE_SHIFT_MASK * cam_num)))/*16 0x0000ffff*/
						if (handle)/*主摄像机 mm_camera_interface.c */
							my_obj = mm_camera_util_get_camera_by_handler(handle);
								mm_camera_obj_t* mm_camera_util_get_camera_by_handler(uint32_t cam_handle)
									for (cam_idx = 0; cam_idx < MM_CAMERA_MAX_NUM_SENSORS; cam_idx++)/* 根据打开摄像头的填入方式再取出来 */
										if ((NULL != g_cam_ctrl.cam_obj[cam_idx]) && (cam_handle == (uint32_t)g_cam_ctrl.cam_obj[cam_idx]->my_hdl)) {
											cam_obj = g_cam_ctrl.cam_obj[cam_idx];/*(uint32_t)g_cam_ctrl.cam_obj[cam_idx]->my_hdl 确认主相机和辅助相机*/
							rc = mm_camera_register_event_notify(my_obj, evt_cb, user_data);/* evt_cb == QCamera3HardwareInterface::camEvtHandle */
								/* 给取出来的相机设置回调函数 */
								mm_camera_register_event_notify_internal(my_obj,evt_cb,user_data);/*mm_camera.c*/
									int32_t mm_camera_register_event_notify_internal(mm_camera_obj_t *my_obj,mm_camera_event_notify_t evt_cb,void * user_data)
										evt_array = &my_obj->evt;
										if(evt_cb)/* this is reg case  */
										{
											for(i = 0; i < MM_CAMERA_EVT_ENTRY_MAX; i++)
												if(evt_array->evt[i].user_data == NULL)
													evt_array->evt[i].evt_cb = evt_cb;
													evt_array->evt[i].user_data = user_data;/* QCamera3HardwareInterface 对象 */
													evt_array->reg_count++;
										}else /* this is unreg case */
										{
											for(i = 0; i < MM_CAMERA_EVT_ENTRY_MAX; i++)
												if(evt_array->evt[i].user_data == user_data)
													evt_array->evt[i].evt_cb = NULL;
													evt_array->evt[i].user_data = NULL;
													evt_array->reg_count--;
										}
						if (aux_handle)/*辅助摄像机 mm_camera_interface.c */
							my_obj = mm_camera_util_get_camera_head(aux_handle);
								mm_camera_obj_t* mm_camera_util_get_camera_head(uint32_t cam_handle)
									cam_obj = mm_camera_util_get_camera_by_handler(cam_handle);/* 跟主摄像机一样 */
						    rc = mm_camera_muxer_register_event_notify(aux_handle,evt_cb, user_data, my_obj);/* evt_cb == QCamera3HardwareInterface::camEvtHandle */
								int32_t mm_camera_muxer_register_event_notify(uint32_t camera_handle,mm_camera_event_notify_t evt_cb,void *user_data, mm_camera_obj_t *cam_obj)
									my_obj = mm_muxer_util_get_camera_by_obj(camera_handle, cam_obj);/*mm_camera_muxer.c*/
										mm_camera_obj_t* mm_muxer_util_get_camera_by_obj(uint32_t cam_handle,mm_camera_obj_t *cam_obj)
											if (cam_handle == cam_obj->my_hdl) 
												return cam_obj;
											if (obj->master_cam_obj != NULL)
												obj = obj->master_cam_obj;
											for (i = 0; i < obj->num_s_cnt; i++)/*遍历相机*/
												if (cam_handle == obj->aux_cam_obj[i]->my_hdl)
													obj = obj->aux_cam_obj[i];
									rc = mm_camera_register_event_notify(my_obj, evt_cb, user_data); /*跟主摄像机一样 evt_cb == QCamera3HardwareInterface::camEvtHandle */
				rc = mCameraHandle->ops->get_session_id(mCameraHandle->camera_handle,&sessionId[mCameraId]);
					static int32_t mm_camera_intf_get_session_id(uint32_t camera_handle,uint32_t* sessionid)/*mm_camera_interface.c*/
						uint32_t handle = get_main_camera_handle(camera_handle);
						uint32_t aux_handle = get_aux_camera_handle(camera_handle);
						if (handle) 
							my_obj = mm_camera_util_get_camera_by_handler(handle);/*同上*/
							*sessionid = my_obj->sessionid;
						else if (aux_handle)/*???为什么是else if因为是存在一个线程中,因此是循环执行 */
							my_obj = mm_camera_util_get_camera_head(aux_handle);/*同上*/
							rc = mm_camera_muxer_get_session_id(aux_handle, sessionid, my_obj);
								int32_t mm_camera_muxer_get_session_id(uint32_t camera_handle,uint32_t* sessionid, mm_camera_obj_t *cam_obj)
									my_obj = mm_muxer_util_get_camera_by_obj(camera_handle, cam_obj);
										if(my_obj)
											*sessionid = my_obj->sessionid;
				rc = mCameraHandle->ops->map_buf() /* 映射内存mmap方式,这里相当于是一个内存池,Map memory for related cam sync buffer mm_camera_interface.c*/
					static int32_t mm_camera_intf_map_buf(uint32_t camera_handle,uint8_t buf_type, int fd, size_t size, void *buffer)
						uint32_t handle = get_main_camera_handle(camera_handle);
						uint32_t aux_handle = get_aux_camera_handle(camera_handle);
						if (handle)						
							my_obj = mm_camera_util_get_camera_by_handler(handle);
							if(my_obj)
								rc = mm_camera_map_buf(my_obj, buf_type, fd, size, buffer);
						else if (aux_handle)/*???为什么是else if因为是存在一个线程中,因此是循环执行 */
							my_obj = mm_camera_util_get_camera_head(aux_handle);
							if(my_obj)
								rc = mm_camera_muxer_map_buf(aux_handle, buf_type,fd, size, buffer, my_obj);
				 m_pDualCamCmdPtr =(cam_dual_camera_cmd_info_t*) DATA_PTR(m_pDualCamCmdHeap,0);
	if(rc == 0)	
		*hw_device = &mCameraDevice.common; /* 版本、close方法 module->methods->open */
	/* 后置相机 0 前置相机 1 */
    LOGI("[KPI Perf]: X PROFILE_OPEN_CAMERA camera id %d, rc: %d",mCameraId, rc);
/*************************openCamera_flow_end******************************************************************/
#endif

 

你可能感兴趣的:(Android系统)