目录

前言

抓取注意事项

dumping mask bit 定义

Andorid5/8 – HAL1 – 拍照 – RAW

调试 抓取拍照 RAW 图 Android9.0

Android9.0 – HAL1 – preview – RAW

操作步骤:

抓取的脚本:

相关的代码:

抓到的 RAW 图:

​        注意点:

Android9.0 – HAL1 - snapshot – RAW

操作步骤:

抓取脚本:

相关的代码:

抓到的 RAW 图:

注意点:

Android9.0 – HAL1 - video – RAW

Android9.0 另一种方式抓 snapshot raw 图

RAW 图裁剪参数 - 驱动配置

Android9.0 – HAL1 – preview – YUV

抓取步骤:

抓取的脚本:

相关的代码:

抓到的 YUV 图:

注意点:

Android9.0 – HAL1 - snapshot – YUV

抓取步骤:

抓取的脚本:

相关的代码:

抓到的 YUV 图:

注意点:

Android9.0 – HAL1 – video – YUV

抓取步骤:

抓取的脚本:

抓到的 YUV 图:

相关的代码:

注意点:

Android9.0 – HAL3 – Callback – YUV

抓取步骤:

抓取脚本:

相关的代码:

抓到的 YUV 图:

​注意点:

Android9.0 dump Metadata

dump 属性配置

dump 路径文件和函数定义:

雪山千古冷,独照峨嵋峰


前言

简述Qcom 平台,抓取raw图、YUV图的抓取方式,和相关的代码流程。

旨在camera sensor存在比较明显的效果问题的时候,判断问题出在哪个环节。

Note:

抓取 RAW或 YUV图之前需要先确认当前Android版本和Camera APP使用的是哪种HAL接口。

HAL1或HAL3,在HAL层中 camera的这部分差异较大,实现流程不同,需要注意。

参考文档 :

kba-161204073328_2_how_to_dump_camera_image_buffer.pdf

抓取raw图的文件路径和代码:

【HAL1】 代码位置:

  • HAL1 接口位置

8953_APP_P\hardware\qcom\camera\QCamera2\HAL\QCamera2HWI.cpp

  • HAL1 回调函数位置

8953_APP_P\hardware\qcom\camera\QCamera2\HAL\QCamera2HWICallbacks.cpp

  • HAL1 dump 函数

void QCamera2HardwareInterface::dumpFrameToFile

  • HAL1 dump 属性
  • HAL1 dump JPEG 图

hardware/qcom/camera/QCamera2/HAL/QCamera2HWICallbacks.cpp:

2920:    property_get("persist.vendor.camera.dumpimg", value, "0");

  • HAL1 dump YUV 图

hardware/qcom/camera/QCamera2/HAL/QCamera2HWICallbacks.cpp:

3097:    property_get("persist.vendor.camera.dumpimg", value, "0");

【HAL3】 代码位置:

  • HAL3 接口位置

hardware\qcom\camera\QCamera2\HAL3\QCamera3HWI.cpp

  • HAL3 回调函数位置

hardware\qcom\camera\QCamera2\HAL3\QCamera3Channel.cpp

  • HAL3 dump 函数

void QCamera3Channel::dumpYUV(...)

  • HAL3 dump 属性

property_get("persist.vendor.camera.dumpimg", prop, "0");

  • HAL3 dump YUV 图

hardware/qcom/camera/QCamera2/HAL3/QCamera3Channel.cpp:

542:    property_get("persist.vendor.camera.dumpimg", prop, "0");

抓取注意事项

HAL 架构问题

  • 首先要注意抓取的 Camera APP 使用的HAL1 还是 HAL3 架构
  • 因为不同 hal 架构,所需要的抓取命令不同

数据流的时效性问题:

要抓取的这路流什么时候存在,是打开相机就存在还是需要触发才出现,

  • preview:预览数据流, 打开相机预览流就开始启动了。打开相机触发。[常开流]
  • video:录像数据流, 只有开启录像,这路流才存在。开启录像触发。[触发流]
  • metadata:元数据配置流, 每个 Capture 都会伴随一个 metadata 流。[待补充]
  • snapshot:拍照数据流, 只有拍照动作才会存在这路流。拍照触发。[触发流]
  • callback:Google Camera2 相机存在这路流,请用这个App进行测试。[待补充]
  • 以上基线代码默认配置的流。其他新增的流,要和APP开发人员确认什么时候流存在。

