海思MPP API分析

本文详细介绍了MPP架构中的各个模块(如VI、VPSS、VENV、VDEC等)、控制流程、缓存管理以及关键接口的使用,包括视频和音频处理、编码解码、系统绑定和多媒体功能特性。示例代码展示了如何配置和绑定系统组件,以及编码/解码设置等技术细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

系统层次图:

MPP包含:

  • VI:视频输入
  • VPSS:视频处理
  • VENV:视频编码
  • VDEC:视频解码
  • VO:视频输出
  • AVS:视频拼接
  • AI:音频输入
  • AO:音频输出
  • AENC:音频编码
  • ADEC:音频解码
  • REGION:区域管理

MPP内部处理流程:

  • VI可进行去噪等处理,可输出多路
  • VPSS可进行图像增强/锐化等处理,同源输出多路不同分辨率图像

系统控制模块

  • 硬件复位,初始化
  • MPP内部各业务模块初始化
  • MPP内部各业务模块的工作状态
  • 大块物理内存管理

视频缓存池

  • 所有模块公用1个缓存池
  • hi_buffer.h中能够计算缓存池大小
  • mpi_vb.h中申请释放缓存池,申请释放block
  • hi_comm_video.h中定义了相关结构体

代码示例(sample_yuv.c):

VB_CAL_CONFIG_S stCalConfig;
VB_POOL_CONFIG_S stVbPoolCfg;
...
enCmpMode = COMPRESS_MODE_NONE;
enPixelFormat = g_stFrame.stVFrame.enPixelFormat;
enBitWidth = (DYNAMIC_RANGE_SDR8 == g_stFrame.stVFrame.enDynamicRange) ? DATA_BITWIDTH_8 : DATA_BITWIDTH_10;
u32Width  = g_stFrame.stVFrame.u32Width;
u32Height = g_stFrame.stVFrame.u32Height;

COMMON_GetPicBufferConfig(u32Width, u32Height, enPixelFormat, enBitWidth, enCmpMode, u32Align, &stCalConfig);

g_u32BlkSize = stCalConfig.u32VBSize;

memset(&stVbPoolCfg, 0, sizeof(VB_POOL_CONFIG_S));
stVbPoolCfg.u64BlkSize  = g_u32BlkSize;
stVbPoolCfg.u32BlkCnt   = 1;
stVbPoolCfg.enRemapMode = VB_REMAP_MODE_NONE;

/*create comm vb pool*/
g_hPool = HI_MPI_VB_CreatePool(&stVbPoolCfg);
if (VB_INVALID_POOLID == g_hPool)
{
    printf("HI_MPI_VB_CreatePool failed! \n");
    VPSS_Restore(Grp, Chn);
    return HI_NULL;
}

g_stMem.hPool = g_hPool;

while ((g_stMem.hBlock = HI_MPI_VB_GetBlock(g_stMem.hPool, g_u32BlkSize, HI_NULL)) == VB_INVALID_HANDLE)
{
    ;
}

系统绑定

  • 数据接收者绑定数据发送者
  • 绑定后,收据发送者的数据自动发送给数据接收者

接口(mpi_sys.h):

HI_S32 HI_MPI_SYS_Bind(const MPP_CHN_S *pstSrcChn, const MPP_CHN_S *pstDestChn);
HI_S32 HI_MPI_SYS_UnBind(const MPP_CHN_S *pstSrcChn, const MPP_CHN_S *pstDestChn);
HI_S32 HI_MPI_SYS_GetBindbyDest(const MPP_CHN_S *pstDestChn, MPP_CHN_S *pstSrcChn);
HI_S32 HI_MPI_SYS_GetBindbySrc(const MPP_CHN_S *pstSrcChn, MPP_BIND_DEST_S *pstBindDest);

示例代码(sample_comm_sys.c):

HI_S32 SAMPLE_COMM_VI_Bind_VO(VI_PIPE ViPipe, VI_CHN ViChn, VO_LAYER VoLayer, VO_CHN VoChn)
{
    MPP_CHN_S stSrcChn;
    MPP_CHN_S stDestChn;

    stSrcChn.enModId   = HI_ID_VI;
    stSrcChn.s32DevId  = ViPipe;
    stSrcChn.s32ChnId  = ViChn;

    stDestChn.enModId  = HI_ID_VO;
    stDestChn.s32DevId = VoLayer;
    stDestChn.s32ChnId = VoChn;

    CHECK_RET(HI_MPI_SYS_Bind(&stSrcChn, &stDestChn), "HI_MPI_SYS_Bind(VI-VO)");

    return HI_SUCCESS;
}

