P2StreamingNode 介绍
P 版 Hal3 上,Streaming 相关的 flow(比如 preview, video record, VSS, EIS 等) 主要由 P2StreamingNode 以及这个 node 下各sub module来实现。
P2StreamingNode 是 Pipeline 中的一个 HwNode ,功能类似于旧架构中的 P2FreatureNode 。
接下来提到的 P2S 简写实际就是指 P2StreamingNode 以及这个 node 下各sub module 。
1. P2S Architecture
-
P2S 整个架构分4层。其中的 SFP 是 StreamingFeaturePipe 的缩写。
-
SFP Node 是 SFP 下的各个 node。request 传到 SFP 后,SFP 会往下丢到 SFP Node 处理。
-
SFP Node 的 flow 总是从 RootNode 开始,中间根据不同的处理需求,流经各个不同的node 处理,最终都会流到 HelperNode 处理。
-
HelperNode 会将处理结果 callback 回 StreamingProcessor。
-
TPINode 是用于挂载三方算法的 Node。
2. P2S 每一层作用以及相关封装的类
IPipelineFrame 被 queue 到 P2S 后,会经过一层一层的封装和处理,最终传到 SFP 中被各个 node 处理。
注:
这里没有将 StreamingFeaturePipe 下的各个node 画出来, StreamingFeaturePipe 就代表了整个 SFP module(包含了 SFP Node) 。
3. SFP Node flow for Preview/Recording/VSS
各个场景下的 SFP Node flow:
(1). normal preview/Recording:
RootNode -> P2ANode -> P2AMDPNode -> HelperNode
其中: P2ANode 做 Raw 转YUV 。 Bypass P2AMDPNode 。
每一个 streaming flow 里都会有这个 node flow, 只是有的 flow 会根据情况 bypass 这个 node flow。
(2). AP 要求有 preview callback 或 VSS 时:
RootNode -> P2ANode -> P2AMDPNode -> HelperNode
其中: P2AMDPNode -- 有一出多作用,可以出多路 YUV buffer。如果没有走 TPINode和 VendorMDPNode,且要出多于2路的 YUV buffer,则 P2ANode只出其中任意2路 YUV buffer, 其他的几路YUV buffer就由 P2AMDPNode 去出。
(3). Recording(开EIS,且无三方算法) 时:
RootNode -> P2ANode -> EISNode -> WarpNode -> HelperNode
P2ANode -> WarpNode
其中: P2ANode 做Raw转YUV 并出 display 。
P2ANode 将 YUV buffer 给到 WarpNode , 并通知 EISNode 可以进行 warp map 计算。
WarpNode 收到 EISNode 计算出的 warp map 以及 P2ANode 传过来的 YUV buffer 后,做 crop 计算。最后 call 到 hw 做真正的 crop。 WarpNode 最终会出 有 EIS 效果的 record 。
(4). Preview(有三方算法) 时:
RootNode -> P2ANode -> TPINode(有几个preview相关的三方算法,就有几个Node) -> VendorMDPNode -> HelperNode
其中: TPINode 是三方算法挂载点。最多有3个。
P2ANode 只负责Raw转YUV,并只出一张 YUV buffer,流经 TPINode,最后给到 VendorMDPNode。
VendorMDPNode 有一出多的作用,需要出所有的YUV buffer。
(5). Recording(不开EIS, 有三方算法)/VSS 时:
RootNode -> P2ANode -> TPINode(接几个 preview 的三方算法,就有几个node) -> VendorMDPNode -> HelperNode
其中: P2ANode 只负责 Raw转YUV ,VendorMDPNode 应该出 display/record/vss 。
(6). Recording(开 EIS,且有三方算法) 时:
RootNode -> P2ANode -> TPINode(可以是多个) -> VendorMDPNode -> WarpNode -> HelperNode
VendorMDPNode -> HelperNode
P2ANode -> EISNode -> WarpNode
其中: VendorMDPNode : 应该出 display/vss/以及用于流到 WarpNode 的 working buffer。
WarpNode : 出有 EIS 效果的 record 。
4. P2S Debug 开关
(1). 如果要开 P2S 所有 module 的 log 开关,则下:
adb shell setprop vendor.debug.trace.p2 1
or
adb shell setprop persist.vendor.trace.p2 1
(2). 如果要开 P2S 中某一个 module 的 log 开关,则下:
adb shell setprop vendor.debug.trace.p2.(P2_CLASS_TAG) 1
or
adb shell setprop persist.vendor.trace.p2.(P2_CLASS_TAG) 1
其中:
P2_CLASS_TAG 对应的是各个 module 的.cpp 文件中定义的宏值。
比如:
如果只要开 MWFrame 的 log 时,要下如下 adb 命令:
adb shell setprop vendor.debug.trace.p2.MWFrame 1
or
adb shell setprop persist.vendor.trace.p2.(MWFrame) 1
5. P2S 各 module 的 LOG TAG
-
StreamingNode : MtkCam/P2/StreamingNode
-
DispatchProcessor : MtkCam/P2/DispatchProcessor
-
StreamingProcessor : MtkCam/P2/StreamingProcessor
-
StreamingFeaturePipe : MtkCam/StreamingPipe
6. P2S dump buffer
P2S buffer dump 有两种 dump 方式,一种是 NDD dump,一种是 debug dump 。
NDD 是 Normal Data Dump 的缩写。
NDD dump 是比较常用的 dump 方式。
1. NDD dump :
adb root
adb shell rm -rf /data/vendor/camera_dump/*
adb shell setprop "vendor.debug.p2f.dump.enable" 1
adb shell setprop "vendor.debug.p2f.dump.mode" 1
进入 camera, 需要开始 dump 时, 请下adb 命令:
adb shell setprop "vendor.debug.camera.preview.dump" 1
需要停止 dump 时,请下 adb 命令:
adb shell setprop "vendor.debug.camera.preview.dump"