Camera HAL 下的SprdCamera3Channel.cpp 内容介绍

展锐平台下的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 为例看下代码,主要逻辑如下:

  1. 循环遍历 mCamera3Stream 数组
  2. 对每个SprdCamera3Stream 执行 buffFirstDoneDQ 函数,即返回mBufferList的第一个元素的buffer_handle_t ,然后erase该mBufferList的第一个元素hal_buff_list_t
  3. 进一步封装第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的内容就是这些了,该文件结构比较清晰,理解起来不是很费劲。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值