VI,VPSS工作模式

  • 在线模式
  • 离线模式
  • 并行模式

重要接口分析

HI_S32 HI_MPI_SYS_GetVPSSVENCWrapBufferLine(VPSS_VENC_WRAP_PARAM_S *pWrapParam, HI_U32 *pu32BufLine);

通过pWrapParam里计算卷绕buffer的行数,pWrapParam的参数如下:

typedef struct hiVPSS_VENC_WRAP_PARAM_S {
    HI_BOOL bAllOnline;

    HI_U32 u32FrameRate; /* Input frame rate of VIPROC(linear/Frame mode WDR is the sensor frame rate,
                          * and the line mode WDR is the frame rate after synthesis) */
    HI_U32 u32FullLinesStd; /* Total height of sensor, include of VBlank */

    SIZE_S stLargeStreamSize; /* VENC Large Stream Size */
    SIZE_S stSmallStreamSize; /* VENC Small Stream Size */

} VPSS_VENC_WRAP_PARAM_S;

视频输入(VI)

输入源:

  • MIPI
  • LVDS
  • HISPI
  • SLVS-EC
  • BT.1120
  • BT.656
  • BT.601
  • DC

重要概念:

  • LDC:镜头畸变校正
  • DIS:防抖
  • BAS:Bayer域缩放
  • 低延时:图像写出指定行数到DDR后,VI上报一个中断,把图像发给后端模块处理,可以减少延时,硬件会保证图像是先写后读,不会出现读图像错误
  • 提前上报中断:图像写出指定行数到DDR后,VI上报一个中断,把图像发给后端模块处理,可以减少延时,但没有和低延时一样的硬件机制保证后端模块读图像不会出错

功能框图:

  • VI设备相互独立
  • PIPE包含ISP的相关处理,处理后输出YUV

硬件单元功能框图:

视频输出(VO)

  • DHDx:Device HDx,高清设备x
  • VHDx:Video Layer of HDx,高清视频层
  • WD:Wirte Back Channel Device,回写通道设备
  • Gx:Graphic layer x,鼠标层

VPSS(Video Process Sub-System)视频处理子系统

功能支持:

  • FRC(Frame Rate Control)
  • CROP
  • Sharpen
  • 3DNR
  • Scale
  • 像素格式转换
  • LDC
  • Spread
  • 固定角度旋转
  • 任意角度旋转
  • 鱼眼校正
  • Cover/Coverex
  • Overlayex
  • Mosaic
  • Mirror/Flip
  • HDR
  • Aspect Ratio
  • 压缩/解压缩

上下文关系:

Hi3559AV100ES VPSS数据流图:

VENC

输入源:

  • File
  • VI->VPSS->VENC
  • VI->AVS->VENC
  • VI->VENC
  • VDEC->VPSS->VENC
  • VO->WBC->VENC

编码数据流图:

编码通道功能模块划分:

编码码率控制:

  • CBR(Constant Bit Rate):固定比特率
  • VBR(Variable Bit Rate):可变比特率
  • AVBR(Adaptive Variable Bit Rate):可变比特率,基于运动检测
  • QVBR(Quality Variable Bit Rate):可变比特率,基于主观图像质量
  • CVBR(Constrained Variable Bit Rate):基于VBR,并对码率进行限制,满足传输带宽和存储空间要求
  • FIXQP:固定Qp值
  • QPMAP:

VDEC

码流发送方式:

  • 流式发送
  • 按帧发送
  • 兼容模式发送

REGION

细节

AI/AO/AENC/ADEC

录音播放示意图:

AI/AO模块支持特性:

  • 重采样(RES)
  • 声音质量增强VQE(Voice Quality Enhancement),回声消除(AEC)/语音降噪(ANR)/自动增益(AGC)/高通滤波(HPF)/均衡器(EQ)/动态压缩/录音噪声消除(RNR)/动态压缩控制(DRC)/音量调节(GAIN)/参量均衡器(PEQ)/高动态范围(HDR)

UpVQE处理流程:

DnVQE处理流程:

视频图形子系统(VGS)

支持特性:

  • 缩放
  • 像素格式转换
  • 存储格式转换
  • 压缩/解压缩
  • COVER
  • OSD
  • 画线
  • 旋转
  • 动态范围转换

几何畸变校正GDC(Geometric Distortion Correction)

支持特性:

  • 鱼眼校正:360度全景/180度全景/Normal
  • LDC(镜头畸变校正)
  • 旋转
  • 输出图像拼接
  • 输出图像打背景色和展宽