dumping mask bit 定义

参数解释:

/*** 参数解释:* adb shell setprop persist.vendor.camera.dumpimg 16711696 * 16711696 converted to hexadecimal is 0xFF0010 .* Bit-16 to bit-23 specifies how many frames to dump; default is 10.* Bit-8 to bit-15 specifies how many frames to skip during dumping; default is no skip.
// 每两帧之间的帧数间隔,如跳10帧,抓10帧:抓到的就是 第12、22、至102等10帧。
// 驱动设置isp跳2帧,即从 02 帧算第一帧。* Bit-0 to bit-7 need to be set, corresponding to flags:* QCAMERA_DUMP_FRM_PREVIEW –0x1* QCAMERA_DUMP_FRM_VIDEO –0x2* QCAMERA_DUMP_FRM_SNAPSHOT  –0x4* QCAMERA_DUMP_FRM_THUMBNAIL –0x8* QCAMERA_DUMP_FRM_RAW –0x10  // dump raw image set to 0x10* QCAMERA_DUMP_FRM_JPEG –0x20* * So when we set persist.vendor.camera.dumpimg to 16711696* It’s means we want to dump 255 frame, no skip during dumping, dump raw image.*/

Andorid5/8 – HAL1 – 拍照 – RAW

进入 camera app 专业模式。

  1. 打开相机,点击右上角设置按钮,, 连续点击 ‘连续拍照按钮”(Continuous Shot), 进入专业模式。
  2. 退出,然后重新进入设置。(会发现多了许多选项)。
  3. 关闭 zsl 、Auto HDR。
  4. 修改图片格式为BayerQ10BGGR。Select Picture Format --> BayerM10RGGB 等。
  5. 拍照,相册中会出现灰色的RAW文件。
  6. pull 文件。adb pull sdcard/DCIM/Camera/raw

调试 抓取拍照 RAW 图 Android9.0

进入 camera app 专业模式

1. 打开相机,右上角 设置按钮点开, 连续点击 红眼消除(Redeye Reduction), 进入专业模式

2. 关闭 zsl Auto HDR

3. 选择 照片格式 Select Picture Format --> BayerM10RGGB 等

4. 拍照

5. pull 文件  adb pull sdcard/DCIM/Camera/raw

Android9.0 – HAL1 – preview – RAW

操作步骤:

1.  修改的 data 目录权限

adb shell chmod 777 /data/vendor/camera

2. 打开 dump raw 图功能

adb shell setprop persist.vendor.camera.raw_yuv 1

3. 打开 dump preview raw 图功能

adb shell setprop persist.vendor.camera.preview_raw 1

4. 设置 dumping 命令

:: Dump preview RAW , [Qcom App], QCAMERA_DUMP_FRM_RAW –0x10
:: 0x0A0A10 [0A] 抓取 10 帧  [0A]跳过 10 帧 [10]抓取 preview RAW
adb shell setprop persist.vendor.camera.dumpimg 657936 2. 

5.  打开 Qcom Camera App 进行预览

6. pull preview raw 图

adb pull /data/vendor/camera/

抓取的脚本:

[待上传...]

相关的代码:

第一步,打开dump raw 功能

文件路径:

hardware\qcom\camera\QCamera2\HAL\QCamera2HWI.cpp

调用函数:

int32_t QCamera2HardwareInterface::addPreviewChannel() 

调用位置:

    property_get("persist.vendor.camera.raw_yuv", value, "0");raw_yuv = atoi(value) > 0 ? true : false;if ( raw_yuv ) {rc = addStreamToChannel(pChannel,CAM_STREAM_TYPE_RAW,preview_raw_stream_cb_routine,this);...}

第二步,打开preview raw 功能

文件路径:

hardware\qcom\camera\QCamera2\HAL\QCamera2HWICallbacks.cpp

调用函数:

void QCamera2HardwareInterface::preview_raw_stream_cb_routine

