一、自定义Node的核心步骤
1. 创建Node代码
-
路径规范:
自定义Node代码需放置在chi-cdk/oem/qcom/node/
目录下,可参考现有Node(如MemCpyNode
)结构编写1。 -
代码结构:
-
继承
ChiNode
基类,实现ExecuteProcessRequest
等核心方法。 -
定义输入/输出端口数量、Buffer格式支持(如RAW、YUV等)。
-
示例:添加水印功能的Node需在
ExecuteProcessRequest
中实现像素叠加逻辑5。
-
2. 修改构建配置
-
Android.mk文件:
在Node目录的build/android/Android.mk
中修改LOCAL_MODULE
为自定义名称(如com.qti.node.hitest
),并更新源文件引用1。 -
全局注册:
在chi-cdk/oem/Android.mk
中添加新Node的构建路径,确保编译时包含该模块1。
3. 注册Node到CamX
-
XML配置:
在Usecase的XML文件中声明Node,例如:<NodesList> <Node NodeId="255" NodeInstance="HitestNode" NodeType="SW" MaxInputPorts="1" MaxOutputPorts="1" /> </NodesList>
运行 HTML
-
NodeId必须为255(自定义Node的保留标识),硬件Node(如IFE、IPE)使用预定义ID(如IFE=65536)6。
-
-
端口连接:
在PortLinkages
中定义输入输出关系,确保Buffer格式一致(如RAW10
到RAW10
)7。
4. 集成到Pipeline
-
Usecase配置:
在对应的Usecase XML(如camxUsecaseZSL.xml
)中添加对新Pipeline的引用:<CamxInclude>PipelineCustomHitest.xml</CamxInclude>
运行 HTML
-
目标流映射:
在Targets
中定义输出目标(如TARGET_BUFFER_YUV_OUT
),并在代码中通过TargetStreamMap
关联数据流7。
二、调试与验证
1. 日志输出
-
开启调试日志:设置系统属性
persist.vendor.camera.logInfoMask=0x3FF
,观察Node处理流程及数据链路7。 -
关键日志示例:
CamX: [INFO][CORE] Node:HitestNode:0 Processing input port 0 CamX: [ERROR][CORE] Buffer format mismatch at SinkPort 1 (Expected YUV420, Actual RAW10)
2. 工具验证
-
使用
camxhal3test
工具测试Node功能:adb shell camxhal3test -usecase zsl -pipeline PipelineCustomHitest
三、实际案例参考
-
水印添加Node 5
-
方式二:将水印处理封装为独立Node,在Usecase XML中插入到IFE和BPS之间。
-
代码逻辑:在
camxnode.cpp
中修改像素数据,需注意字节对齐问题(如YUV420的宽度需为偶数)。
-
-
多帧降噪(MFNR)Node 3
-
输入:从上游Feature获取多帧P010格式数据。
-
处理:运行降噪算法,输出单帧YUV数据到下游Feature。
-
四、常见问题与注意事项
问题类型 | 解决方法与注意事项 |
---|---|
NodeId冲突 | 自定义Node必须使用ID 255,禁止与预定义硬件Node(如IFE=65536)重复6。 |
端口不匹配 | 检查输入/输出端口的Buffer格式(如RAW10 vs YUV420 )及分辨率是否一致。 |
编译失败 | 确保所有代码文件命名替换彻底(如全局替换MemCpy 为Hitest )1。 |
数据流中断 | 验证XML中PortLinkages 的连接顺序,禁止形成环形链路(需为有向无环图)7。 |