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的前后处理搭档。