HiMPP媒体处理平台__1

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u011011827/article/details/54232434

海思平台

海思平台是一个板子和一个系统和若干驱动和mpp的结合.

板子可以是你自己做的,但是soc一定要选用海思平台支持的芯片.某些芯片也一定要选用海思支持的,像ADC/编解码芯片还有神马sensor之类的

系统包括BootLoader,内核,文件系统.都可以是你自己准备的.

若干驱动的话,大概是有mpp 的各个模块及及内存管理模块及AD驱动/NVP6114驱动

mpp的话,包括一些静态库和动态库和头文件


关于加载模块

himm命令来写寄存器,然后用insmod加载模块

用himm命令写的好像都是关于soc的里面的关于设备的寄存器,不知道具体写了什么东西


模块1:系统控制模块

总的来说,这个部分可以分为两个部分

  1. 视频缓存池
    1. 管理大块物理内存(???)
  2. 系统控制
    1. 复位硬件(怎么个意思?怎么才叫复位)
    2. 初始化硬件(怎么个意思)
    3. 其他模块的初始化(??释放资源)
    4. 其他模块的去初始化(???)
    5. 管理其他各模块的工作状态(??)
视频缓存池这里的话,分为两块

一个是针对输入通道,输入通道用的是公共缓存池

一个是针对编解码通道,编解码通道用的是独享缓存池

系统控制的话,分为多块,其中
一个是系统初始化
    系统初始化的话,要先HI_MPI_SYS_SetConf,再HI_MPI_SYS_Init,
    函数HI_MPI_SYS_SetConf有1参
        参数 : 使用图像的stride   字节对齐数
    函数HI_MPI_SYS_Init无参
一个是绑定
    绑定就像一个两通水管接头,函数为HI_MPI_SYS_Bind
    函数HI_MPI_SYS_Bind有2参
      参1为原通道信息
        模块类型(标识被绑定的模块是VI,还是VO,还是VPSS等)
        DevId(设备Id)(在一个芯片中,一个模块对应多个设备)
        ChnId(通道Id)(在一个芯片中,一个设备对应多个通道)
      参2为原通道信息
        模块类型
        DevId
        ChnId
注:
    在VPSS中没有设备的概念,有一个GROUP的概念,该概念等同于设备的概念
    所以在填充HI_MPI_SYS_Bind的参数的时候,参数1或参数2中的DevId可以填入GroupId
一个是时间戳
一个是映射接口
一个是设置寄存器
一个是分配内存

模块2:VI

之前提过,视频缓存池中的公共缓存池适应输入通道,输入通道就是VI里面的一个概念

传输流程

在传输的过程中,外来的线首先要接到VIU(概念0)的设备(概念1),经设备解复用,视频流进入设备中的通路(way),然后进入与way绑定的通道(概念2),然后进入公共缓存池(概念3)

  1. VIU ,一个VIU可能有N(根据芯片而定)个设备
  2. 设备,一个设备具有设备ID,一个设备有多个way(通路),每个通路有默认绑定(可以修改)的通道
  3. 通道,一个设备绑定N(根据芯片而定)个通道,在同道中可以裁剪/缩小/翻转/字符叠加
  4. 组,一个VIU中的设备和通道的组合叫做一个组
  5. 公共缓存池,公共缓存池在DDR中.
  6. DDR,高速缓存,位于soc中.

视频输入设备的时序

待填入

掩码

标识视频数据源的信息

级联

输出端输出BT1120时序传送到另一颗芯片的视频输入端

VI这块,大概分下面几块
1/使能设备(包括设置设备)
    函数有HI_MPI_VI_SetDevAttr和HI_MPI_VI_EnableDev
    函数HI_MPI_VI_SetDevAttr有两参
      参1为dev号(设备id)
      参2为结构体,标识属性
        au32CompMask数组,掩码,用来描述视频流信息
    函数HI_MPI_VI_EnableDev有一参
      参为dev号    
2/使能通道(次通道)(包括设置通道)
    函数有HI_MPI_VI_SetChnAttr和HI_MPI_VI_EnableChn
    函数HI_MPI_VI_SetChnAttr有两参
      参1为chn号(通道id)
      参2为结构体,标识属性
        stCapRect,结构体,捕获区域原始坐标与宽高
        stDestSize,结构体,目标宽高
        enPixFormat,像素存储格式
        s32SrcFrameRate,原始帧率
        s32FrameRate,目标帧率
    函数HI_MPI_VI_EnableChn有一参
      参为chn号
3/修改设备与通道之间的绑定(有默认绑定,部分芯片不支持修改)
    函数主要有HI_MPI_VI_ChnBind和HI_MPI_VI_GetChnBind
4/级联
    函数有HI_MPI_VI_EnableCascade和HI_MPI_VI_EnableCascadeChn

模块3:VO

VO模块会从内存相应位置(也就是从DDR中的公共视频缓存池)读取视频和图形数据,并通过相应(是怎么设置的?)的显示设备输出.

VO这块有几个层的概念

一个是视频层

一个是图形层

一个是鼠标层

视频层的话,只最多能有一层

图像层的话,也最多能有一层

鼠标层的话,也最多能有一层(可以为硬件鼠标层(api和图形层一致)或软件鼠标层(独立的api))

举例分析:

​ 对于Hi3520D,如果HD0设备上叠加了视频层,图形层G0(/dev/fb0),鼠标层G3(/dev/fb3),则显示顺序从最下面到最上面依次是视频层,图形层,鼠标层

VO分为两块

一个是输出到HD

​ 输出到HD的过程中存在图形层/视频层/PIP层/鼠标层的概念

​ 一个VO模块有多个HD输出设备

​ 一个HD输出设备有多个通道

​ 一个通道的属性中有优先级(决定该通道位于视频层还是PIP层)的概念

一个是输出到SD

​ 输出到SD的过程中不存在图形层/视频层/PIP层/鼠标层的概念,如果非要说有的话,那就是只有视频层一层

​ 一个VO模块有多个SD输出设备

​ 一个SD输出设备有多个通道

​ 一个通道的属性中有优先级(决定该通道在叠加时在上层还是在下层)的概念

这里面涉及到一个问题,那就是在显示器上显示的问题.

高清设备 的多通道只能由一通道显示在显示器中.(PIP叠加也属于一个通道)

​ 不能将多个通道的画面缩小成小画面然后叠加其他通道的小画面,合成一个画面显示在显示器中.

标清设备 的多通道可以通过TDE缩放,并叠加,合成一个画面显示在显示器中.

高清设备中的PIP叠加

将某个特定标清设备的视频层绑定到高清设备(绑定到高清设备还是高清设备的通道)上,与原有的视频层叠加.

标清设备的视频层此时只能作为此高清设备(难道PIP层是设备的概念,不是通道的概念?)的PIP层,不能作为其他高清设备

(难道视频层是设备的概念,不是通道的概念?)的视频层

设置该标清设备的输出为PIP

设置高清设备的通道为视频层

---------------------------------------------------------------------------------
设置设备公共属性并开启设备
---------------------------------------------------------------------------------
1/HI_MPI_VO_SetPubAttr
    参数1,vo dev id
    参数2,vo接口信息
    参数3,帧率
2/HI_MPI_VO_Enable
    参数, vo dev id

---------------------------------------------------------------------------------
设置视频层属性并开启视频层
---------------------------------------------------------------------------------
3/HI_MPI_VO_SetVideoLayerAttr
    参数1,vo dev id
    参数2,结构体,标识视频层属性
        stDispRect,显示分辨率
        stImageSize,视频层画布大小
        u32DispFrmRt,显示帧率//PAL下为24,NTSC下为30
        enPixFormat,像素格式//YUV
4/HI_MPI_VO_EnableVideoLayer
    参数, vo dev id

---------------------------------------------------------------------------------
设置通道属性并开启通道(通道的个数和开启设备/开启视频层无直接关系)
---------------------------------------------------------------------------------
5/HI_MPI_VO_SetChnAttr
    参数1,vo dev id
    参数2,通道ID
    参数3,结构体,标识通道属性
        u32Priority,通道优先级,高清范围在[0,1].标清范围在[0,通道数量-1]
        stRect,显示区域
        bDeflicker,是否开启抗闪烁
5/HI_MPI_VO_EnableChn
    参数1,vo dev id
    参数2,通道ID

模块4:VPSS

VPSS将进入VPSS通道的图像进行去噪/去隔行/缩放/锐化

VPSS模块有多个GROUP

一个GROUP有多个通道(通道分类为3种,分别是物理/直通/扩展)

物理通道:一个组的物理通道有多个,每个功能不同

直通通道:一个组有一个,只具备CROP(裁剪)功能

扩展通道:通过绑定物理通道可以将物理通道的输出作为扩展通道的输入,然后缩放,输出.

绑定示例

每个(特定vi设备的通道)可以和一个组的chn0绑定
每个(特定VO设备的通道)可以和一个组的通道绑定
-----------------------------------------------------------------------------
创建通道
-----------------------------------------------------------------------------
1/HI_MPI_VPSS_CreateGrp
    参数1,组id
    参数2,组属性
        最大图像宽度
        最大图像高度
        像素格式
        Die模式(去隔行/将交错的隔行视频源还原成逐行视频源)
        功能开启开关(5个)
-----------------------------------------------------------------------------
设置组属性 及 设置组高级属性
-----------------------------------------------------------------------------
2/HI_MPI_VPSS_GetGrpAttr
    参数1,组id
    参数2,组属性
3/HI_MPI_VPSS_SetGrpAttr
    参数1,组id
    参数2,组属性
4/HI_MPI_VPSS_GetGrpParam
    参数1,组id
    参数2,高级组属性
5/HI_MPI_VPSS_SetGrpParam
    参数1,组id
    参数2,高级组属性
        亮度
        对比度
        暗区增强
        亮区增强
        IE强度
        IE锐度
        空域去噪强度
        ...
-----------------------------------------------------------------------------
设置通道属性 及 使能通道
-----------------------------------------------------------------------------
6/HI_MPI_VPSS_SetChnAttr
    参数1,组id
    参数2,通道id
    参数3,通道属性
7/HI_MPI_VPSS_EnableChn
    参数1,组id
    参数2,通道id
-----------------------------------------------------------------------------
开启组
-----------------------------------------------------------------------------
8/HI_MPI_VPSS_StartGrp
    参数,组id

模块5:VENC

编码的话分为三块

  1. 接收图像(做缩小工作)
  2. 叠加(其实这一块不属于编码,只不多可以在venc的过程中做个region,可以有,可以没有)
  3. 编码
从接收图像那块,输入可以分为三类(输入的都是YUV,只不过输入的途径不一样)
1. 用户读图像,发送?
2. VIU输出
3. VPSS输出

从编码那块,编码可以分为四类
1. H.264
2. JPEG
3. MJPEG
4. MPEG-4

编码的过程可以分为两个过程
1. 控制码率
2. 编码

模块6:REGION

REGION的意思就是叠加一些区域

区域的话分为两种

一种为Overlay(时间戳,通道号,位图,背景色更新?)/OverlayEx

​ Overlay只能在GROUP通道叠加

​ OverlayEx可以在VI通道叠加

一种为Cover(色块)/CoverEx

​ Cover/CoverEx可以在VI通道叠加


-----------------------------------------------------------------------------
创建区域,此时还没显示在通道
-----------------------------------------------------------------------------
1/HI_MPI_RGN_Create
    参数1,区域句柄(ID)
    参数2,结构体,区域属性
        类型(Overlay/OverlayEx/Cover/CoverEx)
        对应类型的区域属性(注意:Cover和CoverEx没有区域属性)
            Overlay的区域属性(像素格式,区域背景色,区域的宽度)
            OverlayEx的区域属性(像素格式,区域背景色,区域的宽度)
