MPI层
文件:Rockchip_Developer_Guide_MPI.pdf
RK MPI:Rockchip Media Process Interface,媒体处理接口。
模块介绍
RK MPI层的模块介绍:
IPC的应用
- VI 模块捕获视频图像,可对其做剪切、缩放、镜像等处理,并输出多路不同分辨率的图像数据。
- VDEC 模块对编码后的视频码流进行解码,并将解析后的图像数据送 VPSS 进行图像处理或直接送VO显示。可对 H.264/H.265/MJPEG/MPEG2/MPEG4等多种格式的视频码流进行解码。
- VPSS 模块接收 VI 和解码模块发送过来的图像,可对图像进行裁剪、缩放、旋转、镜像、贴图等处理,并实现同源输出多路不同分辨率的图像数据用于编码、预览、智能分析或抓拍。
- VENC 模块接收 VI 捕获并经 VPSS 处理后输出的图像数据,可叠加用户通过 Region模块设置的OSD 图像,然后按不同协议进行编码并输出相应码流。
- VO 模块接收 VPSS 处理后的输出图像,可进行播放控制等处理,最后按用户配置的输出协议输出给外围视频设备。
像素格式排布
RK MPI图像数据存储为大端模式,在平台图像输入和图像输出处理时需要注意这一点,否则将会出现RGB中B像素和R像素颠倒的情况出现。以RGB888/ARGB8888格式的图像存储为例:
系统绑定
RK MPI提供系统绑定接口(RK_MPI_SYS_Bind),即通过数据接收者绑定数据源来建立两者之间的关联关系(只允许数据接收者绑定数据源)。绑定后,数据源生成的数据将自动发送给接收者。目前RK MPI支持的绑定关系如下表:
API接口
主要介绍RKMPI 实例使用指南——编译运行中luckfox_pico_rtsp_yolov5所使用到的API接口
RK_MPI_SYS_Init |
【描述】
初始化RK MPI
系统。
【语法】
RK_S32 RK_MPI_SYS_Init(RK_VOID);
【参数】
无
【返回值】
【注意】
- 运行
RK MPI
系统前必须调用该接口进行初始化。 - 与
RK_MPI_SYS_Exit
成对使用,不允许连续调用该接口。 - 多个进程暂无法共享资源使用各模块,仅MB模块相关接口可多进程使用。
RK_MPI_SYS_Bind |
【描述】
数据源到数据接收者绑定的接口。
【语法】
RK_S32 RK_MPI_SYS_Bind(const MPP_CHN_S *pstSrcChn, const MPP_CHN_S *pstDestChn);
【参数】
【返回值】
【注意】
- 系统目前支持的绑定关系,请参见系统绑定章节。
- 同一个数据接收者只能绑定一个数据源。
- 绑定是指数据源和数据接收者建立关联关系。绑定后,数据源生成的数据将自动发送给接收者。
VI
和VDEC
作为数据源,是以通道为发送者,向其他模块发送数据,用户将设备号置为 0,SDK不检查输入的设备号。VPSS
作为数据接收者时,是以设备(GROUP
)为接收者,接收其他模块发来的数据,用户将通道号置为 0。- 模块作为数据发送者时,没有图像队列深度(
DEPTH
)设置的模块,绑定后无法调用自身模块的接口获取图像,能够设置图像深度的模块,必须图像深度不为0才可手动获取图像。
RK_MPI_VPSS_GetChnFrame |
【描述】
用户从通道获取一帧处理完成的图像。
【语法】
RK_S32 RK_MPI_VPSS_GetChnFrame(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, VIDEO_FRAME_INFO_S *pstVideoFrame, RK_S32 s32MilliSec);
【参数】
【返回值】
【注意】
GROUP
必须已创建。- 队列深度不为 0,才能获取到图像。
- 调用该接口获取图像,不会对后端绑定的模块有影响。如后端绑定
VO
显示,可以在显示过程中获取图像,VO
仍正常显示,不会受到影响。 - 当
s32MilliSec
设为-1 时,表示阻塞模式,程序一直等待,直到获取到图像才返回。如果s32MilliSec
等于 0 时,表示非阻塞模式。如果s32MilliSec
大于 0 时,表示超时等待模式,参数的单位是毫秒,指超时时间,在此时间内如果没有获取到图像,则超时返回。 - 通道为
PAST
模式时,调用该接口时会使用VGS进行图像处理。 - 默认在私有MB模式下,通道为
USER
模式时,最大输出帧个数限制到3个。 - 默认在私有MB模式下,通道为
PAST
模式时,不限制最大输出帧个数。 - 推荐队列深度设置为3个以内,否则在队列输出图像超过3个时,
VPSS
将会停止工作,同时同一Group
的其他通道也将停止工作。
RK_MPI_MB_Handle2VirAddr |
【描述】
获取一个内存缓存池中的缓存块的用户态虚拟地址。
【语法】
RK_VOID *RK_MPI_MB_Handle2VirAddr(MB_BLK mb);
【参数】
【返回值】
【举例】
用户获取YUV图像数据,可以通过RK_MPI_MB_Handle2VirAddr
转换pMbBlk
成虚拟地址来使用
data = RK_MPI_MB_Handle2VirAddr(sFrame.stVFrame.pMbBlk);
fwrite(data, 1, sFrame.stVFrame.u32Width * sFrame.stVFrame.u32Height * 3 /2, fp);
fflush(fp);
RK_MPI_VENC_SendFrame |
【描述】
用户发送原始图像进行编码。
【语法】
RK_S32 RK_MPI_VENC_SendFrame(VENC_CHN VeChn, const VIDEO_FRAME_INFO_S *pstFrame, RK_S32 s32MilliSec);
【参数】
【返回值】
RK_MPI_VENC_GetStream |
【描述】
获取编码的码流。
【语法】
RK_S32 RK_MPI_VENC_GetStream(VENC_CHN VeChn, VENC_STREAM_S *pstStream, RK_S32s32MilliSec);
【参数】
【返回值】
RK_MPI_VPSS_ReleaseChnFrame |
【描述】
用户释放一帧通道图像。
【语法】
RK_S32 RK_MPI_VPSS_ReleaseChnFrame(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, const VIDEO_FRAME_INFO_S *pstVideoFrame);
【参数】
【返回值】
【注意】
- 此接口需与
RK_MPI_VPSS_GetChnFrame
配对使用。 - 接口调用同
RK_MPI_VPSS_GetChnFrame
调用次数一一对应,不允许同一帧多次调用。 - 通过
RK_MPI_VPSS_GetChnFrame
获取的帧,需要及时调用该接口释放,否则达到最大输出帧个数后无法获取新的帧。
RK_MPI_VENC_ReleaseStream |
【描述】
释放码流缓存。
【语法】
RK_S32 RK_MPI_VENC_ReleaseStream(VENC_CHN VeChn, VENC_STREAM_S *pstStream);
【参数】
【返回值】
RK_MPI_SYS_UnBind |
【描述】
数据源到数据接收者解绑定。
【语法】
RK_S32 RK_MPI_SYS_UnBind(const MPP_CHN_S *pstSrcChn, const MPP_CHN_S *pstDestChn);
【参数】
【返回值】
【注意】
pstDestChn
如果找不到绑定的源通道或者找到了绑定的源通道,但是绑定的源通道和pstSrcChn
不匹配,则返回失败。
RK_MPI_VI_DisableChn |
【描述】
禁用 VI 通道。
【语法】
RK_S32 RK_MPI_VI_DisableChn(VI_PIPE ViPipe, VI_CHN VIChn);
【参数】
【返回值】
【注意】
PIPE
必须已绑定设备,否则会返回失败。
RK_MPI_VI_DisableDev |
【描述】
禁用VI设备。
【语法】
RK_S32 RK_MPI_VI_DisableDev(VI_DEV ViDev);
【参数】
【返回值】
【注意】
- 如果
VI
设备未启用,则返回未启用的VI
错误码。 - 禁用
VI
设备会禁用设备下所有VI
通道。如果只有关闭一个通道,调用关闭通道函数即可。
RK_MPI_VPSS_StopGrp |
【描述】
禁用VPSS GROUP
。
【语法】
RK_S32 RK_MPI_VPSS_StopGrp(VPSS_GRP VpssGrp);
【参数】
【返回值】
【注意】
GROUP
必须已创建。- 同组调用该函数仅第一次调用成功,重复调用返回失败。
RK_MPI_VPSS_DestroyGrp |
【描述】
销毁一个VPSS GROUP
。
【语法】
RK_S32 RK_MPI_VPSS_DestroyGrp(VPSS_GRP VpssGrp);
【参数】
【返回值】
【注意】
GROUP
必须已创建。- 调用此接口之前,必须先调用
RK_MPI_VPSS_StopGrp
禁用此GROUP
。 - 调用此接口时,会一直等待此
GROUP
当前任务处理结束才会真正销毁。
RK_MPI_VENC_StopRecvFrame |
【描述】
停止编码通道接收输入图像。
【语法】
RK_S32 RK_MPI_VENC_StopRecvFrame(VENC_CHN VeChn);
【参数】
【返回值】
RK_MPI_VENC_DestroyChn |
【描述】
销毁编码通道。
【语法】
RK_S32 RK_MPI_VENC_DestroyChn(VENC_CHN VeChn);
【参数】
【返回值】
RK_MPI_SYS_Exit |
【描述】
反初始化RK MPI
系统。
【语法】
RK_S32 RK_MPI_SYS_Exit(RK_VOID);
【参数】
无
【返回值】
【注意】
- 退出
RK MPI
系统前必须调用该函数。 - 与
RK_MPI_SYS_Init
成对使用,不允许连续调用该接口。
VI模块
视频输入(VI
)模块实现的功能:通过MIPI Rx
(含 MIPI 接口、LVDS 接口),BT.1120,BT.656,BT.601,DC 等接口接收视频数据。VI 将接收到的数据存入到指定的内存区域,实现视频数据的采集。
VI处理流程
VI
从软件上划分了输入设备(dev
),输入pipe
(暂未实现,采用dev
直通到chn
)、输出通道(channel
)三个层级。各芯片的设备、PIPE
、通道个数差异如下所示。
RV1106/RV1103 VI硬件处理流程框图
【注意】
- 如
vi
使用过程无赋值aEntityName
(参考VI_ISP_OPT_S
结构体定义),则默认chn0_out
对应mainpath
,chn1_out
对应selfpath
,chn2_out
对应bypasspath
。多路isp
使用时建议通过dev/pipe/channel
使用默认定义。 aEntityName
对应的/dev/videoX
节点X不是固定的,可以使用media-ctl
查看对应的节点。
各路输出分辨率限制如下表:
【注意】
- 以上分辨率输出限制是单路
isp
限制。 sensor
输入最大输入3072x1728 (5M) @30fps
,最小256x256
。device
编号根据dts
配置中sensor
连接的属性camera-module-index
值一一对应。sensor
输出最大分辨率根据sensor
的宽高比不同而不同,支持sensor
最大输出分辨率,并支持缩放。mainpath
支持卷绕模式,selfpath
和bypass
理论支持卷绕模式;同时只能支持一路码率和编码器卷绕。- 只有
selfpath
支持XBGR8888
格式输出。 - 支持对
rkisp_mainpath
于rkisp_bypasspath
通道的下采样采集。仅支持4x4的下采样。故各下采样通道的分辨率是对应通道分辨率的四分之一。下采样通道采集时,需在被采样对象通道开启后开启,在被采样通道停止前停止。 - 更多
isp
细节参看rv1106 datasheet
中isp
章节说明。
举例测试DEMO,为test_mpi_vi.cpp
。
VPSS模块
VPSS(Video Process Sub-System)
是视频处理子系统,支持的具体图像处理功能包括CROP
、Scale
、像素格式转换、固定角度旋转、Cover/Coverex
、Mirror/Flip
、压缩解压等。