您的位置:首页 > 移动开发 > Android开发

【Android Camera】高通Camera的HAL调用流程

2018-03-13 16:02 721 查看
[align=left]以开启预览为例:
1,在Qcamera2hwi.cpp中的QCamera2HardwareInterface::startPreview()函数中调用startChannel(QCAMERA_CH_TYPE_PREVIEW);
2,进入QCamera2HardwareInterface::startChannel(qcamera_ch_type_enum_t ch_type)调用m_channels[ch_type]->start();
3,进入QCameraChannel::start()函数开始执行两个过程,分别是mStreams[i]->start()和m_camOps->start_channel(m_camHandle, m_handle);
4,首先是mStreams[i]->start()过程,调用QCameraStream::start()函数通过mProcTh.launch(dataProcRoutine, this)开启新线程执行CAMERA_CMD_TYPE_DO_NEXT_JOB分支,从mDataQ队列中取出数据并放入mDataCB中,等待数据返回到对应
   的stream回调中去,后面过程是向kernel请求数据的过程;
5,然后是m_camOps->start_channel(m_camHandle, m_handle)过程,进入mm_camera.c中的mm_camera_start_channel(mm_camera_obj_t *my_obj, uint32_t ch_id)函数,执行mm_channel_fsm_fn函数;
6,Stream开启之前是stopped状态,所以进入mm_camera_channel.c中调用mm_channel_fsm_fn_stopped函数,根据MM_CHANNEL_EVT_START条件开始执行mm_channel_start功能;
7,在mm_camera_channel.c中调用mm_channel_start(mm_channel_t *my_obj)函数,过程包括开启cb thread,cmd thread以及为每个stream分配buf,注册buf和开启stream;
8,首先是执行launch cb thread和launch cmd thread过程,开启两个线程;
9,其次是allocate buf过程,调用mm_camera_stream.c中的mm_stream_fsm_cfg函数,根据MM_STREAM_EVT_GET_BUF条件调用mm_stream_init_bufs,在mm_stream_init_bufs(mm_stream_t * my_obj)函数中会执行get_bufs过程;
10,再次是reg buf过程,调用mm_camera_stream.c中的mm_stream_fsm_buffed函数,根据MM_STREAM_EVT_REG_BUF条件调用mm_stream_reg_buf,在 mm_stream_reg_buf(mm_stream_t * my_obj)函数中会执行mm_stream_qbuf过程;
11,在mm_stream_qbuf过程,通过判断1 == my_obj->queued_buffer_count条件来Add fd to data poll thread;
12,最后是start stream过程,调用mm_stream_fsm_reg函数,通过条件MM_STREAM_EVT_START,执行mm_stream_streamon函数;
13,在mm_camera_stream.c中调用mm_stream_streamon(mm_stream_t *my_obj)函数,向kernel发送v4l2请求,等待数据回调。

注释:
关于正常takepicture的过程,在此之前会有一个addCaptureChannel的过程,包括channel的init和addStreamToChannel部分,然后会调用start_catpure_channel的start,后面过程跟startpreview的过程类似。
下面具体分析下addCaptureChannel的过程:(Capture channel, only need snapshot and postview streams start together)
1,在Qcamera2hwi.cpp中调用addCaptureChannel,此过程包括pChannel->init(&attr,capture_channel_cb_routine,this)和addStreamToChannel两部分;
2,pChannel->init执行过程会注册capture_channel_cb_routine回调,addStreamToChannel过程会注册stream的回调;
3,在pChannel->init过程中调用QCameraChannel.cpp中的QCameraChannel::init函数,最后会调用到mm_camera.c中的mm_camera_add_channel函数,此函数主要执行mm_channel_init(ch_obj, attr, channel_cb, userdata);
4,mm_channel_init过程会直接调用mm_camera_channel.c中的mm_channel_init函数,主要实现mm_camera_poll_thread_launch。注意此时channel的状态为MM_CHANNEL_STATE_STOPPED。
5,addStreamToChannel过程中调用Qcamera2hwi.cpp中的addStreamToChannel函数,这个函数主要调用pChannel->addStream;
6,QcameraChannel.cpp中调用QCameraChannel::addStream函数,此函数主要包括rc = pStream->init(streamInfoBuf, miscBuf,stream_cb, userdata, bDynAllocBuf),同时注册stream的cb;
7,QcameraStream.cpp中调用QCameraStream::init函数,主要包括mCamOps->add_stream和configStream()两部分;
8,mCamOps->add_stream过程最后调用mm_camera.c中的mm_camera_add_stream函数,此过程主要根据条件MM_CHANNEL_EVT_ADD_STREAM调用mm_channel_fsm_fn;
9,mm_channel_fsm_fn函数根据条件最后调用mm_camera_channel.c中的mm_channel_fsm_fn_stopped函数,进入MM_CHANNEL_EVT_ADD_STREAM分支,此过程执行mm_channel_add_stream函数;
10,mm_channel_add_stream函数最后调用mm_camera_channel.c中的mm_channel_add_stream函数,执行mm_stream_fsm_fn(stream_obj, MM_STREAM_EVT_ACQUIRE, NULL, NULL);
11,mm_stream_fsm_fn函数根据状态调用mm_camera_stream.c中的mm_stream_fsm_inited函数,执行mm_stream_init(my_obj)。此时stream已经初始化完成,接下来会在后面过程执行stream的start;
12,以上过程为addcapturechannel的主要过程,接下来会执行start_catpure_channel,此过程与previewchannel的start过程类似。[/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: