MTK平台闪光灯相关信息

news2024/11/18 6:15:40

(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.cpp

int 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]);
    else
        return setFlashOff();
}

(3)关闭真闪配置

//vendor/mediatek/proprietary/custom/mt6761/hal/camera_3a/flashawb_tuning_custom.cpp

MBOOL
isFlashAWBv2Enabled(MINT32 i4SensorDev)
{
    switch (i4SensorDev)
    {
    case NSIspTuning::ESensorDev_Main: //  Main Sensor
        return  MTRUE;//MFALSE
    case NSIspTuning::ESensorDev_MainSecond: //  Main Second Sensor
        return  MTRUE;
    case NSIspTuning::ESensorDev_Sub: //  Sub Sensor
        return  MTRUE;
    case NSIspTuning::ESensorDev_SubSecond: //  Sub Second Sensor
        return  MTRUE;
    default:
        return MTRUE;
    }
}

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

//kernel-4.19/arch/arm64/boot/dts/mediatek/mt6761.dts

flashlight_core: flashlight_core {
		compatible = "mediatek,flashlight_core";
	};

	flashlights_mt6370: flashlights_mt6370 {
		compatible = "mediatek,flashlights_mt6370";
		decouple = <1>;//默认为0,需要配置为1
		channel@1 {
			type = <0>;
			ct = <0>;
			part = <0>;
		};
	};

	flashlights_aw3644: flashlights_aw3644 {
		compatible = "mediatek,flashlights_aw3644";
	};
//vendor/mediatek/proprietary/custom/mt6761/hal/flashlight/flash_custom.cpp

