0
点赞
收藏
分享

微信扫一扫

【MTK EIS】

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如下图,
  1. RootNode将raw buffer 送给P2A
  2. P2A将row buffer转换为full img 的yuv,然后分3条流,一条给EISNode,一条给WarpNode,一条给Display
  3. EISNode中的算法会将计算出的warp信息送给warpNode,结合来自p2a的full img,将结果输出到record
  4. display&record的数据都流进HelperNode回传至StreamProcessor
    在这里插入图片描述
  • Normal display/Recording/EIS3.0/3rd (有3rd party algo)
    当同时有EIS和三方算法时,由VendorMDPNode出一块full img给WarpNode,再出一块给display
    在这里插入图片描述
    如下图是EIS flow的具体要经过的node及data的传输。
    1. P2A用于Row转yuv,输出full img;
    2. EIS node 等待RSCMV 和request数据,从request中抽取timestamp,img size等信息,作为gyro lib/eis lib 的配置参数;
    3. EIS Algo接收gyro/eis lib param,RSCMV gyro data,通过计算处理,输出display/record warp map 到warpNode
    4. 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);

举报

相关推荐

0 条评论