-----------------------------------------------------------------------------
将区域叠加到通道
-----------------------------------------------------------------------------
2/HI_MPI_RGN_AttachToChn
    参数1,区域句柄(根据这个参数可以看出来,是attach到跟区域绑定的所有通道上的区域上,变化区域,所有通道会变化)
    参数2,结构体,通道属性
        模块类型
        dev号
        通道号
    参数3,叠加到通道,显示时的属性
        区域是否显示
        区域类型(Overlay/OverlayEx/Cover/CoverEx)
        属性,共同体(四种类型的属性)
            Overlay(区域起点坐标,前景Alpha,背景 Alpha,区域层次,编码QP值,反色配置信息)
            OverlayEx(区域起点坐标,前景Alpha,背景 Alpha,区域层次)
            Cover(区域位置(起点坐标,宽高),区域颜色,层次)
            CoverEx(区域位置(起点坐标,宽高),区域颜色,层次)

注:
前景Alpha : Alpha 位为 1 的像素点的透明度
背景Alpha : Alpha 位为 0 的像素点的透明度
-----------------------------------------------------------------------------
将位图叠加到区域(如果区域已经叠加到通道,那么会影响所有的被区域叠加的通道)
-----------------------------------------------------------------------------
3/HI_MPI_RGN_SetBitMap
    参数1,区域句柄(ID)
    参数2,位图信息,结构体
        像素格式
        宽度
        长度
        数据(这个数据可以利用位图转换函数填充,也可以手动填充)
-----------------------------------------------------------------------------
得到区域属性/设置区域属性
-----------------------------------------------------------------------------
4/HI_MPI_RGN_GetAttr
    参数1,区域句柄(ID)
    参数2,结构体,区域属性
5/HI_MPI_RGN_SetAttr
    参数1,区域句柄(ID)
    参数2,结构体,区域属性
-----------------------------------------------------------------------------
得到通道显示属性/设置通道显示属性
-----------------------------------------------------------------------------
6/HI_MPI_RGN_GetDisplayAttr
    参数1,区域句柄(ID)
    参数2,结构体,通道属性    
    参数3,叠加到通道,显示时的属性
7/HI_MPI_RGN_SetDisplayAttr
    参数1,区域句柄(ID)
    参数2,结构体,通道属性    
    参数3,叠加到通道,显示时的属性

模块7:VDEC

海思媒体处理平台提供的解码是硬解码功能,提供的API都是针对驱动的接口.

进来的码流不是直接接到通道里的,而是要通过调用函数接口将码流发送到通道中

原始输入为视频流,分为两种方式输入(流式输入和按帧输入)

发送到通道中

解码的话分为两种(流式解码和按帧解码)

输出的话分为两种(按显示序输出/按编码序输出)

注:
流式解码:开始接A帧的码,然后接到下一帧B帧才能知道结束,然后处理A按帧解码:开始接A帧的码,边接收边解码,直到接收完毕.//因为输入的码是按帧发送到输入端的

根据输入/解码/输出的不同匹配,可以构成下面三种图像输出方式

普通输出

流式输入->流式解码->显示序输出
按帧输入->按帧解码->显示序输出

直接输出

流式输入且按解码序输入->流式解码->解码序输出

按帧输出

按帧输入且按编码序输入->按帧解码->解码序输出

时间戳

时间戳只可以加在VIDEO_MODE_FRAME 下

时间戳加在VIDEO_MODE_STREAM下,为0

HI_MPI_VDEC_CreateChn
    码流解码方式
HI_MPI_VDEC_SetChnParam
    图象输出方式 s32DecOrderOutput

模块8:HDMI

接口调用顺序:

  1. VO
  2. HDMI
  3. 音频输出

ATTENTION : HDMI接口必须在VO后面,在音频输出前面

-----------------------------------------------------------------------------
HDMI初始化
-----------------------------------------------------------------------------
HI_MPI_HDMI_Init
    参数为结构体
        1/回调函数指针
        2/回调函数参数
        3/强制输出模式,枚举
            HI_HDMI_FORCE_NULL          标准
            HI_HDMI_FORCE_HDMI          HDMI输出
            HI_HDMI_FORCE_DVI           DVI输出
            HI_HDMI_INIT_BOOT_CONFIG    测试
HI_MPI_HDMI_Open
    参数,接口号,枚举
        HI_HDMI_ID_0 如果是HTMI,则取HI_HDMI_ID_0,即0
        HI_HDMI_ID_BUTT 
