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

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

/*initialize_flow*/#if 1/*************************initialize_flow_start******************************************************************/QCamera3HWI.cppint (*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

 

更多相关文章

  1. SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
  2. flutter使用C代码库----android篇
  3. Android本地实现搜索历史记录
  4. android之视频播放系统VideoView和自定义VideoView控件的应用
  5. Android中实现可滑动的Tab的3种方式
  6. 设置r.style
  7. android键盘映射之一
  8. Android(安卓)版本兼容问题(一)
  9. Android单选复选框

随机推荐

  1. 一文吃透JVM分代回收机制
  2. Mysql 死锁引发的@Transactional 数据回
  3. 群统计v0.9: 特殊权重票,现场活动投票利器
  4. 如何尽快掌握Python?
  5. Redission 实现分布式锁
  6. 一文教你了解redis哨兵模式
  7. 不用***,如何查看国外技术文章
  8. Redis数据迁移的4种方法
  9. Python到底怎么读?
  10. 多线程学习(二) 多线程创建4种方式