展锐平台下的SprdCamera3Channel.cpp文件路径如下:
vendor\sprd\modules\libcamera\hal3_2v6\SprdCamera3Channel.cpp
该文件内容不是很多,并且结构很清晰,包括如下四个channel
- SprdCamera3Channel
- SprdCamera3RegularChannel
- SprdCamera3PicChannel
- SprdCamera3MetadataChannel
其中SprdCamera3Channel里面只有一个 isFaceBeautyOn 函数,大部分逻辑是在SprdCamera3RegularChannel中。
channel中维护了一个SprdCamera3Stream类型的数组
SprdCamera3Stream *mCamera3Stream[CHANNEL_MAX_STREAM_NUM];
SprdCamera3RegularChannel主要内容如下:
调用oem的开启和停止预览的逻辑:
int SprdCamera3RegularChannel::start(uint32_t frame_number) {//开启预览
int ret = NO_ERROR;
ret = mOEMIf->start(mChannelType, frame_number);
return ret;
}
int SprdCamera3RegularChannel::stop(uint32_t frame_number) {
int ret;
ret = mOEMIf->stop(mChannelType, frame_number);
return NO_ERROR;
}
channel系列函数,均是从mCamera3Stream集合中获取stream的相关数据,然后通过mChannelCB,回调上去。
channelCbRoutine(uint32_t frame_number, int64_t timestamp,camera_stream_type_t stream_type)
channelClearInvalidQBuff(uint32_t frame_num, int64_t timestamp, camera_stream_type_t stream_type)
channelClearAllQBuff(int64_t timestamp, camera_stream_type_t stream_type)
channelUnmapCurrentQBuff(uint32_t frame_num, int64_t timestamp, camera_stream_type_t stream_type)
以 channelClearAllQBuff 为例看下代码,主要逻辑如下:
- 循环遍历 mCamera3Stream 数组
- 对每个SprdCamera3Stream 执行 buffFirstDoneDQ 函数,即返回mBufferList的第一个元素的buffer_handle_t ,然后erase该mBufferList的第一个元素hal_buff_list_t
- 进一步封装第2步返回的buffer_handle_t ,执行 mChannelCB 回调逻辑
int SprdCamera3RegularChannel::channelClearAllQBuff(
int64_t timestamp, camera_stream_type_t stream_type) {
int ret = NO_ERROR;
cam_result_data_info_t result_info;
int8_t index = stream_type - REGULAR_STREAM_TYPE_BASE;
if (index < 0) {
HAL_LOGE("stream_type %d is not valied type", stream_type);
return BAD_VALUE;
}
if (mCamera3Stream[index] == NULL) {
HAL_LOGW("channel has no valied stream");
return INVALID_OPERATION;
}
uint32_t frame_number;
camera3_stream_t *stream;
buffer_handle_t *buffer;
int buff_num;
mCamera3Stream[index]->getQBufListNum(&buff_num);
mCamera3Stream[index]->getStreamInfo(&stream);
for (int i = 0; i < buff_num; i++) {
ret = mCamera3Stream[index]->buffFirstDoneDQ(&frame_number, &buffer);
if (ret != NO_ERROR) {
HAL_LOGD("dq, bufId = %d", i);
continue;
}
result_info.is_urgent = false;
result_info.buffer = buffer;
result_info.frame_number = frame_number;
result_info.stream = stream;
result_info.timestamp = timestamp;
result_info.buff_status = CAMERA3_BUFFER_STATUS_ERROR;
result_info.msg_type = CAMERA3_MSG_ERROR;
mChannelCB(&result_info, mUserData);
}
return NO_ERROR;
}
不同的channel函数,调用的SprdCamera3Stream.cpp的不同buffer系列函数。
再往下是
addStream(camera_stream_type_t stream_type,camera3_stream_t *stream)
deleteStream()
clearAllStreams()
getStream(camera_stream_type_t stream_type,SprdCamera3Stream **stream)
这些都比较好理解,就不展开讲述了。
以上就是 SprdCamera3RegularChannel 的大致内容下。
SprdCamera3PicChannel的内容与SprdCamera3RegularChannel 结构基本一致:
start函数触发拍照(SprdCamera3RegularChannel 是开启预览)
start(uint32_t frame_number)
然后就是一系列的channel函数,同上SprdCamera3RegularChannel 的channel系列,不过在第二步中调用SprdCamera3Stream 的buffer系列函数不一样。
再下来就是SprdCamera3PicChannel的管理starem数组的函数:
addStream(camera_stream_type_t stream_type,camera3_stream_t *stream)
deleteStream()
clearAllStreams()
最后一个是 SprdCamera3MetadataChannel,该channel主要用作往SprdCamera3OEMIf.cpp中设置参数用的:
SprdCamera3Channel.cpp的内容就是这些了,该文件结构比较清晰,理解起来不是很费劲。