在4.0之前调试Camera HDI时,如果要dump出各节点的数据时,需要自己在代码去埋点dump出来,在4.0开始,Camera HDI中新增了CameraDumper功能,可读取 dump 配置文件,根据配置的开关,dump camera 的各个节点的图片信息、metadata 数据。更方便的定位问题。

1.开启方式

目前有2种方式来开启CameraDumper功能:

  • 使用源代码编译方式
  • 使用命令加推配置文件方式

在RK3568上,已经在各关键点上添加了dump,推荐使用命令和推配置文件的方式。适配的其它板子,可以参考drivers/peripheral中的方式,将CodecNode,ScaleNode等node也增加dump。

注意:

dump功能默认是关闭的。
dump出来的数据保存路径:**/data/local/tmp/** 。
正常情况下 camera_host 是写不了这个路径的,需要 hdc 进到 shell 里更改权限:

hdc shell mount -o rw,remount /data
hdc shell chmod 777 /data/local/tmp/ -R

2.源代码编译方式

2.1.开启功能开关

dump功能代码路径:drivers/peripheral/camera/vdi_base/common/dump/src/camera_dump.cpp
功能开关保存在 g_dumpInfoMap map中,修改对应的值为 true

std::map<DumpType, bool> g_dumpInfoMap = {
    {MedataType, true},
    {BufferType, true},
    {OpenType, true}
};
  • OpenType:为总开关,开启后其它的开关才会生效
  • MedataType:打开后会dump出camera当前的metadata数据
  • BufferType:打开后会dump出流数据(yuv,h264等)

2.2.开启流上的dump点

流上的dump开关在 g_dumpToolMap map中,修改对应的值为 true

std::map<std::string, std::string> g_dumpToolMap = {
    {ENABLE_DQ_BUFFER_DUMP, "true"},
    {ENABLE_UVC_NODE, "true"},
    {ENABLE_UVC_NODE_CONVERTED, "true"},
    {ENABLE_EXIF_NODE_CONVERTED, "true"},
    {ENABLE_FACE_NODE_CONVERTED, "true"},
    {ENABLE_FORK_NODE_CONVERTED, "true"},
    {ENABLE_RKFACE_NODE_CONVERTED, "true"},
    {ENABLE_RKEXIF_NODE_CONVERTED, "true"},
    {ENABLE_CODEC_NODE_CONVERTED, "true"},
    {ENABLE_RKCODEC_NODE_CONVERTED, "true"},
    {ENABLE_STREAM_TUNNEL, "true"},
    {ENABLE_METADATA, "true"},
    {PREVIEW_INTERVAL, "1"},
    {CAPTURE_INTERVAL, "1"}
};
  • ENABLE* 相关是pipeline各node中的dump,可以选择指定的点开启
  • PREVIEW_INTERVAL/CAPTURE_INTERVAL 预览和录像时dump图的帧间隔,默认1表示每帧都dump

2.3.编译代码

上面的代码都修改好之后,可以全量编译,按需重烧镜像或推库都可以。

3.hidumper命令加推配置文件方式

3.1.命令介绍

目前命令支持以下几个参数:

  • -h 显示命令帮助
  • -m 开启metadata数据dump
  • -b 开启帧数据dump
  • -o 总开关,开启了后 -m -b 才生效
  • -e 关闭dump

3.2.配置文件

1.新建文件,命名为 dump.config
2.下面的字段对应代码里 g_dumpToolMap 中的开关,将需要dump的改为 true 后复制到 dump.config

enableDQBufDump=fasle
enableUVCNodeBufferDump=fasle
enableUVCNodeConvertedBufferDump=fasle
enableExifNodeConvertedBufferDump=fasle
enableFaceNodeConvertedBufferDump=fasle
enableForkNodeConvertedBufferDump=fasle
enableRKFaceNodeConvertedBufferDump=fasle
enableRKExifNodeConvertedBufferDump=fasle
enableCodecNodeConvertedBufferDump=fasle
enableRKCodecNodeConvertedBufferDump=fasle
enableSreamTunnelBufferDump=fasle
enableMetadataDump=fasle
previewInterval=1
captureInterval=1

3.将 dump.config 文件发送到开发板的 /data/local/tmp 目录:

hdc shell mount -o rw,remount /data
hdc file send dump.config /data/local/tmp/

3.3.使用方法

进入 shell

# hidumper -s 5100 -a '-host camera_host -o'
 set dump mode success!
# hidumper -s 5100 -a '-host camera_host -b'
 set dump mode success!
# hidumper -s 5100 -a '-host camera_host -m'
 set dump mode success!
#

开关都打开后,可以打开相机应用,预览或是录像一段时间,然后关掉相机。在 shell 里进到 /data/local/tmp/ 下:

# pwd
/data/local/tmp
#
#
# ls
1501927762871_capturesetting.meta
1501927764480_updatesetting.meta
1501927764523_capturesetting.meta
1501927764548_capturesetting.meta
BeforeFlushSurface_captureId[12]_streamId[1]_width[640]_height[480]_1501927769255.yuv  
DQBuffer_captureId[11]_streamId[1]_width[640]_height[480]_1501927763574.yuv            
DQBuffer_captureId[12]_streamId[1]_width[640]_height[480]_1501927768851.yuv            
board_RKCodecNode_captureId[11]_streamId[1]_width[640]_height[480]_1501927763095.yuv   
debugserver
dump.config
dumpVideo.h264
#

已经dump出meta数据,各个node的yuv数据,以及h264数据。可以用 hdc 工具把文件都拉出来在pc上用对应工具查看效果。

4.添加新的dump开关

1.在头文件 drivers/peripheral/camera/vdi_base/common/dump/include/camera_dump.h 中添加开关。

......
const std::string ENABLE_TEST_DUMP = "enableTestDump";    // 新增开关
const std::string ENABLE_DQ_BUFFER_DUMP = "enableDQBufDump";
const std::string ENABLE_UVC_NODE = "enableUVCNodeBufferDump";
......

2.在实现文件 drivers/peripheral/camera/vdi_base/common/dump/src/camera_dump.cpp g_dumpToolMap 中添加开关。

......
std::map<std::string, std::string> g_dumpToolMap = {
    {ENABLE_TEST_DUMP, "false"},    // 新增开关
    {ENABLE_DQ_BUFFER_DUMP, "false"},
    {ENABLE_UVC_NODE, "false"},
    ......
};
......

3.在需要的dump点使用,其中 DumpBuffer 的第1个参数只是一个标签,会作为dump出的文件名的一部分,第2个参数就是上面增加的开关,第3个参数是要dump的buffer。

CameraDumper& dumper = CameraDumper::GetInstance();
dumper.DumpBuffer("TEST", ENABLE_TEST_DUMP, buffer);

4.在推 dump.config 的配置文件时,添加新的开关:

......
enableTestDump=false    // 新增开关
enableDQBufDump=fasle
enableUVCNodeBufferDump=fasle
enableUVCNodeConvertedBufferDump=fasle
......

5.编译烧镜像或是推库后,按上面的2种方式使用即可。

最后

1.注意点:

  • dump功能默认是关闭的。
  • dump出来的数据保存路径:**/data/local/tmp/** 。
  • 保存路径需要修改权限。
  • 有总开关和单项开关,总开关开了单项开关才生效。
  • 推荐使用命令和推配置文件的方式,不用对原代码进行修改。

2.文章是根据代码总结出来的,可能有些地方有误,如有发现请联系修正。

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