HI_MPI_HDMI_GetAttr
    参数1,接口号
    参数2,HDMI属性结构体
        stAttr.bEnableHdmi = HI_TRUE;是否强制输出HDMI
        stAttr.bEnableVideo = HI_TRUE;是否输出视频
        stAttr.enVideoFmt = enVideoFmt;视频输出制式,枚举
        stAttr.enVidOutMode = HI_HDMI_VIDEO_MODE_YCBCR444;
        stAttr.enDeepColorMode = HI_HDMI_DEEP_COLOR_OFF;
        stAttr.bxvYCCMode = HI_FALSE;
        stAttr.bEnableAudio = HI_FALSE;
        stAttr.enSoundIntf = HI_HDMI_SND_INTERFACE_I2S;
        stAttr.bIsMultiChannel = HI_FALSE;
        stAttr.enBitDepth = HI_HDMI_BIT_DEPTH_16;
        stAttr.bEnableAviInfoFrame = HI_TRUE;
        stAttr.bEnableAudInfoFrame = HI_TRUE;
        stAttr.bEnableSpdInfoFrame = HI_FALSE;
        stAttr.bEnableMpegInfoFrame = HI_FALSE;
        stAttr.bDebugFlag = HI_FALSE;              
        stAttr.bHDCPEnable = HI_FALSE;
        stAttr.b3DEnable = HI_FALSE;
HI_MPI_HDMI_SetAttr
    参数1,接口号
    参数2,HDMI属性结构体
HI_MPI_HDMI_Start
    参数,接口号

模块9:VDA

Video detection analysis

VDA有两种模式,没有组和设备的概念,直接是通道.

通道分为两种(通过HI_MPI_VDA_CreateChn函数的第二个参数指定)

  1. 一种是运动侦测,最后得到的结果是运动检测结果
  2. 一种是遮挡检测,最后得到的结果是遮挡检测结果

-----------------------------------------------------------------------------
创建通道
-----------------------------------------------------------------------------
HI_MPI_VDA_CreateChn
    参数1,通道号
    参数2,视频检测属性,结构体
        工作模式,枚举
            VDA_WORK_MODE_MD//运动
            VDA_WORK_MODE_OD//遮挡
            VDA_WORK_MODE_BUTT
        工作模式属性,联合体
        通道宽度//通道大小可以和输入源大小不一致
        通道高度//输入源图像的宽和高都必须大于等于通道属性的宽和高
-----------------------------------------------------------------------------
绑定输入源
-----------------------------------------------------------------------------
HI_MPI_SYS_Bind
注意:绑定的时候dst的DEVid为0
-----------------------------------------------------------------------------
启动VDA
-----------------------------------------------------------------------------
HI_MPI_VDA_StartRecvPic
    参数,通道号
-----------------------------------------------------------------------------
-----------------------------------------------------------------------------
怎么得到结果,结果怎么处理
-----------------------------------------------------------------------------
-----------------------------------------------------------------------------
一般来说创建一个线程,然后在线程里面通过函数HI_MPI_VDA_GetFd得到一个文件描述符,

然后监听这个文件描述符,如果有写入信息的话,然后通过一个函数HI_MPI_VDA_GetData得到数据,拿去处理,然后再通过一个函数HI_MPI_VDA_ReleaseData释放数据,循环
-----------------------------------------------------------------------------
-----------------------------------------------------------------------------

-----------------------------------------------------------------------------
得到文件描述符
-----------------------------------------------------------------------------
HI_MPI_VDA_GetFd
    参数,通道号
-----------------------------------------------------------------------------
得到数据
-----------------------------------------------------------------------------
HI_MPI_VDA_GetData
    参数1,通道号
    参数2,数据,结构体
        工作模式
        工作模式对应的数据,枚举体
        宏块大小,枚举?
        以宏块大小为单位的宽度
        以宏块大小为单位的高度
        时间戳
    参数3,是否阻塞
-----------------------------------------------------------------------------
释放数据,在得到数据那个函数里面可能malloc了一些内存,所以需要free
-----------------------------------------------------------------------------
HI_MPI_VDA_ReleaseData
    参数1,通道号
    参数2,数据,结构体
展开阅读全文

没有更多推荐了,返回首页