Camera-MTK Capture、Preview request解析

本文分析了Camera工作流程,包括拍照、预览请求处理及流控解析,并详细探讨了预览卡顿及拍照耗时差异等问题,提供了具体的解决思路。

        Camera流程分析中最关键的是关于拍照、预览请求的处理以及流控的各种解析,从不同的request里面可以分析出大量的其他信息,对流需要做什么处理以及做了什么处理,这个是研究拍照、预览性能的必要经过。

1.通过Log对Camera流程check

        06:21:22.435 应用层开始openCamera

         06:21:22.471 Open前摄CameraDevice打开成功得到onOpen返回cameraProxy对应底层device

        06:21:22.672 下发前摄开启预览所需功能对应的session

         06:21:22.702 创建Camera前摄所需功能的session成功,且通过onConfigured返回CameraCaptureSessionProxy对应底层的CaptureSession

        06:21:22.719  HAL接收到应用层下发的预览请求 

        06:21:25.737拍照动作下发:

         06:21:25.784 HAL层接收到下发的capture Request

         06:21:25.877 HAL层处理完拍照帧之后,提供预览帧数据流

        06:21:26.020 拿到拍照之后的缩略图

         06:21:26.074 拍照完成,UI恢复

        06:21:28.225 拿到拍照之后的jpeg格式图片,且将拍照button恢复 

2.拍照之后预览卡死2-3s问题check

         对之前项目中遇到的预览卡死现象进行分析,当然造成预览卡死的原因不仅仅这一种,肯定需要具体情况具体分析。

异常log分析:

        因为问题是出现在虚化模式拍照之后,预览卡死2-3s之后才会恢复,处理问题的第一反应是需要check底层对capture、preview request的相关处理进而定位问题出现的时间节点,查看log可以看出18:20:03进入虚化模式,18:20:06下发拍照request,18:20:09预览request才处理预览请求,预览卡死即发生在18:20:06-18:20:09这个过程中。

         问题发生的时间点找到了,但是定位问题、解决问题的过程总是充满曲折,之前项目单单处理这个问题就花费了好长时间。现在就不去讨论咋么排除、定位问题的了,直接check问题点。

        根据之前的分析发现,18:20:09、18:20:11俩次拍照之前的200ms左右时间都会进行一次configureStrean重新配流的操作,这个操作就会耗费2s+的时间,同时也是导致预览流上来慢的原因。

        下一步需要check为什么会在每一次发送拍照请求之后要重新配流的异常原因。

         定位到这边离破案就不远了,但是还是经过了一段较长时间的折磨才最终解决了问题,直接上答案。

        最后定位到预览和拍照下发request时候要处理的Metadata的数量不一致导致。

        18:20:03 时间点刚进入预览模式进行配流操作,下发metadata数量为7。

         18:20:05 时间点出出发拍照模式,因为处理的metadata数量不一致,要重新进行一次配流,进而出发reconfig的操作,导致耗时增加了2s+。

        这边相当于通过 reconfig重新配流阶段,又将流配成预览所需的处理流程。定位到问题点解决方式就很简单了。

         下发capture request前后有触发reconfig是因为,app有下发的request中包含不同的session key导致(sessionkey不一致会导致hal层做reconfig), app 下发session key(com.mediatek.control.capture.postviewsize)逻辑有误造成。

3.同一型号版本的衍生类拍照耗时有的较慢问题分析

        之前项目中有发现同一型号的衍生项目的俩台机型之前拍照的耗时差异比较大,客户对此提出疑问。对于系统代码处理流程而言基本是一致的不会产生较大差异,需要对不同型号手机的拍照流程进行分析才能找到造成耗时差异的原因。

        耗时较长机型的拍照请求的处理分析:

        下发拍照请求时间点 :

        针对拍照请求进行的相关处理流程

         耗时较短机型的拍照请求的处理分析:

        通过对俩款机型拍照之后request的分析,发现主要的耗时操作在于有一款进行了多帧处理,一款没有进行多帧降噪的处理,问题点定位到了,解决起来就会快很多。

