4、Exynos G2D与IPP:掌握2D图形加速与图像后处理单元,用于色彩空间转换与缩放
好,我们进入第四章。这一章聊的是Exynos平台上的两个重要硬件模块——G2D和IPP。
说白了,G2D就是2D图形加速器,IPP是图像后处理单元。它们俩经常一起干活,完成色彩空间转换、图像缩放这些任务。我刚开始接触Exynos平台时,总觉得这些活儿用CPU也能干,何必折腾硬件?后来在项目里被性能瓶颈狠狠教育了一回,才明白硬件加速的价值。
4.1 G2D硬件加速器概览
G2D,全称是2D Graphics Accelerator。它专门处理2D图形操作,比如位块传输(Blit)、旋转、翻转、缩放、色彩空间转换等等。
你想想看,如果这些操作全扔给CPU,尤其是高分辨率视频帧处理,CPU会被活活累死。G2D就是为了解放CPU而生的。
核心能力:
- 支持多种像素格式:RGB565、RGB888、ARGB8888、YUV420、YUV422等
- 硬件色彩空间转换:RGB ↔ YUV,以及YUV子格式之间的转换
- 硬件缩放:支持双线性、最近邻等多种滤波算法
- 旋转/翻转:支持90°/180°/270°旋转,以及水平/垂直翻转
我记得第一次用G2D做视频帧缩放时,心里还犯嘀咕:这硬件能比CPU快多少?结果一测,同样的1080p缩放到720p,CPU要花8毫秒,G2D只用了不到1毫秒。差距就是这么明显。
4.2 IPP图像后处理单元
IPP,Image Post-Processing Unit。它和G2D有点像,但侧重点不同。IPP更专注于图像质量的提升,比如去噪、边缘增强、色彩校正这些。
在实际项目中,G2D和IPP经常配合使用。举个例子:
- G2D负责把YUV420帧缩放到目标分辨率
- IPP负责对缩放后的图像做色彩校正和去噪
- 最后G2D再把处理好的图像转换成RGB格式送给显示
这种流水线作业,效率非常高。我曾经在一个视频通话项目里,就是用这套组合拳,把端到端的延迟从40毫秒降到了15毫秒以内。
4.3 色彩空间转换实战
色彩空间转换,是视频处理里最基础也最频繁的操作。Exynos的G2D提供了硬件级的转换能力。
来看一个实际例子:把YUV420帧转换成RGB888。
// 配置G2D的色彩空间转换参数
struct g2d_image src_img, dst_img;
// 源图像:YUV420
src_img.width = 1920;
src_img.height = 1080;
src_img.color_format = G2D_FORMAT_YUV420;
src_img.buf[0] = y_plane_addr;
src_img.buf[1] = u_plane_addr;
src_img.buf[2] = v_plane_addr;
// 目标图像:RGB888
dst_img.width = 1920;
dst_img.height = 1080;
dst_img.color_format = G2D_FORMAT_RGB888;
dst_img.buf[0] = rgb_buf_addr;
// 执行转换
g2d_exec(&src_img, &dst_img, G2D_OP_CSC);
这段代码看起来简单,但背后有门道。我踩过一个坑:YUV420的UV平面排列方式,不同平台可能不一样。Exynos上默认是NV12格式(UV交错),但有些编码器输出的是NV21(VU交错)。搞错了,图像颜色就全乱了。
注意:YUV格式的排列方式一定要确认清楚。Exynos G2D支持多种YUV布局,但需要你在配置时明确指定。我曾经因为没注意这个细节,浪费了整整两天调试时间。
4.4 硬件缩放实现
缩放,说白了就是把图像变大或变小。G2D的缩放能力很强,支持任意比例的缩放。
我个人习惯用双线性滤波做缩放,效果和性能比较均衡。如果对质量要求极高,可以用三次卷积滤波,但性能会差一些。
// 配置缩放参数
struct g2d_transform transform;
transform.src_x = 0;
transform.src_y = 0;
transform.src_w = 1920;
transform.src_h = 1080;
transform.dst_x = 0;
transform.dst_y = 0;
transform.dst_w = 1280;
transform.dst_h = 720;
transform.scaling_mode = G2D_SCALING_BILINEAR;
// 执行缩放
g2d_scale(&src_img, &dst_img, &transform);
这里有个小技巧:如果源图像和目标图像的宽高比不一致,你得决定是裁剪还是加黑边。我一般选择裁剪,因为视频通话场景里,用户更在意看到完整的人脸,而不是黑边。
4.5 性能优化建议
在实际项目中,用好G2D和IPP,有几个关键点:
| 优化项 | 说明 | 我的经验 |
|---|---|---|
| 缓冲区对齐 | G2D要求缓冲区地址和宽度对齐到32字节 | 不对齐会导致性能下降甚至崩溃,我吃过亏 |
| 流水线设计 | 尽量让G2D和IPP并行工作 | 用双缓冲机制,一个在处理,一个在准备 |
| 减少内存拷贝 | 尽量用DMA直接传输,避免CPU介入 | 我见过有人每帧都做memcpy,性能直接腰斩 |
| 格式选择 | 优先使用硬件原生支持的格式 | YUV420是Exynos的强项,尽量用它 |
避坑指南:我曾经在Exynos 9810上遇到一个怪问题——G2D处理某些分辨率时,输出图像会有条纹。查了好久才发现,是源图像的宽度没有对齐到64字节。嗯,从那以后,我每次配置G2D都会检查对齐参数。
4.6 小结
G2D和IPP是Exynos平台上非常实用的硬件加速单元。掌握了它们,你就能高效地完成色彩空间转换、图像缩放这些基础操作。
说白了,硬件加速的核心思路就一条:让专业的硬件干专业的事。CPU负责调度和控制,G2D和IPP负责图像处理,各司其职,效率才能上去。
下一章,我们会深入MFC(Multi-Format Codec),看看视频编解码的硬件加速是怎么实现的。到时候你会发现,G2D和IPP经常是MFC的前后处理搭档。