MTK EIS
文章目录
P2S EIS 流程梳理
Android P之后,Hal3上的streaming相关的flow(preview、video recored、VSS、EIS等)主要由P2StreamingNode及这个node下面的各子node来实现,因此,要学习EIS flow,必先了解P2S的框架。如下图所示,整个p2s结构包含:
- 【接收者】P2StreamingNode:接收pipeline frame(来自p1node输出的row img) ,转换成MWFrame
- 【调派者】DispatchProcessor:根据接收到的不同数据,将任务分派给不同的处理者处理
- 【处理者1】Basic Processor:主要处理以下信息:
1. Debug 信息;
2. slow motion,120慢动作,直接与hw driver交互; - 【处理者2】Streaming Processor:主要处理一些streaming feature,如preview、record、eis、tp等
SFP 各Node的用途如下,粉色表硬件处理,绿色表软件处理,黄色为3方处理
连接
在预览启动的config阶段,FeatureSettingPolicy.cpp会决策当前场景需要用到哪些feature,然后,StreamingFeaturePipe会根据Feature创建SFP Node及各Node之间的连接方式。以video EIS场景为例,StreamingFeaturePipe的方法prepareNodeConnection()决定走EIS流程的SFP Node如何连接
MBOOL StreamingFeaturePipe::prepareNodeConnection()
{
...
// EIS nodes
if (mPipeUsage.supportEISNode())
{
//如果支持EIS Node,就把EIS接在RootNode后面
this->connectData(ID_ROOT_TO_EIS, mRootNode, mEIS);
if( mPipeUsage.supportWarpNode(SFN_HINT::PREVIEW) )
{
//如果当前是预览模式,就把WarpP接在EIS后面
this->connectData(ID_EIS_TO_WARP_P, mEIS, mWarpP, CONNECTION_SEQUENTIAL);
}
if( mPipeUsage.supportWarpNode(SFN_HINT::RECORD) )
{
//如果是record,就把wrapR接在EIS后面
this->connectData(ID_EIS_TO_WARP_R, mEIS, mWarpR, CONNECTION_SEQUENTIAL);
}
if( mPipeUsage.supportRSCNode() )
{
//如果支持RSC(Runtime Switchable Configuration):rsc->eis
this->connectData(ID_RSC_TO_EIS, mRSC, mEIS, CONNECTION_SEQUENTIAL);
}
}
...
}
- Normal display/Recording/EIS3.0 (无3rd party algo)
开启录像EIS后的flow如下图,
- RootNode将raw buffer 送给P2A
- P2A将row buffer转换为full img 的yuv,然后分3条流,一条给EISNode,一条给WarpNode,一条给Display
- EISNode中的算法会将计算出的warp信息送给warpNode,结合来自p2a的full img,将结果输出到record
- display&record的数据都流进HelperNode回传至StreamProcessor
- Normal display/Recording/EIS3.0/3rd (有3rd party algo)
当同时有EIS和三方算法时,由VendorMDPNode出一块full img给WarpNode,再出一块给display
如下图是EIS flow的具体要经过的node及data的传输。- P2A用于Row转yuv,输出full img;
- EIS node 等待RSCMV 和request数据,从request中抽取timestamp,img size等信息,作为gyro lib/eis lib 的配置参数;
- EIS Algo接收gyro/eis lib param,RSCMV gyro data,通过计算处理,输出display/record warp map 到warpNode
- warpNode针对display和record有不同处理
- 如果是display,会从p2a中获取最新的full img,和display warp map一起送到WPE中对display buffer进行warping,最后将结果callback 到app用于预览
- 如果是record,会直接从warpnode之前的record buffer缓存队列中获取full img,和record warp map一起送到WPE进行warping
eisNode: mtkcam3/feature/core/featurePipe/streaming/EISNode.cpp
eisHal: mtkcam3/feature/common/eis/eis_hal.cpp
实例化eis algo :EisHalImp::Init()–> m_pEisPlusAlg = MTKEisPlus::createInstance(&mEisPlusInitParam);