总结

        Camera工程师最近被音频相关的问题搞的头昏眼花,回头搞搞Camera问题调节调节,音频涉及到的实在太多了,AudioPolicy、AudioMananger、AudioFlinger、AudioTrack各种mixer、dsp参数分发、各种输出设备的控制,搞得头都大了,感觉Audio通路能搞懂没个一年半载的专心研究根本就是乱七八糟的,太痛苦了!

<think>我们正在讨论MTK相机启动日志(mtk_camera_startup_logs)的含义及其在相机启动过程中的作用。根据引用[3],我们知道在设备定制(客制化)过程中,device目录下的mk文件(如针对mt8163平台的mk文件)会定义一些全局变量,这可能包括相机相关的配置。MTK相机启动日志是MediaTek(联发科)平台相机系统在初始化过程中生成的日志,用于记录相机硬件和软件层的初始化状态、参数配置及关键事件。这些日志对于调试相机启动问题、性能优化和系统集成至关重要。###MTK相机启动日志内容解析1.**相机HAL层初始化**-日志会记录`CameraHal`类的初始化过程,包括:-相机硬件抽象层版本(如`CameraHALAPIversion:3.4`)-相机传感器检测结果(如`Detected2camerasensors`)-相机特性支持(如`Supportlevel:LEGACY`)[^2]2.**相机服务启动**-日志包含相机服务的启动流程:```log[CameraService]start:CameraServicestarting[CameraService]enumerateProviders:Addingcameraproviderfromhardwarelegacy/0```此部分显示系统加载的相机Provider(如`hardwarelegacy`)[^1]。3.**相机设备打开**-当应用请求打开相机时,日志会记录设备打开状态:```log[CameraDeviceClient]initialize:Cameradevice0opened[Camera2ClientBase]initialize:Deviceversion:3.4,clientversion:3.4```包括设备版本和客户端API版本匹配情况[^2]。4.**参数配置**-显示相机初始参数(分辨率、帧率等):```log[RequestThread]configureOutputs:Settingpreviewsize:1920x1080[Camera3Device]createStream:StreamcreatedwithID1,format0x23,size1920x1080```###相机初始化日志格式MTK相机日志遵循Android标准日志格式,但包含MTK特定标记(如`[MtkCam]`):```log[时间戳][进程ID-线程ID][日志级别/Tag]消息内容```**示例**:```log07-0510:23:45.6781234-1256IMtkCam/CameraHal:[initialize]CameraHALinitializedfordevice/dev/video0```-**字段解析**:-`07-0510:23:45.678`:时间戳(月-日时:分:秒.毫秒)-`1234-1256`:进程ID-线程ID-`I`:日志级别(I=Info,D=Debug,E=Error)-`MtkCam/CameraHal`:日志Tag(标明日志来源模块)-`[initialize]...`:具体消息###MTK特定日志项1.**传感器校准日志**MTK平台会记录传感器校准状态:```log[MtkCam/SensorCal]calibrate:Sensorcalibrationcompleted,status=0````status=0`表示校准成功。2.**驱动层初始化**显示底层相机驱动加载情况:```log[MtkCam/Drv]init:Cameradriverversion:mtk_camera_v2.1.0```3.**性能优化标记**MTK添加了启动耗时统计:```log[MtkCam/Perf]startup:Camerastartuptime:320ms```###调试应用在`CameraXActivity.java`(引用[1])中,可通过以下方式启用详细日志:```javaimportandroid.util.Log;publicclassCameraXActivityextendsActivity{privatestaticfinalStringTAG="OpenCamera/CameraX";protectedvoidonCreate(BundlesavedInstanceState){Log.d(TAG,"MTKcamerastartuplogsenabled");//添加自定义日志点}}```###关键日志路径-**系统日志**:`adblogcat-sMtkCam:*`-**内核日志**:`adbshelldmesg|grepmtk_camera`-**HAL层日志**:`adblogcat-sCameraHal`>通过分析`mtk_camera_startup_logs`,开发者可定位相机启动失败(如传感器未就绪)、参数配置错误或性能瓶颈等问题[^1][^2][^3]。§§相关问题§§1.如何从日志中区分MTK相机和其他平台(如高通)的启动过程?2.MTK相机日志中常见的错误代码有哪些?3.如何定制MTK相机的日志输出级别?4.相机启动日志与Camera2API调用有何关联?</think>### MTK Camera Startup Logs 内容解析 MTK Camera Startup Logs 是联发科(MediaTek)平台相机系统初始化时生成的关键日志,记录了从硬件驱动加载到应用层相机服务初始化的完整流程。以下是核心内容解析: #### 1. **相机硬件层初始化** - **传感器检测日志** ```log [HAL] mtk_camera: probe(): Detected IMX586 sensor at i2c-2 addr 0x1A [ISP] mtk_isp_init: ISP core clock set to 800MHz ``` 显示相机传感器型号、I²C地址及ISP处理器时钟配置[^3]。 - **驱动加载状态** ```log [DRV] mtk_cam_drv: loaded firmware mt8163_cam_fw.bin (v2.1.3) [V4L2] mtk_cam_v4l2: registered /dev/video0 (CAPTURE) ``` 包含固件版本、设备节点注册信息(如`/dev/video0`)[^2]。 #### 2. **相机HAL层初始化** - **HAL模块加载** ```log [HAL] load: Loading mtk_camera HAL module (API v3.4) [HAL] getNumberOfCameras(): Found 2 physical cameras ``` 显示HAL接口版本和物理相机数量[^1]。 - **特性配置解析** ```log [HAL] parseStaticMetadata: android.sensor.info.activeArraySize = [0,0,4032,3024] android.control.aeAvailableModes = [1,3] ``` 输出相机静态元数据(分辨率、曝光模式等)[^1]。 #### 3. **CameraService初始化** - **相机服务启动** ```log [CameraService] start: CameraService starting (pid 1234) [CameraProvider] initialize: Registered MTK camera provider ``` 显示服务进程ID和供应商提供者注册状态[^1]。 - **设备枚举** ```log [CameraDeviceClient] openCameraDevice: Opening camera 0 for client com.opencamera [Camera2Client] initialize: Created device for camera 0 (API2) ``` 记录应用请求打开的相机设备和API版本[^1]。 #### 4. **性能关键路径** - **启动耗时统计** ```log [Perf] camera_startup: |-- HAL_init: 120ms |-- Sensor_power_on: 85ms |-- ISP_config: 210ms `-- Total: 520ms ``` 分段统计各模块初始化时间(MTK特有性能日志)[^3]。 - **资源分配** ```log [Memory] mtk_cam_mem: Allocated 1024KB for preview buffer (ION heap) ``` ### 相机初始化日志格式特征 MTK平台相机日志采用分层标记格式: ```log [时间戳] [模块标签/日志级别] 消息内容 (关键参数) ``` **字段解析**: | 字段 | 示例值 | 说明 | |---------------|-------------------------|-----------------------------| | 时间戳 | `07-05 08:12:34.567` | 月-日 时:分:秒.毫秒 | | 模块标签 | `[HAL]`/`[DRV]` | 标识硬件层/驱动层/HAL层 | | 日志级别 | `INFO`/`ERR`/`PERF` | MTK扩展的错误/性能专用标记 | | 关键参数 | `(v2.1.3)`/`(API v3.4)` | 固件版本或接口规格 | ### 典型问题排查场景 1. **相机启动失败** 通过`ERR`标记定位错误源: ```log [ERR] mtk_cam_power: Failed to enable AVDD_2.8V (ret=-110) [HAL] ERROR: Camera 0 init failed at sensor power ``` 2. **性能瓶颈分析** 利用`PERF`日志优化启动速度: ```log [PERF] camera_startup: ISP_config (210ms) exceeds threshold 150ms! ``` 3. **兼容性问题** 检查HAL接口版本匹配: ```log [HAL] WARN: App requires API v3.5, device supports v3.4 ``` > **定位技巧**:在`CameraXActivity.java`中启用调试模式可获取更详细日志[^1]: > ```java > // src/main/java/net/sourceforge/opencamera/CameraXActivity.java > if (Build.MODEL.contains("mt8163")) { > System.setProperty("camera.debug.mtk_log", "2"); // 启用MTK详细日志 > } > ```
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值