camera预览数据流代码流程

之前的一篇博客,我们看到了addstreamtochannel,以预览为例,当然把预览需要的stream全部add进预览的channel,这句话没毛病。

Z:\code\2700\HLOS\frameworks\av\services\camera\libcameraservice\device1\camerahardwareinterface.cpp的代码开始

status_t CameraHardwareInterface::startPreview()
{
    ALOGV("%s(%s)", __FUNCTION__, mName.string());
    if (CC_LIKELY(mHidlDevice != nullptr)) {
        return CameraProviderManager::mapToStatusT(
                mHidlDevice->startPreview());
    }
    return INVALID_OPERATION;
}

这里的startpreview掉的就是/hardware/interfaces/camera/device/1.0/default/CameraDevice.cpp下面的startpreview

直接看QCamera2HWI.cpp里面的内容个,这里面主要的内容就是startchannel,我们这里是预览,当然startchannel的参数是QCAMERA_CH_TYPE_PREVIEW.重点就是这个函数了。

int32_t QCamera2HardwareInterface::startChannel(qcamera_ch_type_enum_t ch_type)
{
    int32_t rc = UNKNOWN_ERROR;
    if (m_channels[ch_type] != NULL) {
        rc = m_channels[ch_type]->start();
    }
    return rc;
}

一目了然,这个函数里面主要内容就是m_channel[ch_type]->start();这个东西很熟了,不就是类QCameraChannel这个类型的一个类的数组指针嘛,所以数组里面的每一个元素,就是一个QCameraChannel类型的指针,解释清楚了。

在这里调用start,就是盗用类QCameraChannel.cpp里面的start函数,我们直接来看这个函数。

camera预览数据流代码流程_第1张图片

这张图片描述的很清楚了,channel里面的所有的stream都会start起来,每一个stream都会调用setbundleinfo和start函数。我们暂时先略过setbundleinfo,先看QCameraStream.cpp里面的start函数。

camera预览数据流代码流程_第2张图片

mProcTh这个对象是QCameraThread这个类的对象

camera预览数据流代码流程_第3张图片

这里的start_routine实际上就是上面start函数传给的参数dataProcRoutine函数,我们接下来看这个函数的原型

camera预览数据流代码流程_第4张图片

接下来会继续分析,这个数据是在哪里被填充的。

你可能感兴趣的:(camera预览数据流代码流程)