全景拼接AVS(Any View Stitching)

支持特性:

  • 融合拼接(AVS_MODE_BLEND)
  • 非融合拼接(水平/垂直/田字形)(AVS_MODE_NOBLEND_VER/AVS_MODE_NOBLEND_HOR/AVS_MODE_NOBLEND_QR)

### 海思 MPP 摄像头操作概述 海思多媒体处理平台 (MPP, Media Process Platform) 是一种强大的媒体处理框架,能够支持多种类型的硬件设备和应用场景。对于摄像头的操作而言,MPP 提供了一套完整的接口来管理传感器数据流、图像信号处理以及后续的编码与传输。 #### 1. **初始化 Sensor** 在基于海思芯片(如 Hi3559A)的开发环境中,通常需要先完成 CMOS 图像传感器的驱动加载工作。这一步骤涉及配置 MIPI 接口参数并启动 YUV 数据流采集过程[^2]。具体的源文件位于 `isp/sensor/hi35xx` 下的相关 `.c` 文件中,例如: ```c // 示例代码片段:CMOS 初始化函数调用 int sensor_init(void) { int ret; ret = xxx_cmos_init(); if (ret != 0) { printf("Failed to initialize cmos\n"); return -1; } return 0; } ``` 上述代码展示了如何通过调用特定于硬件型号的初始化方法 (`xxx_cmos_init`) 来设置传感器环境。 --- #### 2. **创建 VI Channel 和 Pipe** VI (Video Input) 组件负责接收来自 Camera 的原始帧数据,并将其传递给 ISP 进行预处理。开发者需定义相应的通道 (Channel) 及管道 (Pipe),以便正确绑定资源。 以下是构建 VI 架构的核心 API 调用流程: ```c #include "mpi_vi.h" void create_vi_channel(VI_PIPE pipe_id, VI_CHN chn_id) { VI_ATTR_S vi_attr; // 定义属性结构体变量 memset(&vi_attr, 0, sizeof(vi_attr)); /* 设置分辨率 */ vi_attr.stSize.u32Width = 1920; vi_attr.stSize.u32Height = 1080; /* 启动 VI PIPE */ MVICreate(pipe_id); MPI_VI_SetAttr(pipe_id, &vi_attr); /* 创建 CHN 并启用 */ MPI_VI_EnableChn(pipe_id, chn_id); } create_vi_channel(PIPE_0, CHN_0); // 实际应用中的 ID 值可能不同 ``` 此部分实现了对指定 VI 管道及其子信道的功能设定[^1]。 --- #### 3. **集成 ISP 处理逻辑** ISP (Image Signal Processor) 是整个视觉链路的关键环节之一,它承担着降噪、白平衡调整等多项任务。借助 MPP 中提供的工具集,用户可灵活定制所需效果。 下面是一段用于激活默认 ISP 参数的例子: ```c #include "mpi_isp.h" void enable_default_isp_settings(ISP_DEV dev_id) { ISP_CTRL_PARAM_S param; memset(&param, 0, sizeof(param)); /* 应用标准模式 */ param.enCtrlCmd = ISP_CMD_SET_DEFAULT_MODE; MPI_ISP_Control(dev_id, &param); } enable_default_isp_settings(ISP_DEV_0); ``` 这段程序说明了怎样利用控制命令向目标设备发送指令以优化画质表现。 --- #### 4. **获取输出 Frame Buffer** 最后,在所有前期准备工作完成后,应用程序应当准备读取由系统生成的画面缓冲区内容。这部分可以通过订阅事件通知机制或者轮询的方式达成目的。 典型的数据提取循环如下所示: ```c #include "sample_comm_video.h" void capture_frame_loop() { VIDEO_FRAME_INFO_S stFrameInfo; while (true) { SAMPLE_COMM_VIDEO_GetOneFrame(&stFrameInfo); // 获取单帧信息 process_image(stFrameInfo.pVirAddr[0]); // 自定义图片分析算法入口 SAMPLE_COMM_VIDEO_ReleaseOneFrame(&stFrameInfo); // 解锁当前缓存页 } } ``` 以上脚本体现了从底层直至高层业务层之间的衔接关系。 --- ### 总结 综上所述,要成功运用海思 MPP 对摄像头进行操控,则必须经历以下几个主要阶段——Sensor 配置、VI 结构搭建、ISP 功能介入以及最终结果呈现。每一步都紧密关联且缺一不可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码论斤卖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值