解决Camera HAL层无法多次回调数据到App

一、问题描述
在一个双摄项目中, 需要在HAL(使用 API1/HAL1)层集成Bokeh功能(双摄虚化), 同时需要将相关双摄数据回调到App存储, 用于集成Refocus功能(即可以在相册中重新选择虚化焦点和虚化强度). 因此需要回传的数据有, bokeh效果图, 主摄原图, depth数据, bokeh效果图可以走主摄jpeg回调直接返回到App,剩余的两个数据当初考虑使用jpeg callback或者postview callback分两次传回App, 但在实际实施过程中过, 使用postview 回传数据时, App始终只能接受到一次数据, 使用jpeg回传除了bokeh效果图, 其他数据也接收不到,也就是两个回调接口都只能回调一次数据, 这就导致功能没法完成, 这篇文章主要是讲解决这个问题的思路.

二、解决思路
在解决问题前, 我们已知的信息是: 回调接口使用肯定没有问题, 因为数据的确可以回调, 只是每个回调接口只能回调一次数据而已. 因此最大可能性是回调的数据在某个位置被丢弃了, 所以要解决问题, 就得一步一步看数据回调流程.
我们主要关注的文件有 :

frameworks/base/core/java/android/hardware/Camera.java

frameworks/base/core/jni/android_hardware_Camera.cpp

frameworks/av/camera/Camera.cpp
frameworks/av/services/camera/libcameraservice/api1/CameraClient.cpp
frameworks/av/services/camera/libcameraservice/device1/CameraHardwareInterface.h

这几个文件中都有数据回调相关的函数(dataCallback), 具体是那些函数就不一一介绍了, 主要讲下解决的思路,
至此, 我们一般有两种方法来定位此问题:

详细阅读每个文件中和数据回调相关的函数, 看看那些地方会丢弃回到数据
在每个文件的回调函数中关键位置打印一些Log, 编译刷机, 跑下原始流程, 看Log在哪里出现异常
显然第一种方式更利于理解整体流程, 而第二种方式则能更快定位并解决问题, 但都是不错的解决方案.

三、问题分析
由于我当时项目比较紧急, 所以用的第二种方式解决问题, 通过打印Log, 最终定位到是在CameraClient.cpp中, 回调数据被丢弃了.

关键函数如下:

注: 代码均为 Android 8.0 高通SDM450平台

 void CameraClient::dataCallback(int32_t msgType,
        const sp<IMemory>& dataPtr, camera_frame_metadata_t *metadata, void* user) {
   
    LOG2("dataCallback(%d)", msgType);

    sp<CameraClient> client = getClientFromCookie(user);
    if (client.get() == nullptr) return;

    if (!client->lockIfMessageWanted(msgType)) 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值