RK3588 MPP,RGA,DRM,QT之RGA

本文介绍了如何利用RK3588的RGA硬件加速功能将多路视频帧合成一帧,适用于显示限制场景。通过设置RGA结构体,结合解码器输出的帧信息,进行视频混合,并最终输出到DRM显示。这是一个高效的方法,特别是在需要在有限图层上显示多个视频流时。

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

        在上篇的MPP解码中我们说到了,当我们获取到了解码的帧后,如果我们有多路视频需要同时显示,如果路数不多的话,我们可以采用在不同的层上显示,但是显示视频的层是有限制的,这个时候,我们就需要把这些视频合成一个视频在图层上显示了,这一章节,主要讲解怎么使用RGA把多路视频合成成一帧显示在图层上。

        RK的RGA是采用硬件加速来实现图形操作的,所以速度非常快,具体的RGA信息请参考RK提供的关于RGA的相关文档。本文只提供一个代码示例来说明如何把多路视频帧合成一帧输出。

        首先我们申请一个将要显示在的屏幕大小的MppFrame*dstFrm,然后我们把多路需要显示在屏幕不同位置的帧分别混合到这个dstFrm上面,最后把混合后的帧输出到DRM上即可。

一、获取从解码器得到帧的信息,hor_stride, ver_stride, width, height。srcFrm 为从解码器中获取到的帧。

RK_U32 hor_stride = mpp_frame_get_hor_stride(*srcFrm);

RK_U32 ver_stride = mpp_frame_get_ver_stride(*srcFrm);
width = mpp_frame_get_width(*srcFrm);
height = mpp_frame_get_height(*srcFrm);

二、把srcFrm 和dstF

### RK3588多媒体处理管道(MPP)架构 RK3588芯片集成了强大的多媒体处理能力,其多媒体处理管道(Media Processing Pipeline, MPP)设计用于高效处理视频编解码、图像处理和其他多媒体任务。该架构支持多种硬件加速模块,旨在提供高性能的同时降低功耗。 #### 架构概述 MPP由多个核心组件构成: - **VPU (Video Processing Unit)**:负责视频编码和解码操作,支持主流的视频标准如H.264/H.265等。 - **ISP (Image Signal Processor)**:专注于摄像头输入信号的预处理工作,包括降噪、色彩校正等功能。 - **GPU**:图形渲染单元可以辅助进行复杂的视觉效果计算以及部分AI推理运算。 - **NPU (Neural Processing Unit)**:神经网络处理器专门针对机器学习模型执行优化过的算法实现快速推断过程[^2]。 这些部件通过内部总线紧密相连,在操作系统层面提供了统一的应用编程接口(API),使得开发者能够方便地调用底层资源来构建丰富的多媒体应用。 #### 使用教程 为了充分利用RK3588上的MPP特性,建议按照如下指南开发应用程序: ##### 初始化环境配置 安装必要的软件包并设置好交叉编译工具链以便于后续的操作系统移植与驱动程序编写。对于Linux平台而言,则需准备内核源码树及其补丁文件以适应特定板级需求。 ```bash sudo apt-get update && sudo apt-get install build-essential git-core gcc-aarch64-linux-gnu git clone https://github.com/rockchip-linux/kernel.git -b rk3588 cd kernel/ patch -p1 < /path/to/rk3588_patches/*.patch ``` ##### 编写测试代码 创建简单的C/C++项目结构,并利用Rockchip官方提供的API库来进行基本的功能验证实验。下面是一个展示如何打开摄像机流并将帧数据传递给ISP做初步处理的例子: ```c #include <fcntl.h> #include <linux/videodev2.h> // ...其他头文件... int main() { int fd = open("/dev/video0", O_RDWR); struct v4l2_format fmt; memset(&fmt, 0, sizeof(fmt)); fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; ioctl(fd, VIDIOC_G_FMT, &fmt); // 获取当前格式 // 设置新的像素格式... fmt.fmt.pix.width = 1920; fmt.fmt.pix.height = 1080; fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV; ioctl(fd, VIDIOC_S_FMT, &fmt); // 启动捕获流程... } ``` 此段代码片段展示了访问视频设备节点的方式之一,实际应用场景下还需要考虑更多细节比如缓冲区管理、同步机制等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

dreamliweiming

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

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

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

打赏作者

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

抵扣说明:

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

余额充值