前言
最近开始接触Hi3559,开启一段新的学习之旅,在这里简单记录一下学习过程以及遇到的问题
一、MPP是什么?
MPP是海思提供的媒体处理软件平台(Media Process Platform,简称 MPP),包括视频输入(VI)、视频 处理(VPSS)、视频编码(VENC)、视频解码(VDEC)、视频输出(VO)、视频拼接 (AVS)、音频输入(AI)、音频输出(AO)、音频编码(AENC)、音频解码(ADEC)、区域管理(REGION)等模块。
该平台对应用软件屏蔽了芯片相关的复杂的底层处理,并对应用软件直接提供 MPI(MPP Program Interface)接口完成相应功能。
更多关于MPP的详细介绍在官方的说明文档《HiMPP V4.0 媒体处理软件开发参考.pdf》中
- 应用程序启动 MPP 业务前,必须完成 MPP 系统初始化工作
- 应用程序退出 MPP 业务后,也要完成 MPP 系统去初始化工作,释放资源
二、系统绑定(Bind)
- 通过数据接收者绑定数据源来建立两者之间的关联关系(只允许数据接收者绑定数据源)。绑定后,数据源生成的数据将自动发送给接收者。
有点像QT的信号和槽的机制?
三、工作模式
VI 和 VPSS 各自的工作模式分为在线,离线,并行模式。
VI
- 在线模式:VI_CAP 与 VI_PROC 之间在线 数据流传输,此模式下 VI_CAP 不会写出 RAW 数据到 DDR, 而是直接把数据流送给 VI_PROC;
- 离线模式:VI_CAP 写出 RAW 数据到DDR,然后 VI_PROC 从 DDR 读取 RAW 数据进行后处理;
- 并行模式:当对接大数据量的时序,,需要 VI_CAP 与 两个 VI_PROC 处于并行模式,VI_CAP 直接把一帧数据送给两 个 VI_PROC 并行处理。
VPSS
-在线模式:VI_PROC 与 VPSS 之间的在线数据流传输,在此模式下 VI_PROC 不会写出 YUV 数据到 DDR,而 是直接把数据流送给 VPSS;
- 离线模式:VI_PROC 写出 YUV 数据到DDR,然后 VPSS 从 DDR 读取YUV 数据进行后处理;
- 并行模式:当对接大数据量的时序,需要 VI_CAP 与 两个 VI_PROC 处于并行模式, 同时两个 VPSS 也分别与 VI_PROC 处于并行模式, VI_CAP 直接把一帧数据送给两 个 VI_PROC 并行处理,再给 VPSS 并行处理。
VI_CAP模块可以接收并处理多达8个摄像头的输入信号,同时支持多种图像格式,包括YUV、RGB等。
VI_PROC模块可用于图像处理、视频编码、人脸识别等应用场景。能够增强图像的质量,使得用户能够用更高的效率处理数据。
四、代码实例
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include "sample_comm.h"
/******************************************************************************
* function : to process abnormal case
******************************************************************************/
void SAMPLE_VIO_HandleSig(HI_S32 signo)
{
//当捕获到异常信号后触发的自定义函数如下,主要是对信号的重新定义以及系统退出资源的释放
if (SIGINT == signo || SIGTERM == signo)
{
SAMPLE_COMM_All_ISP_Stop();
SAMPLE_COMM_SYS_Exit();
printf("\033[0;31mprogram termination abnormally!\033[0;39m\n");
}
exit(-1);
}
HI_S32 SAMPLE_VIO_StartViVo(SAMPLE_VI_CONFIG_S* pstViConfig, SAMPLE_VO_CONFIG_S* pstVoConfig)
{
HI_S32 s32Ret;
s32Ret = SAMPLE_COMM_VI_StartVi(pstViConfig);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("start vi failed!\n");
return s32Ret;
}
s32Ret = SAMPLE_COMM_VO_StartVO(pstVoConfig);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("SAMPLE_VIO start VO failed with %#x!\n", s32Ret);
goto EXIT;
}
return s32Ret;
EXIT:
//VO失败了需要把VI一同停止
SAMPLE_COMM_VI_StopVi(pstViConfig);
return s32Ret;
}
HI_S32 SAMPLE_VIO_StopViVo(SAMPLE_VI_CONFIG_S* pstViConfig, SAMPLE_VO_CONFIG_S* pstVoConfig)
{
SAMPLE_COMM_VO_StopVO(pstVoConfig);
SAMPLE_COMM_VI_StopVi(pstViConfig);
return HI_SUCCESS;
}
HI_S32 SAMPLE_VIO_4K30_FreeRotation(VO_INTF_TYPE_E enVoIntfType)
{
// Embeded isp, FreeRotation.
HI_S32 s32Ret; //返回值
VI_DEV ViDev = 0;
VI_PIPE ViPipe
文章介绍了海思的MPP媒体处理平台,包括其组成部分如VI、VPSS等模块,以及系统初始化、绑定机制和工作模式。提供了代码实例展示了如何使用MPP进行视频输入和输出,并涉及到了ISP和MIPI接口的相关知识。
最低0.47元/天 解锁文章
1160

被折叠的 条评论
为什么被折叠?



