安卓8.1中HAL3的camera 传输流程

本文详细解析了安卓系统中相机数据流的传递过程,从APP层到驱动层,重点分析了Framework层与HAL层间使用HIDL进行通信的机制,以及QCamera3HardwareInterface和QCamera3Channel在数据回调流程中的作用。
摘要由CSDN通过智能技术生成

     CAMERA的数据流总体涉及到几个层面:1)APP层 , 2)Framework层,3)HAL层,4)驱动层。下面主要分析2和3之间的数据流。安卓引入HAL3后,采用一个新的通讯方式HIDL,和以前的AIDL相似,都是用于进程间通信,只是HIDL是用硬件框架的通讯。Framework层正是使用这种新的方式与HAL层进行通信的。

  •     1) Framework层的Camera3Device.cpp中有个camera3_callback_ops,有2个方法,HAL层数据通过它的2个方法回调回来。
typedef struct camera3_callback_ops {
        void (*process_capture_result)(const struct camera3_callback_ops *, const camera3_capture_result_t *result);
         void (*notify)(const struct camera3_callback_ops *, const camera3_notify_msg_t *msg);

} camera3_callback_ops_t;


 

  •    2)  QCamera3HardwareInterface::initialize中传入camera3_callback_ops

QCamera3HWI.cpp

int QCamera3HardwareInterface::initialize(
        const struct camera3_callback_ops *callback_ops)
{
    ATRACE_CALL();
    int rc;

  ......

    rc = initParameters();
    if (rc < 0) {
        LOGE("initParamters failed %d", rc);
        goto err1;
    }
    mCallbackOps = callback_ops;

在QCamera3HardwareInterface::orchestrateResult 和 void QCamera3HardwareInterface::orchestrateNotify会用到上面的mCallbackOps ,后面的QCamera3Channel最终会将得到的数据通过QCamera3HardwareInterface::captureResultCb回调到这2个函数。

void QCamera3HardwareInterface::orchestrateResult(
                    camera3_capture_result_t *result)
{
    uint32_t frameworkFrameNumber;
    int32_t rc = _orchestrationDb.getFrameworkFrameNumber(result->frame_number,
            frameworkFrameNumber);
    if (rc != NO_ERROR) {
        LOGE("Cannot find translated frameworkFrameNumber");
        assert(0);
    } else {
        if (frameworkFrameNumber == EMPTY_FRAMEWORK_FRAME_NUMBER) {
            LOGD("CAM_DEBUG Internal Request drop the result");
        } else {
            result->frame_number = frameworkFrameNumber;
            mCallbackOps->process_capture_result(mCallbackOps, result);
        }
    }
}

void QCamera3HardwareInterface::orchestrateNotify(camera3_notify_msg_t *notify_msg)
{
    uint32_t frameworkFrameNumber;
    uint32_t internalFrameNumber = notify_msg->message.shutter.frame_number;
    int32_t rc = _orchestrationDb.getFrameworkFrameNumber(internalFrameNumber,
                                                          frameworkFrameNumber);
    if (rc != NO_ERROR) {
        LOGE("Cannot find translated frameworkFrameNumber");
        assert(0);
    } else {
        if (frameworkFrameNumber == EMPTY_FRAMEWORK_FRAME_NUMBER) {
            LOGE("CAM_DEBUG Internal Request drop the notifyCb");
        } else {
            notify_msg->message.shutter.frame_number = frameworkFrameNumber;
            mCallbackOps->notify(mCallbackOps, notify_msg);
        }
    }
}

 

  • 3)  在QCamera3HWI.cpp中会建立QCamera3Channel,QCamera3Channel的构造函数将QCamera3HardwareInterface::captureResultCb做为参数传入Channel。

QCamera3Channel.cpp

QCamera3Channel::QCamera3Channel(uint32_t cam_handle,
                               uint32_t channel_handle,
                               mm_camera_ops_t *cam_ops,
                               channel_cb_routine cb_routine,
                               channel_cb_buffer_err cb_buffer_err,
                               cam_padding_info_t *paddingInfo,
                               cam_feature_mask_t postprocess_mask,
                               void *userData, uint32_t numBuffers)

 

  • 4)   QCamera3Channel::addStream 中会调用QCamera3Stream::init方法,将QCamera3Channel::streamCbRoutine传入QCamera3Stream中。

QCamera3Channel.cpp

    rc = pStream->init(streamType, streamFormat, streamDim, streamRotation,
            NULL, minStreamBufNum, postprocessMask, isType, batchSize,
            streamCbRoutine, this);
  • 5) QCamera3Stream::init 中有个stream_config.stream_cb = dataNotifyCB;  将这个回调注册到底层的mm-camera-interface操作接 ,这样MM层接收到数据后,就可以回调到stream里
int32_t QCamera3Stream::init(
...    
stream_config.stream_cb = dataNotifyCB;

    rc = mCamOps->config_stream(mCamHandle,
            mChannelHandle, mHandle, &stream_config); 

 

至此,数据回调流程基本完成,还剩下从驱动层读取数据过程。

总体流程:mm-camera-interface-->stream  --->  channel   --->  HWI   --->   framework 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值