调用位置:

    if (raw_frame != NULL) {property_get("persist.vendor.camera.preview_raw", value, "0");dump_preview_raw = atoi(value) > 0 ? true : false;property_get("persist.vendor.camera.video_raw", value, "0");dump_video_raw = atoi(value) > 0 ? true : false;if (dump_preview_raw || (pme->mParameters.getRecordingHintValue()&& dump_video_raw)) {pme->dumpFrameToFile(stream, raw_frame, QCAMERA_DUMP_FRM_RAW);}stream->bufDone(raw_frame->buf_idx);}

第三步, 设置dumping 功能

文件路径:

hardware\qcom\camera\QCamera2\HAL\QCamera2HWICallbacks.cpp

调用函数:

void QCamera2HardwareInterface::dumpFrameToFile

调用位置:

case QCAMERA_DUMP_FRM_RAW:{mParameters.getStreamDimension(CAM_STREAM_TYPE_RAW, dim);snprintf(buf, sizeof(buf), "%dr_%dx%d_%d.raw",dumpFrmCnt, dim.width, dim.height, frame->frame_idx);}break;

抓到的 RAW 图:

注意点:

  • 使用 Qcom Camera APP 进行拍照

Android9.0 – HAL1 - snapshot – RAW

操作步骤:

1.  修改 data 目录权限

adb shell chmod 777 /data/vendor/camera

2. 打开 dump raw 功能

adb shell setprop persist.vendor.camera.raw_yuv 1

3. 打开 dump snapshot 功能

adb shell setprop persist. vendor.camera.snapshot_raw 1

4. 设置 dumpling 命令

:: Dump snapshot RAW , [Qcom App], QCAMERA_DUMP_FRM_RAW –0x10
:: 0x0A0010 [0A] 抓取 10 帧  [00]跳过 0 帧 [10]抓取 snapshot RAW
adb shell setprop persist.vendor.camera.dumpimg 655376

5. 打开 Qcom Camera App 点击拍照

6. pull snapshot raw 图

adb pull data/vendor/camera/

抓取脚本:

[待补充。。。]

相关的代码:

第一步,打开dump raw 功能

文件路径:

hardware\qcom\camera\QCamera2\HAL\QCamera2HWI.cpp

调用函数:

int32_t QCamera2HardwareInterface::addCaptureChannel()

调用位置:

    property_get("persist.vendor.camera.raw_yuv", value, "0");raw_yuv = atoi(value) > 0 ? true : false;if (raw_yuv) {stream_cb = snapshot_raw_stream_cb_routine;}

第二步,打开snapshot raw 功能

文件路径:

hardware\qcom\camera\QCamera2\HAL\QCamera2HWICallbacks.cpp

调用函数:

void QCamera2HardwareInterface::snapshot_raw_stream_cb_routine

