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

 

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

当相机打开成功后会紧接着执行initialize,代码流程如下

/*initialize_flow*/
#if 1	
/*************************initialize_flow_start******************************************************************/
QCamera3HWI.cpp
int (*initialize)(const struct camera3_device *,const camera3_callback_ops_t *callback_ops);
int QCamera3HardwareInterface::initialize(const struct camera3_device *device,const camera3_callback_ops_t *callback_ops)
	int rc = hw->initialize(callback_ops);
		int QCamera3HardwareInterface::initialize(const struct camera3_callback_ops *callback_ops)
			rc = initParameters();
				int QCamera3HardwareInterface::initParameters()
					rc = mParamHeap->allocate(sizeof(metadata_buffer_t));/*Allocate Set Param Buffer*/
					rc = mCameraHandle->ops->map_buf(mCameraHandle->camera_handle,
													CAM_MAPPING_BUF_TYPE_PARM_BUF,
													mParamHeap->getFd(0),
													sizeof(metadata_buffer_t),
													(metadata_buffer_t *) DATA_PTR(mParamHeap,0));
					mParameters = (metadata_buffer_t *) DATA_PTR(mParamHeap,0);
					mPrevParameters = (metadata_buffer_t *)malloc(sizeof(metadata_buffer_t));
			mCallbackOps = callback_ops;
			mChannelHandle = mCameraHandle->ops->add_channel(mCameraHandle->camera_handle, NULL, NULL, this);/*mm_camera_interface.c*/
				static uint32_t mm_camera_intf_add_channel(uint32_t camera_handle,mm_camera_channel_attr_t *attr,mm_camera_buf_notify_t channel_cb,void *userdata)
					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);/*参考open_camera*/
						ch_id = mm_camera_add_channel(my_obj, attr, channel_cb, userdata);/* attr == NULL , channel_cb == NULL  */
							uint32_t mm_camera_add_channel(mm_camera_obj_t *my_obj,mm_camera_channel_attr_t *attr,mm_camera_buf_notify_t channel_cb,void *userdata)
								for(ch_idx = 0; ch_idx < MM_CAMERA_CHANNEL_MAX; ch_idx++)
									if (MM_CHANNEL_STATE_NOTUSED == my_obj->ch[ch_idx].state)
										ch_obj = &my_obj->ch[ch_idx];
								ch_hdl = mm_camera_util_generate_handler_by_num(my_obj->my_num, ch_idx); /* 生成相机句柄 */
								ch_obj->my_hdl = ch_hdl;
								ch_obj->state = MM_CHANNEL_STATE_STOPPED;
								ch_obj->cam_obj = my_obj;
								ch_obj->sessionid = my_obj->sessionid;
								mm_channel_init(ch_obj, attr, channel_cb, userdata);
									/*mm_camera_channel.c*/int32_t mm_channel_init(mm_channel_t *my_obj,mm_camera_channel_attr_t *attr,mm_camera_buf_notify_t channel_cb,void *userdata)
										my_obj->bundle.super_buf_notify_cb = channel_cb;/* NULL */
										my_obj->bundle.user_data = userdata;/* QCamera3HardwareInterface */
										mm_muxer_frame_sync_queue_init(&my_obj->frame_sync.superbuf_queue);
										mm_camera_poll_thread_launch(&my_obj->poll_thread[0],MM_CAMERA_POLL_TYPE_DATA);
											/*主要是启动一个线程,进入mm_camera_thread.c*/
											int32_t mm_camera_poll_thread_launch(mm_camera_poll_thread_t * poll_cb,mm_camera_poll_thread_type_t poll_type)
												pthread_create(&poll_cb->pid, NULL, mm_camera_poll_thread, (void *)poll_cb);
													mm_camera_poll_thread()/* 线程的执行函数 mm_camera_thread.c */
													/*线程启动后就开始等待 */
													    if(!poll_cb->status) {
															pthread_cond_wait(&poll_cb->cond_v, &poll_cb->mutex);
														}
										/* change state to stopped state */
										my_obj->state = MM_CHANNEL_STATE_STOPPED;
					if (aux_handle)/*辅助摄像头*/
						my_obj = mm_camera_util_get_camera_head(aux_handle);/*参考open_camera*/
						aux_ch_id = mm_camera_muxer_add_channel(aux_handle, attr,channel_cb, userdata, ch_id, my_obj);/* attr == NULL , channel_cb == NULL  */
							/*mm_camera_muxer.c*/uint32_t mm_camera_muxer_add_channel(uint32_t camera_handle, *attr,  channel_cb,void *userdata, uint32_t m_ch_id, mm_camera_obj_t *cam_obj)
								my_obj = mm_muxer_util_get_camera_by_obj(camera_handle, cam_obj);/*参考opencamera*/
								if(my_obj)
									ch_id = mm_camera_add_channel(my_obj, attr, channel_cb, userdata);/*同上主摄像机的add_channel*/
									if (ch_id > 0 && m_ch_id > 0)
										memset(&frame_sync, 0, sizeof(frame_sync));
										frame_sync.a_cam_obj = my_obj;
										frame_sync.a_ch_id = ch_id;
										frame_sync.userdata = userdata;
										frame_sync.a_stream_id = 0;
										frame_sync.is_res_shared = 1;
										if (attr != NULL) {
											frame_sync.attr = *attr;
											frame_sync.is_active = 1;
										}
										pthread_mutex_lock(&cam_obj->cam_lock);
										mm_camera_reg_frame_sync(cam_obj, m_ch_id,0, &frame_sync);
/*************************initialize_flow_end******************************************************************/
#endif

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值