int cust_isDualFlashSupport(int sensorDev)
{
    if(sensorDev == DUAL_CAMERA_MAIN_SENSOR || sensorDev == DUAL_CAMERA_MAIN_2_SENSOR)
        return 0;
    else
        return 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
    //torch
    p->engLevel.torchDuty = 6;//手电筒亮度
    //af
    p->engLevel.afDuty = 6;//对焦闪光灯亮度
    //pf, mf, normal
    p->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.cpp

MBOOL AeMgr::IsStrobeBVTrigger()
{
    MBOOL bStrobeBVTrigger;
    MINT32 i4Bv = 0;

    if (m_rAEInitInput.rAEPARAM.strAEParasetting.bEV0TriggerStrobe == MTRUE)
    {
        // The strobe trigger by the EV 0 index
        i4Bv = 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.h

static constexpr strAETable g_AE_PreviewAutoTable =
{
    AETABLE_RPEVIEW_AUTO, //eAETableID
    147, //u4TotalIndex
    -28, //i4StrobeTrigerBV    //为当前配置的打闪阈值
    102, //i4MaxBV
    -44, //i4MinBV, Original:-45
    90, //i4EffectiveMaxBV
    -30, //i4EffectiveMinBV
    LIB3A_AE_ISO_SPEED_AUTO, //ISO
    sPreviewPLineTable_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): 0


kernel_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): 0


kernel_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.coloradmin.cn/o/1082235.html

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

相关文章

2、vscode c++ 项目配置调试及运行

文章目录 1、项目布局2、多项目管理2.1 先是一个总的CMakeLists.txt2.2 每个项目2.3 多版本OPENCV 3、调试和运行 接上一篇文章&#xff0c;vscode和cmake的c环境配置好以后&#xff0c;我们要写项目&#xff0c;再写对应的CMakeLists.txt 1、项目布局 . ├── bin ├── bu…

【Vuex】入门使用---详细介绍

一&#xff0c;Vuex入门 1.1 什么是Vuex Vuex是一个专门为Vue.js应用程序开发的状态管理库。它用于管理应用程序中的共享状态&#xff0c;它采用集中式存储管理应用的所有组件的状态&#xff0c;使得状态的管理变得简单和可预测 官方解释&#xff1a;Vuex 是一个专为 Vue.js 应…

前端本地存储方案-localForage-vue3中使用

前言 前端有多种本地存储方案可供选择&#xff0c;常见的有&#xff1a; Cookie&#xff1a;小型的文本文件&#xff0c;存储少量数据Web Storage &#xff1a;包括&#xff1a;localStorage和sessionStorage&#xff0c;存储数据有上限&#xff08;5M&#xff09;左右Indexe…

JVM面试题:(三)GC和垃圾回收算法

GC: 垃圾回收算法&#xff1a; GC最基础的算法有三种&#xff1a; 标记 -清除算法、复制算法、标记-压缩算法&#xff0c;我们常用的垃圾回收器一般 都采用分代收集算法。 标记 -清除算法&#xff0c;“标记-清除”&#xff08;Mark-Sweep&#xff09;算法&#xff0c;如它的…

优化|一类二元二次规划的凸重构和外近似

论文解读者&#xff1a;范若岭 1. 文章优化问题&#xff1a; 对于下列问题&#xff0c;$ \mathbb{B} {0, 1}, \mathbb{R} 是实数集合。 是实数集合。 是实数集合。Q 是由实数组成的 是由实数组成的 是由实数组成的n \times n 对称矩阵。 对称矩阵。 对称矩阵。A 是由实数组成…

NSIDC定义的海冰相关概念

文章目录 相关概念Matlab绘图结果展示 相关概念 NSIDC 表示 “National Snow and Ice Data Center”&#xff0c;即美国国家雪和冰数据中心。NSIDC 是一个位于美国科罗拉多大学波尔得分校的研究中心&#xff0c;致力于收集、管理和分发全球雪和冰的科学数据。 Matlab绘图 cl…

智能井盖传感器:破解井盖安全隐患

万宾科技&#xff1a;智能井盖传感器 随着城市的不断发展&#xff0c;井盖成为城市道路的一部分&#xff0c;但也伴随着一些安全隐患。近年来&#xff0c;由于井盖倾斜或翻转导致的意外事件频发&#xff0c;引起了广泛关注。为了解决这一问题&#xff0c;万宾科技推出了智能井…

3、TCP状态

TCP状态 1、TCP通信时序 三次握手成功后&#xff0c;服务器和客户端进入了状态ESTABLISHED 当处于Time_WAIT状态后&#xff0c;不会马上变成CLOSE状态&#xff0c;会经历2MSL&#xff08;约40秒&#xff09;&#xff0c;之后才会进入CLOSE状态。 总结&#xff1a; 主动发起…

主动配电网故障恢复的重构与孤岛划分matlab程序

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 参考文档&#xff1a; A New Model for Resilient Distribution Systems by Microgrids Formation&#xff1b; 主动配电网故障恢复的重构与孤岛划分统一模型&#xff1b; 同时考虑孤岛与重构的配电网故障…

java 电动车销售管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java 电动车销售管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql…

深度学习_2_数据处理

import os是一个Python的内置模块&#xff0c;用于与操作系统进行交互。通过导入os模块&#xff0c;你可以使用其中提供的函数和方法来执行各种与操作系统相关的任务。 import osos.makedirs(os.path.join(.., date), exist_okTrue)##将创建一个名为date的文件夹&#xff0c;位…

基于全景运动感知的飞行视觉脑关节神经网络全方位碰撞检测

https:/doi.org/10.1155/2023/5784720 摘要&#xff1a; 生物系统有大量的视觉运动检测神经元&#xff0c;其中一些神经元可以优先对特定的视觉区域做出反应。然而&#xff0c;关于如何使用它们来开发用于全向碰撞检测的神经网络模型&#xff0c;很少有人做过工作。为此&#…

相同的 key, Nacos 配置一定会覆盖 application.yaml 吗?

一&#xff0c;背景&#xff1a; 之前在使用 Nacos 的时候有个疑问&#xff0c;同样的 key&#xff0c;在 Nacos 配置了&#xff0c;在 application 也配置了&#xff0c;到底会有哪个呢&#xff1f;一直没空查&#xff0c;后来在网上看到过文章&#xff0c;说 Nacos 是在 app…

【Redis】Hash 哈希相关的命令

命令 HSET 设置hash中指定的字段&#xff08;field&#xff09;的值&#xff08;value&#xff09;。 HSET key field value [field value ...]HGET 获取hash中指定字段的值。 HGET key fieldHEXISTS 判断hash中是否有指定的字段。 HEXISTS key fieldHDEL 删除hash中指定…

第十一章-用户进程

Ⅰ.为什么需要任务状态段TSS 1.LDT简介 已经不使用LDT加载任务了。因为当前运行的任务&#xff0c;其 LDT 位于 LDTR 指向的地址&#xff0c;这样 CPU 才能从中拿到任务运行所需要的资源&#xff08;指令和数据&#xff09;。因此&#xff0c;每切换一个任务时&#xff0c;需…

Android Jetpack Compose之生命周期与副作用

文章目录 1.概述2.Composeable生命周期3.Compose副作用及API3.1.Compose副作用API3.1.1 DisposableEffect3.1.2 SideEffect 3.2 Compose异步处理副作用API3.2.1 LaunchedEffect3.2.2 rememberCoroutineScope3.2.3 rememberUpdateState3.2.4 snapshotFlow 3.3 状态创建副作用API…

什么是C++?

1.什么是C C语言是结构化和模块化的语言&#xff0c;适合处理较小规模的程序。对于复杂的问题&#xff0c;规模较大的 程序&#xff0c;需要高度的抽象和建模时&#xff0c;C语言则不合适。为了解决软件危机&#xff0c; 20世纪80年代&#xff0c; 计算机 界提出了OOP(object o…

一种管理KEIL工程输出文件的方法

开发语言&#xff1a;python&#xff1b; 针对工程&#xff1a;适配ARM公司的KEIL-V5软件的工程 管理的输出文件类型&#xff1a;BIN文件、HEX文件 脚本使用方法&#xff1a;直接放置到keil的设置项下&#xff1b; 脚本执行位置&#xff1a;程序编译之后 脚本功能&#xff1a…

C++智能指针(一)——shared_ptr初探

文章目录 1. 普通指针存在的问题2. Class shared_ptr2.1 使用 shared_ptr2.1.1 初始化 shared_ptr2.1.2 reset2.1.3 访问数据2.1.4 use_count() 3. Deleter3.1 定义一个 Deleter3.2 处理数组 1. 普通指针存在的问题 智能指针的引入&#xff0c;是为了解决普通指针在使用过程中…

Android 13.0 SystemUI修改状态栏电池图标样式为横屏显示

1.概述 在13.0的产品定制化开发中,对于原生系统中SystemUId 状态栏的电池图标是竖着显示的,一般手机的电池图标都是横屏显示的 可以觉得样式挺不错的,所以由于产品开发要求电池图标横着显示和手机的样式一样,所以就得重新更换SystemUI状态栏的电池样式了 如图: 2.SystemUI…