Android P之Camera HAL3流程分析(5)

本文档详细介绍了在Android P的Camera HAL3中,如何在拍照完成后通过ImageReader获取图像数据。首先创建ImageReader并设置监听,当拍照数据准备好时,回调onImageAvailable方法保存图片。接着,深入到HAL3的内部流程,包括返回结果阶段,如Capture、preview和autoFocus的回调处理,以及数据的处理和回调到客户端的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Camera2中拍照完成之后,如何实现获取数据呢?答案就是使用ImageReader间接实现,首先创建一个ImageReader,并监听它的事件

    private void setupImageReader() {
        //2代表ImageReader中最多可以获取两帧图像流
        mImageReader = ImageReader.newInstance(mCaptureSize.getWidth(), mCaptureSize.getHeight(),
                ImageFormat.JPEG, 2);
        //拍照数据准备好之后会回调该函数保存图片数据
        mImageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() {
            @Override
            public void onImageAvailable(ImageReader reader) {
                //执行图像保存子线程
                mCameraHandler.post(new imageSaver(reader.acquireNextImage()));
            }
        }, mCameraHandler);
    }

返回结果阶段

Capture,preview以及autoFocus都是使用的这个回调,而Capture调用的时候,其RequestTag为CAPTURE,
而autoFocus的时候为TAP_TO_FOCUS,而preview请求时没有对RequestTag进行设置,所以回调到onCaptureStarted方法时,
不需要进行处理,但是到此时,preview已经启动成功,可以进行预览了,其数据都在buffer里。

alps/vendor/mediatek/proprietary/hardware/mtkcam3/main/hal/device/3.x/app/AppStreamMgr.CallbackHandler.cpp
threadLoop(){
    if ( ! waitUntilQueue1NotEmpty() ) {
        return true;
    }
    mQueue2.splice(mQueue2.end(), mQueue1);
    mQueue1Cond.broadcast();

    performCallback();
    return  true;
}
performCallback(){
    {
        for (auto const& cbParcel : mQueue2) {
            convertShutterToHidl(cbParcel, vNotifyMsg);
            convertErrorToHidl(cbParcel, vErrorMsg);
            convertMetaToHidl(cbParcel, vCaptureResult, vTempMetadataResult);
            convertImageToHidl(cbParcel, vBufferResult);
        }
        if  ( auto pResultMetadataQueue = mResultMetadataQueue ) {
            for (auto& item : vCaptureResult) {
                if  ( item.v3_2.result.size() == 0 ) {
                    continue;
                }
                if  ( pResultMetadataQueue->availableToWrite() > 0 ) {
                    if  ( CC_LIKELY(pResultMetadataQueue->write(item.v3_2.result.data(), item.v3_2.result.size())) ) {
                        item.v3_2.fmqResultSize = item.v3_2.result.size();
                        item.v3_2.result = hidl_vec<uint8_t>(); //resize(0)
                    }
                    else {
                        item.v3_2.fmqResultSize = 0;
                    }
                }
            }
        }
        //  send callbacks
        {
            if  ( ! vNotifyMsg.empty() ) {
                hidl_vec<NotifyMsg> vecNotifyMsg;
    &

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值