调用位置:

    property_get("persist.vendor.camera.snapshot_raw", value, "0");dump_raw = atoi(value) > 0 ? true : false;for (uint32_t i = 0; i < super_frame->num_bufs; i++) {if (super_frame->bufs[i]->stream_type == CAM_STREAM_TYPE_RAW) {mm_camera_buf_def_t * raw_frame = super_frame->bufs[i];if (NULL != stream) {if (dump_raw) {pme->dumpFrameToFile(stream, raw_frame, QCAMERA_DUMP_FRM_RAW);。。。

第三步, 设置dumping 功能

文件路径:

hardware\qcom\camera\QCamera2\HAL\QCamera2HWICallbacks.cpp

调用函数:

void QCamera2HardwareInterface::dumpFrameToFile

调用位置:

case QCAMERA_DUMP_FRM_RAW:
{mParameters.getStreamDimension(CAM_STREAM_TYPE_RAW, dim);snprintf(buf, sizeof(buf), "%dr_%dx%d_%d.raw",dumpFrmCnt, dim.width, dim.height, frame->frame_idx);
}
break;

抓到的 RAW 图:

注意点:

  • 使用 Qcom Camera App 进行拍照

Android9.0 – HAL1 - video – RAW

  • 抓取命令和设置步骤和 preview raw 步骤一样,在代码中流程是一样的。
  • 只需要打开Qcom Camera2 App ,切换到录像模式即可。

文件路径:

hardware\qcom\camera\QCamera2\HAL\QCamera2HWICallbacks.cpp

调用位置:

void QCamera2HardwareInterface::preview_raw_stream_cb_routine

代码实现:

    if (raw_frame != NULL) {property_get("persist.vendor.camera.preview_raw", value, "0");dump_preview_raw = atoi(value) > 0 ? true : false;property_get("persist.vendor.camera.video_raw", value, "0");dump_video_raw = atoi(value) > 0 ? true : false;if (dump_preview_raw || (pme->mParameters.getRecordingHintValue()&& dump_video_raw)) {pme->dumpFrameToFile(stream, raw_frame, QCAMERA_DUMP_FRM_RAW);}stream->bufDone(raw_frame->buf_idx);}free(super_frame);

Android9.0 另一种方式抓 snapshot raw 图

进入 Qcom Camera App 专业模式

  1. 打开相机右上角设置按钮, 连续点击, 红眼消除(Redeye Reduction), 进入专业模式
  2. 关闭 zsl、 Auto HDR
  3. 选择照片格式为 Select Picture Format --> BayerM10RGGB
  4. 点击拍照
  5. pull 文件 adb pull sdcard/DCIM/Camera/raw

RAW 图裁剪参数 - 驱动配置

代码如:

prj_name:/data/vendor/camera # ls
202011261707540r_1948x1080_9.raw // 原本是 1952x1080

与驱动关系:

调整下面参数会影响 raw 的尺寸

  .crop_params_array ={.crop_params ={/* Res 0 */{.top_crop = 0,.bottom_crop = 0,.left_crop = 4,.right_crop = 0,},

Android9.0 – HAL1 – preview – YUV

抓取步骤:

1. 修改 data 目录权限

adb shell chmod 777 /data/vendor/camera

2. 设置抓取预览YUV图(preview-yuv),跳10帧, 抓10帧

:: 0x0A0A01  [0A]抓取 10 帧  [64]跳过 10 帧 [01] QCAMERA_DUMP_FRM_PREVIEW
:: 拍照的话, 就算设置抓取8帧,每次拍照也只会抓取一帧
:: 每两帧之间的帧数间隔,如跳 10 帧,抓 10 帧:抓到的就是 第12、22、一直到 102 帧。
:: 驱动设置 isp 跳 2 帧,即从第3帧算第一帧。
adb shell setprop persist.vendor.camera.dumpimg  657921

3. 打开qcom 相机 预览

4. pull 预览 yuv 图片

adb pull data/vendor/camera/

抓取的脚本:

[待补充。。。]

相关的代码:

文件位置:

hardware\qcom\camera\QCamera2\HAL\QCamera2HWICallbacks.cpp

调用位置:

void QCamera2HardwareInterface::preview_stream_cb_routine
=======>
// Dump preview frames
if (memory->isBufActive(dequeuedIdx)) {
dumpBuffer = stream->getBuffer(dequeuedIdx);
pme->dumpFrameToFile(stream, dumpBuffer, QCAMERA_DUMP_FRM_PREVIEW);

抓到的 YUV 图:

注意点:

  • 根据不同设备的LCD分辨率的不同,系统会设置不同分辨率的预览尺寸。
  • 这里使用M11 机器LCD分辨率,320x240, dump 的yuv 尺寸为640x360 。

Android9.0 – HAL1 - snapshot – YUV

抓取步骤:

1. 修改 data 目录权限

 adb  shell  chmod  777  /data/vendor/camera

2. 设置抓取拍照YUV命令,跳0帧,抓1帧

// 524292 == 0x80004  QCAMERA_DUMP_FRM_SNAPSHOT –0x4
:: 0x080004  [0A]抓取 8帧  [00]跳过 00 帧 [04]抓取 snapshot [已经验证 ok]
adb shell setprop persist.vendor.camera.dumpimg 524292

3. 打开高通相机APP,拍照

4. pull yuv 图

adb pull data/vendor/camera/

抓取的脚本:

[待补充。。。]

相关的代码:

文件路径:

hardware\qcom\camera\QCamera2\HAL\QCameraPostProc.cpp  // 2418

调用位置:

// dump snapshot frame if enabled
m_parent->dumpFrameToFile(main_stream, main_frame,QCAMERA_DUMP_FRM_INPUT_JPEG, (char *)"CPP");

抓到的 YUV 图:

注意点:

  • 在拍照 yuv 中,就算设置抓取 8 帧,每次拍照也只会抓取一帧 [这里拍照了两次]

Android9.0 – HAL1 – video – YUV

抓取步骤:

1. 修改 data 目录的权限

adb shell chmod 777 /data/vendor/camera

2. 执行抓取 video yuv 的命令

:: dump hal1 video yuv 10 帧,打开 qcom app 相机, 开启录像
:: 0x0A0002  [0A]抓取 10 帧  [00]跳过 00 帧 [02]抓取 video yuv
:: 如果是拍照的,就算设置抓取 10 帧,每次拍照也只会抓取一帧
adb shell setprop persist.vendor.camera.dumpimg 655362

3.  打开 qcom app, 开始录像

4.  dump video yuv 图像

adb pull data/vendor/camera 

抓取的脚本:

[待补充。。。]

抓到的 YUV 图:

相关的代码:

文件路径:

hardware\qcom\camera\QCamera2\HAL\QCamera2HWICallbacks.cpp

调用函数:

void QCamera2HardwareInterface::video_stream_cb_routine

调用位置:

}  else {
//Handle video batch callback
native_handle_t *nh = NULL;
pme->dumpFrameToFile(stream, frame, QCAMERA_DUMP_FRM_VIDEO);

注意点:

暂无

Android9.0 – HAL3 – Callback – YUV

抓取步骤:

修改权限

adb shell chmod 777 /data/vendor/camera

设置 duping mask

:: 0x0A6408  [0A]抓取 10 帧  [64]跳过 100 帧 [08]抓取 callback

adb shell setprop persist.vendor.camera.dumpimg  680968

查看 camera 相关的系统属性

:: 查看 camera 相关的系统属性

adb shell getprop | find "camera"

打开 camera 2相机

pull yuv 帧

adb pull /data/vendor/camera

抓取脚本:

[待补充。。。]

相关的代码:

文件位置:

hardware\qcom\camera\QCamera2\HAL3\QCamera3Channel.cpp

调用函数:

void QCamera3ProcessingChannel::streamCbRoutine

调用位置:

  } else if (stream->getMyType() == CAM_STREAM_TYPE_CALLBACK) {dumpYUV(super_frame->bufs[0], dim, offset, QCAMERA_DUMP_FRM_CALLBACK);

抓到的 YUV 图:

注意点:

  • 要使用Google Camera2相机,这个相机使用HAL3架构,且具有callback 流。

Android9.0 dump Metadata

参考文档:

80-NL239-33SC_LINUX CAMERA DEBUGGING GUIDE (SIMPLIFIED CHINESE-ONLY).pdf

章节:2.3.4

dump 属性配置

adb shell setprop persist.vendor.camera.dumpmetadata 1

dump 路径文件和函数定义:

hardware\qcom\camera\QCamera2\HAL3\QCamera3HWI.cpp

void QCamera3HardwareInterface::dumpMetadataToFile(tuning_params_t &meta,uint32_t &dumpFrameCount,bool enabled,const char *type,uint32_t frameNumber)

dumo 函数调用:

handleMetadataWithLock  ->
dumpMetadataToFile(*tuning_ptr,mMetaFrameCount,enabled, "Snapshot",frame_number);

默认dump 拍照(snapshot) metadata

property_get("persist.vendor.camera.dumpmetadata", prop, "0");
dumpMetadataToFile(*tuning_ptr,mMetaFrameCount,enabled, "Snapshot",frame_number);

默认dump 路径:

#define QCAMERA_DUMP_FRM_LOCATION "/data/vendor/camera/"

Demo:

雪山千古冷,独照峨嵋峰

Qcom 平台 camera 之 RAW+YUV图抓取相关推荐

  1. android camera2 qcom,Qcom平台 camera的一些知识点 之RAW图抓取

    前言 介绍camera sensor 输出的 raw 图,用于验证cam显示效果问题. 参考文档 : KBA-161204073328 目录 的 mask bit 定义 参数解释: /** * 参数解 ...

  2. Qcom平台 Camera 之开启调试 log

    本文是针对Android5.1.8.1.9.0版本的camera调试,log相关的配置做一个记录.如有错误,请交流指正. 调试 打开 kernel cam log 用于观察上电时序,match_id ...

  3. python爬虫妹子图抓取

    python爬虫妹子图抓取 目标网址:图片地址 我的github地址:超链接 可以自行感受一下,我就不说了,重点是学习代码,不是图片 #! /usr/bin/python3 # -*- coding: ...

  4. Qcom平台 Camera 之调试单刷验证

    前言 由于调试camera 过程中,遇到的问题琐碎繁杂,在此将已经掌握和常用的调试技巧和一些知识点罗列出来,便于快速的开发调试camera. 平台包含msm8909.msm8953,软件平台包含And ...

  5. Qcom平台 Camera 之单刷调试

    前言 有关Android 平台 camera 调试的一些知识点,有助于调试验证. 目录 一些知识点 调试 vendor 镜像问题 调试 device-vendor.mk 调试 msm8953_came ...

  6. android camera2 qcom,Qcom平台 Camera的一些知识点 之MCLK

    前言 MCLK 是平台 baseband 提供给 cam sensor的正常工作的频率, Qcom 平台一般未24MHz,由其他时钟源分频而来,实测在23.8MHz左右. 在打开相机的时候,才可以测到 ...

  7. 在vue中应用ueditor引入秀米,支持图片以及背景图抓取

    当前系统中引入的是jsp的ueditor,如果你们也是使用这个,前端可以直接使用我这边配置好的,至于后端的需要开发人员自己配置,当前支持: 秀米保存后图片自动抓取(包括背景图) ueditor插入视频 ...

  8. 360站长平台提交站点地图sitemap.xml抓取的url数量为0的解决方法

    解决方法一:不要提交https的sitemap,提交http的即可成功 解决方法二:如果提交http的还没有成功,请检查自己的sitemap.xml格式是否是UTF-8的,不是换成UTF-8即可成功 ...

  9. java平台利用jsoup开发包,抓取优酷视频播放地址与图片地址等信息。

    /********************************************************************************************  * aut ...

  10. python 妹子图抓取

    1.效果图 2.源码 import requests from lxml import etree# 设计模式 -->面向对象编程 class Spider(object):def __init ...

最新文章

  1. 使用Vue的filters(本地)或filter(全局)过滤常用数据类型
  2. Java Stack栈类详解
  3. 1.VMwareTools的安装,vmware启动的时候,虚拟机黑屏,解决办法
  4. html dom 替换节点,从javascript dom文本节点替换
  5. java 求数组最大子序列之和
  6. vml的简易画板_2
  7. 前端之 jQuery 入门
  8. NAACL’21 | 来看如何让模型学会因为所以但是如果
  9. MTK:UART串口收发数据
  10. anaconda 换源_Anaconda下安装tensorflow1.15过程记录
  11. python zen_The Zen of Python
  12. java 汉字处理_Java汉字处理
  13. 《实战 Java 高并发程序设计》笔记——第1章 走入并行世界(一)
  14. matlab相邻数据求差,matlab中求矩阵的本身相邻元素的波动标准差
  15. Proteus添加新的元件库
  16. [其他] ATI HD6630M 显卡在Win10下终于有救了(DEll 14R N4120)
  17. 工行银企互联接入详解(1)--流程说明
  18. error2203matlab,小编详解Win10安装MATLAB软件提示Internal error 2203的解决方法
  19. 大数值金额大写转换(C语言)
  20. visual studio mfc 界面 布局调整

热门文章

  1. WPS的文档上云 是中国式服务的胜利
  2. Tarjan 算法解决 LCA 问题
  3. JLINK驱动版本更换
  4. Navicat Premium 15 激活后打开就会无响应,或者崩溃,自动退出,没有任何提示,有时候会说未响应
  5. U盘之家工具包 V1.4
  6. 在Yandex浏览器中添加谷歌插件
  7. springboot 代码自动生成器
  8. jeecg-boot自动生成代码_代码一键自动生成,拿走不谢
  9. 基于微信小程序的比赛报名系统
  10. 基于taskctl实现kettle任务调度