RGA模块的讲解
- RGA模块的作用
由于网页显示的图像是RGB的彩色图像,所以我们需要使用RGA模块把NV12的灰度图像转换成RGB的彩色图像。然后再把彩色图像赋值到ShareMemory共享内存里面。这节课主要的内容是RGA模块的初始化和如何获取经过RGA处理的RGB数据。
- RGA数据的获取
2.1. RGA模块的初始化
上面是RGA模块初始化的代码,这里使用的结构体是RGA_ATTR_S。RGA_ATTR_S结构体里面包含了两个重要的结构体,分别是stImgIn和stImgOut。stImgIn是视频输入的结构体,stImgOut是处理后的视频结构体。除了这两个重要的结构体外,还有公共参数需要设置
stImgIn结构体的设置:
stImgIn.u32Width:视频输入的分辨率宽度,这里使用的是1920
stImgIn.u32Height:视频输入的分辨率高度,这里使用的是1080
stImgIn.u32HorStride:视频输入的分辨率虚宽,虚宽的数值跟分辨率宽度数值一致都是1920
stImgIn.u32VirStride:视频输入的分辨率虚高,虚高的数值跟分辨率高度数值一致都是1080
stImgIn.imgType:视频输入的格式,这里设置的是NV12也就是IMAGE_TYPE_NV12
stImgIn.u32X:设置stImgIn的X坐标
stImgIn.u32Y:设置stImgIn的Y坐标
stImgOut结构体的设置:
stImgOut.u32Width:视频输出的分辨率宽度,这里使用的是1920
stImgOut.u32Height:视频输出的分辨率高度,这里使用的是1080
stImgOut.u32HorStride:视频输出的分辨率虚宽,虚宽的数值跟分辨率宽度数值一致都是1920
stImgOut.u32VirStride:视频输出的分辨率虚高,虚高的数值跟分辨率高度数值一致都是1080
stImgOut.imgType:视频输出的格式,这里设置的是RGB格式,IMAGE_TYPE_RGB888。
stImgOut.u32X:设置stImgOut的X坐标
stImgOut.u32Y:设置stImgOut的Y坐标
RGA公共参数
u16BufPoolCnt:缓冲区计数,默认是3
u16Rotation:旋转角度,这里填0,没有旋转角度
enFlip:镜像控制,这里选择RGA_FLIP_H,水平镜像处理
bEnBufPool:使能缓冲池
设置完上述的参数后,调用RK_MPI_RGA_CreateChn设置RGA模块,第一个参数是RGA的通道号:0,第二个参数是RGA_ATTR_S结构体指针。
2.2. 创建get_vi_rga_thread线程获取RGA码流数据
需要调用pthread_create创建get_vi_rga_thread线程,我们来看get_vi_rga_thread线程里面的内容。在这个线程里面,需要调用RK_MPI_SYS_GetMediaBuffer获取RGA模块的数据。而RGA数据的来源是上节课我们讲解的get_camera_vi_thread线程发送的每一帧NV12数据(具体的流程如下图),最后把RGA的数据赋值到共享内存里面,代码是(共享内存的内容下节课讲解)。