MTK平台闪光灯相关信息

(1)概念

  • MTK打闪一般分为预闪、主闪两个阶段。相应的执行一次拍照会有预闪、主闪两次开灯。预闪可以用来防红眼(red-eye reduction)。闪光时使环境发生变化,会按新的光线条件(有闪光时)重新测光,来实现更精确;
  • 预闪是开灯让AE/AF收敛,其持续的时间取决于AF/AF收敛的速度,Flash本身没有控制预闪时间长短的能力。理论上环境亮度越暗,对应的Sensor Framerate越低,AE/AF收敛的时间就越长(AE收敛完之后,才会做AF收敛)。预闪阶段会提前计算主闪时会使用的参数(AE/AWB/AF/Duty)。
  • 主闪是在Capture阶段去开灯,一般flow至少会亮三张Frame,在第三帧P1 Done关灯。主闪Duty, doCap要使用的AE参数、AWB权重、AF lock focus都是在预闪阶段就决定了。所以主闪的持续时间相对比预闪的会短一些,电流强度也会稍微高一点。

这里我们以普通的mt6761为例,可以查看部分代码的设置。

(2)闪光灯Hal逻辑代码

//vendor/mediatek/proprietary/hardware/mtkcam/aaa/source/common/flash_mgr/flash_hal.cppint FlashHal::getTorchStatus()
{logI("getTorchStatus(): torch status(%d).", mTorchStatus);return mTorchStatus;
}int FlashHal::setTorchOnOff(MBOOL enable)
{logI("[CAT][flash] setTorchOnOff(): type:%d enable:%d", mStrobeTypeId, enable);if (mStrobeTypeId == STROBE_TYPE_FRONT && !cust_isSubFlashSupport())return 1;if (enable == 1) {init();setInCharge(1);setOnOff(enable, FLASH_HAL_SCENARIO_TORCH);mTorchStatus = 1;} else {setOnOff(enable, FLASH_HAL_SCENARIO_TORCH);setInCharge(0);uninit();mTorchStatus = 0;}return 0;
}int FlashHal::setVideoTorchOnOff(int enable)
{logI("setVideoTorchOnOff(): enable(%d).", enable);setOnOff(enable, FLASH_HAL_SCENARIO_VIDEO_TORCH);return 0;
}int FlashHal::setAfLampOnOff(int enable)
{logI("setAfLampOnOff(): enable(%d).", enable);setOnOff(enable, FLASH_HAL_SCENARIO_AF_LAMP);return 0;
}int FlashHal::setPfOnOff(int enable)
{logI("setPfOnOff(): enable(%d).", enable);setOnOff(enable, FLASH_HAL_SCENARIO_PRE_FLASH);return 0;
}int FlashHal::setCaptureFlashOnOff(int enable)
{logI("setCaptureFlashOnOff(): enable(%d).", enable);setOnOff(enable, FLASH_HAL_SCENARIO_MAIN_FLASH);return 0;
}int FlashHal::setTorchDuty(int level)
{int duty = 0, dutyLt = 0;logI("setTorchLevel(): level(%d).", level);mTorchLevel = level;FlashCustomAdapter::getInstance(mSensorDev)->getTorchDuty(level, &duty, &dutyLt);mpStrobe->setDuty(duty);if (mStrobeCtNum > 1) {mpStrobe2->setDuty(dutyLt);}return 0;
}//setOnOff
int FlashHal::setOnOff(int enable, FLASH_HAL_SCENARIO_ENUM scenario)
{logI("[CAT][flash] setOnOff(): type:%d enable:%d scenario:%d", mStrobeTypeId, enable, scenario);/* verify arguments */if (verifyScenario(scenario)) {logE("setOnOff(): invalid arguments.");return -1;}if (!isAvailable()) {logI("setOnOff(): sensorDev(%d) not available.", mSensorDev);return -1;}if (scenario == FLASH_HAL_SCENARIO_MAIN_FLASH) {//...} else if (scenario == FLASH_HAL_SCENARIO_VIDEO_TORCH) {//...}if (enable)return setFlashOn(mFlashHalInfo[scenario]);elsereturn setFlashOff();
}

(3)关闭真闪配置

//vendor/mediatek/proprietary/custom/mt6761/hal/camera_3a/flashawb_tuning_custom.cppMBOOL
isFlashAWBv2Enabled(MINT32 i4SensorDev)
{switch (i4SensorDev){case NSIspTuning::ESensorDev_Main: //  Main Sensorreturn  MTRUE;//MFALSEcase NSIspTuning::ESensorDev_MainSecond: //  Main Second Sensorreturn  MTRUE;case NSIspTuning::ESensorDev_Sub: //  Sub Sensorreturn  MTRUE;case NSIspTuning::ESensorDev_SubSecond: //  Sub Second Sensorreturn  MTRUE;default:return MTRUE;}
}

(4)默认关闭双闪通道,并进行闪光灯校准

//kernel-4.19/arch/arm64/boot/dts/mediatek/mt6761.dtsflashlight_core: flashlight_core {compatible = "mediatek,flashlight_core";};flashlights_mt6370: flashlights_mt6370 {compatible = "mediatek,flashlights_mt6370";decouple = <1>;//默认为0,需要配置为1channel@1 {type = <0>;ct = <0>;part = <0>;};};flashlights_aw3644: flashlights_aw3644 {compatible = "mediatek,flashlights_aw3644";};
//vendor/mediatek/proprietary/custom/mt6761/hal/flashlight/flash_custom.cppint cust_isDualFlashSupport(int sensorDev)
{if(sensorDev == DUAL_CAMERA_MAIN_SENSOR || sensorDev == DUAL_CAMERA_MAIN_2_SENSOR)return 0;elsereturn 0;return 0;
}

如下修改为闪光灯校准:vendor/mediatek/proprietary/custom/mt6761/hal/flashlight/flash_tuning_custom_cct.cpp

在这里插入图片描述

(5)闪光灯亮度相关参数

//vendor/mediatek/proprietary/custom/mt6761/hal/flashlight//flash_tuning_custom_cct.cpp
//--------------------//eng level//index mode//torchp->engLevel.torchDuty = 6;//手电筒亮度//afp->engLevel.afDuty = 6;//对焦闪光灯亮度//pf, mf, normalp->engLevel.pfDuty = 6;//预闪亮度p->engLevel.mfDutyMax = 27;//主闪亮度范围值p->engLevel.mfDutyMin = 0;//...

(6)闪光灯打闪Log分析

(A)main Log查看(3次打闪)

打闪几次可通过如下Log判断。

W TaskMgr : [sendEvent] TaskEvent:TouchAEStart, fgLampflashCond(1)/bCustEnableFlash(1)/bStrobeBVTrigger(1)
W TaskMgr : [sendEvent] TaskEvent:TouchAEStart, fgLampflashCond(1)/bCustEnableFlash(1)/bStrobeBVTrigger(1)
W TaskMgr : [sendEvent] TaskEvent:TouchAEStart, fgLampflashCond(1)/bCustEnableFlash(1)/bStrobeBVTrigger(1)

另可通过如下源码查看调用过程。

//vendor/mediatek/proprietary/hardware/mtkcam/aaa/source/isp_30/ae_mgr/ae_mgr.cppMBOOL AeMgr::IsStrobeBVTrigger()
{MBOOL bStrobeBVTrigger;MINT32 i4Bv = 0;if (m_rAEInitInput.rAEPARAM.strAEParasetting.bEV0TriggerStrobe == MTRUE){// The strobe trigger by the EV 0 indexi4Bv = m_BVvalueWOStrobe;}else{if (m_rAEInitInput.rAEPARAM.pEVValueArray[m_eAEEVcomp]){if (m_pIAeAlgo != NULL){i4Bv = m_BVvalueWOStrobe + m_pIAeAlgo->getSenstivityDeltaIndex(1024 * 1024 / m_rAEInitInput.rAEPARAM.pEVValueArray[m_eAEEVcomp]);}else{i4Bv = m_BVvalueWOStrobe;AE_LOG("[%s()] The AE algo class is NULL, i4SensorDev:%d line:%d\n", __FUNCTION__, m_eSensorDev, __LINE__);}}}bStrobeBVTrigger = (i4Bv < m_CurrentCaptureTable.i4StrobeTrigerBV)?MTRUE:MFALSE;AE_LOG_IF(m_3ALogEnable, "[%s()] i4SensorDev:%d bStrobeBVTrigger:%d BV:%d %d\n", __FUNCTION__, m_eSensorDev, bStrobeBVTrigger, i4Bv, m_CurrentCaptureTable.i4StrobeTrigerBV);return bStrobeBVTrigger;
}

可通过如上Code中的bStrobeBVTrigger字段来查看当前环境值和打闪阈值。

D ae_mgr  : [IsStrobeBVTrigger()] i4SensorDev:1 bStrobeBVTrigger:0 BV:11 -28
D ae_mgr  : [IsStrobeBVTrigger()] i4SensorDev:1 bStrobeBVTrigger:0 BV:10 -28
D ae_mgr  : [IsStrobeBVTrigger()] i4SensorDev:1 bStrobeBVTrigger:1 BV:-36 -28
D ae_mgr  : [IsStrobeBVTrigger()] i4SensorDev:1 bStrobeBVTrigger:0 BV:-2 -28

备注:具体打闪阈值通过效果文件来控制。

//camera_AE_PLineTable_xxxxraw.hstatic constexpr strAETable g_AE_PreviewAutoTable =
{AETABLE_RPEVIEW_AUTO, //eAETableID147, //u4TotalIndex-28, //i4StrobeTrigerBV    //为当前配置的打闪阈值102, //i4MaxBV-44, //i4MinBV, Original:-4590, //i4EffectiveMaxBV-30, //i4EffectiveMinBVLIB3A_AE_ISO_SPEED_AUTO, //ISOsPreviewPLineTable_60Hz,sPreviewPLineTable_50Hz,NULL,
};

(B)kernel Log查看(3次打闪)

//预闪
kernel_log_6__2023_0613_212218:10220: <7>[ 2188.129555]  (0)[7550:3AEventThd]flashlight: _flashlight_ioctl: FLASH_IOC_SET_ONOFF(0,0,0): 1
kernel_log_6__2023_0613_212218:11035: <7>[ 2189.912077]  (2)[7550:3AEventThd]flashlight: _flashlight_ioctl: FLASH_IOC_SET_ONOFF(0,0,0): 0
//主闪
kernel_log_6__2023_0613_212218:11260: <7>[ 2190.348990]  (0)[7467:3ATHREAD]flashlight: _flashlight_ioctl: FLASH_IOC_SET_ONOFF(0,0,0): 1
kernel_log_6__2023_0613_212218:11305: <7>[ 2190.453573]  (3)[7512:CAM_P1]flashlight: _flashlight_ioctl: FLASH_IOC_SET_ONOFF(0,0,0): 0
kernel_log_6__2023_0613_212218:11463: <7>[ 2190.665271]  (1)[7467:3ATHREAD]flashlight: _flashlight_ioctl: FLASH_IOC_SET_ONOFF(0,0,0): 0kernel_log_6__2023_0613_212218:12779: <7>[ 2193.272978]  (1)[7639:3AEventThd]flashlight: _flashlight_ioctl: FLASH_IOC_SET_ONOFF(0,0,0): 1
kernel_log_6__2023_0613_212218:13307: <7>[ 2194.481592]  (3)[7639:3AEventThd]flashlight: _flashlight_ioctl: FLASH_IOC_SET_ONOFF(0,0,0): 0
kernel_log_6__2023_0613_212218:13497: <7>[ 2194.918873]  (0)[7467:3ATHREAD]flashlight: _flashlight_ioctl: FLASH_IOC_SET_ONOFF(0,0,0): 1
kernel_log_6__2023_0613_212218:13542: <7>[ 2195.016548]  (1)[7512:CAM_P1]flashlight: _flashlight_ioctl: FLASH_IOC_SET_ONOFF(0,0,0): 0
kernel_log_6__2023_0613_212218:13705: <7>[ 2195.222145]  (2)[7467:3ATHREAD]flashlight: _flashlight_ioctl: FLASH_IOC_SET_ONOFF(0,0,0): 0kernel_log_6__2023_0613_212218:15349: <7>[ 2198.889098]  (2)[7653:3AEventThd]flashlight: _flashlight_ioctl: FLASH_IOC_SET_ONOFF(0,0,0): 1
kernel_log_6__2023_0613_212218:15942: <7>[ 2200.201315]  (3)[7653:3AEventThd]flashlight: _flashlight_ioctl: FLASH_IOC_SET_ONOFF(0,0,0): 0
kernel_log_6__2023_0613_212218:16129: <7>[ 2200.869104]  (3)[7467:3ATHREAD]flashlight: _flashlight_ioctl: FLASH_IOC_SET_ONOFF(0,0,0): 1
kernel_log_6__2023_0613_212218:16174: <7>[ 2200.967390]  (0)[7512:CAM_P1]flashlight: _flashlight_ioctl: FLASH_IOC_SET_ONOFF(0,0,0): 0
kernel_log_6__2023_0613_212218:16347: <7>[ 2201.322911]  (1)[7467:3ATHREAD]flashlight: _flashlight_ioctl: FLASH_IOC_SET_ONOFF(0,0,0): 0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/101282.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python- excel 创建/写入/删sheet+花式遍历

文章目录 前言python- excel 创建/写入/删sheet花式遍历1. excel 创建2. 写入excel3. 创建写入excel demo实战4. 删除sheet5. excel 花式遍历 demo实战5.1. 获取 A1的值5.2. 获取指定列的切片数据&#xff0c;获取 B1到B5的值5.3. 循环整个excel的这个sheet5.4. 遍历指定行&…

从零开始学习:如何使用Selenium和Python进行自动化测试?

安装selenium 打开命令控制符输入&#xff1a;pip install -U selenium 火狐浏览器安装firebug&#xff1a;www.firebug.com&#xff0c;调试所有网站语言&#xff0c;调试功能 Selenium IDE 是嵌入到Firefox 浏览器中的一个插件&#xff0c;实现简单的浏览器操 作的录制与回…

Unity2017适配安卓12

测试版本为Unity2017.4.25f1 1.在自定义AndroidManifest.xml&#xff08;位于Assets\Plugins\Android\&#xff09;中添加android:exported"true" <?xml version"1.0" encoding"utf-8"?> <manifestxmlns:android"http://schema…

探索 Redis 与 MySQL 的双写问题

在日常的应用开发中&#xff0c;我们经常会遇到需要使用多种不同类型的数据库管理系统来满足各种业务需求。其中最典型的就是Redis和MySQL的组合使用。 这两者拥有各自的优点&#xff0c;例如Redis为高性能的内存数据库提供了极快的读写速度&#xff0c;而MySQL则是非常强大的…

选择智慧公厕解决方案,开创智慧城市公共厕所新时代

在城市建设和发展中&#xff0c;公厕作为一个不可或缺的城市基础设施&#xff0c;直接关系到城市形象的提升和居民生活品质的改善。然而&#xff0c;传统的公厕存在着管理不便、卫生状况差、设施陈旧等问题。为了解决这些困扰着城市发展的难题&#xff0c;智慧公厕源头厂家广州…

视频监控系统/视频汇聚平台EasyCVR如何反向代理进行后端保活?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

利用异常实现短期hook

场景1 调用目标call 需要跳过某些判断或者函数 场景2 目标call 只需要部分指令执行 大概实现技术 设置线程上下文设置drX寄存器 实现硬件执行断点 主动调用目标call 通过硬件断点获取寄存器或修改eip 以上实现不改变crc且不通过驱动实现。只对当前执行线程有效&#xff…

Android Termux安装MySQL,并使用cpolar实现公网安全远程连接[内网穿透]

文章目录 前言1.安装MariaDB2.安装cpolar内网穿透工具3. 创建安全隧道映射mysql4. 公网远程连接5. 固定远程连接地址 前言 Android作为移动设备&#xff0c;尽管最初并非设计为服务器&#xff0c;但是随着技术的进步我们可以将Android配置为生产力工具&#xff0c;变成一个随身…

2023-10-11 LeetCode每日一题()

2023-10-11每日一题 一、题目编号 2512. 奖励最顶尖的 K 名学生二、题目链接 点击跳转到题目位置 三、题目描述 给你两个字符串数组 positive_feedback 和 negative_feedback &#xff0c;分别包含表示正面的和负面的词汇。不会 有单词同时是正面的和负面的。 一开始&…

docker概念

docker 容器&#xff1a;就是提供在多台主机上运行的应用程序相同的运行环境。 docker的概念 是开源的容器&#xff0c;是由Go语言开发的&#xff0c;是容器里面运用的工具&#xff0c;他是一个轻量级的虚拟机&#xff0c;可以利用docker在多台主机上创建与运行容器。 docke…

2018架构真题案例(四十九)

某文件采用多级索引结构&#xff0c;磁盘大小4K字节&#xff0c;每个块号4字节&#xff0c;那么二级索引结果时&#xff0c;文件最大。 A、1024 B、1024*1024 C、2048*2048 D、4096*4096 答案&#xff1a;B 霍尔三维结构以时间堆、&#xff08;&#xff09;堆、知识堆组成…

聊聊Android签名检测7种核心检测方案详解

聊聊Android签名检测总结与反思 背景&#xff1a; 这篇文章只讲Android端签名检测&#xff0c;安卓发展到现在&#xff0c;因为国内环境没有谷歌市场&#xff0c;所以很多官方推荐的Api没法使用 &#xff0c;所以国内的签名检测方式也是“千奇百怪” 。发展至今每种方法都有一…

【ElasticSearch】深入探索 DSL 查询语法,实现对文档不同程度的检索,以及对搜索结果的排序、分页和高亮操作

文章目录 前言一、Elasticsearch DSL Query 的分类二、全文检索查询2.1 match 查询2.2 multi_match 查询 三、精确查询3.1 term 查询3.2 range 查询 四、地理坐标查询4.1 geo_bounding_box 查询4.2 geo_distance 查询 五、复合查询5.1 function score 查询5.2 boolean 查询 六、…

WorkPlus一站式解决方案,助力企业构建统一门户系统

在信息爆炸的时代&#xff0c;企业管理面临着海量的数据和各类业务应用的复杂性。如何实现信息的井然有序、高效管理&#xff0c;成为企业发展的关键。WorkPlus作为领先的品牌&#xff0c;致力于打造统一门户系统&#xff0c;为企业提供全方位的服务和解决方案。本文将以知乎的…

广州华锐互动:候车室智能数字孪生系统实现交通信息可视化

随着科技的不断发展&#xff0c;数字化技术在各个领域得到了广泛的应用。智慧车站作为一种新型的交通服务模式&#xff0c;通过运用先进的数字化技术&#xff0c;为乘客提供了更加便捷、舒适的出行体验。 将智慧车站与数字孪生大屏结合&#xff0c;可以将实际现实世界的实体车站…

java 无感hook实现(修改jdk)

背景 1 工作需要&#xff0c;需要修改一个java的程序逻辑&#xff0c;之前都是用的frida修改的&#xff0c;但是现在的工作场景&#xff0c;重视效率&#xff0c;所以frida这种重工具被pass了&#xff0c;只能重新选其他工具&#xff0c;初始的时候是想用java本身的一些修改工…

纸、纸板和纸制品 有效回收组分的测定

声明 本文是学习GB-T 42944-2023 纸、纸板和纸制品 有效回收组分的测定. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件描述了纸、纸板和纸制品中有效回收组分的测定方法。 本文件适用于各种纸、纸板和纸制品&#xff0c;也适用于铝箔…

微信小程序通过 movable-area 做一个与vuedraggable相似的上下拖动排序控件

因为只是做个小案例 我就直接代码写page页面里了 其实很简单 组件稍微改一下就好了 wxss /* 设置movable-area的宽度 */ .area{width: 100%; }/* a b c 每条元素的样式 */ movable-view {width: 100%;background-color: red;height: 40px;line-height: 40px;color: #FFFFFF;tex…

day

#include <iostream> using namespace std; class Per {//算术运算符friend const Per operator(const Per &k1,const Per &k2);friend const Per operator-(const Per &k1,const Per &k2);friend const Per operator*(const Per &k1,const Per &…

3ds Max渲染太慢?创意云“一键云渲染”提升3ds Max渲染体验

&#xfeff;在数字艺术设计领域&#xff0c;3ds Max是广泛使用的三维建模和渲染软件之一。然而&#xff0c;许多用户都面临着一个共同的问题&#xff1a;渲染速度太慢。渲染一帧画面需要耗费数小时&#xff0c;让人无法忍受。除了之前给大家介绍的几种解决方法外&#xff1a; …