2.2 H.264编码器核心模块
综合现有的硬件资源、实时性与实现难度等因素,设计中仅采用了帧内预测方式,编码器包括帧内预测模块、变换量化模块和CAVLC熵编码模块。处理时以宏块(16×16)为单位,亮度和色度块分别进行帧内预测、变换量化和反变换反量化,然后进行CAVLC熵编码,图像的亮色比为Y:U:V=4:2:O。
H.264编码器设计前期先用VC++在PC机上实现,后期移植到FPGA上用自定义硬件模块实现,二者所需时间如表1所列。可以看出,用硬件实现H.264压缩编码一帧图像只需约16 ms,较PC机实现有很大提高,而且硬件模块占用的资源不到50%,性价比较高。
由于自定义帧内预测硬件模块较软件实现对系统性能提高较大,这里重点分析帧内预测模块硬件结构设计。
根据H.264帧内预测算法,帧内预测模块是在非率失真优化模式下设计的。它通过接口模块从SDRAM中读入一个MB(16×16)的亮度和色度图像数据,在亮度和色度预测模块中对当前MB进行预测和预测模式选择,输出预测残差及最佳预测模式;同时将预测结果与经过反DCT变换和反量化之后的残差值相加,经重构模块补偿重构后写回SDRAM。主要结构如图7所示,整个模块分为4个子模块:接口模块、亮度预测、色度预测和图像重构模块。
接口模块中设计了4个RAM,用于存放读入的原始图像和用于预测的参考图像数据:RAM0存放亮度预测像素,深度32,地址0~15存放上侧预测参考像素,地址16~31存放左侧预测参考像素;RAMl存放当前宏块亮度原始值,深度为256;RAM2存放色度预测参考像素,深度32,地址0~7存放上侧Cb预测参考像素,地址8~15存放左侧Cb预测参考像素,地址16~23存放上侧cr预测参考像素,地址24~31存放左侧Cr预测参考像素;RAM3存放当前宏块色度原始值,深度为128。
亮度预测模块的内部结构如图8所示。
①模式选择模块根据当前宏块的预测参考像素可用信息(avail)指定当前宏块按一定顺序做预测,如avail=“11”表示上侧和左侧预测参考像素均可用,则对当前宏块顺序做DC、HOR、VERT、PLANE四种方式预测。在残差处理模块中,采用了2个RAM顺序保存各种预测模式的预测残差,所以在模式选择模块里会比较当前预测模式的代价函数和前一种预测模式代价函数的大小。如果当前预测模式的代价函数较小,则说明当前预测模式较优,在做下一种模式预测时将预测残差指定保存在上次较差预测模式的残差RAM中。当前宏块的可用预测模式都预测结束后,模式选择模块根据每一种模式预测代价函数决定出最优预测模式,并指出该预测模式对应残差处理模块中存放的RAM,将相应的残差输入到整数变换模块。
②预测模块包含了DC、HOR、VERT、PLANE四种预测模式的实现实体,根据模式选择模块决定的预测模式从接口模块读取预测参考像素和原始像素值,预测后残差输出到残差处理模块,预测值输出到补偿重构模块保存。
③残差处理模块采用2个存放残差的RAM,每个宏块可先并行做2种预测,残差分别保存到2个RAM中,选择其中较佳预测模式,再做下一种预测模式与前面所选较佳预测模式比较,直到完成所有预测模式选择出最佳预测模式。
④预测代价模块是计算每一种预测模式的预测代价,以4×4块为单位作hadamard变换,将变换后每个4×4块DC系数再做一次hadamard变换,将所有变换结果进行绝对值累加就是对应的预测代价。
色度预测模块结构基本和亮度预测相同,只是由于色度有Cb、Cr两个分量,残差在RAM中的存放方式略有差别;同一个宏块的色度预测和亮度预测是并行执行的,由于要处理的色度数据比亮度少一半,笔者在后面的整数变换中采用先处理色度,再处理亮度的方法,使得流水更加紧凑,减少等待时间,提高整个模块的运行速度。
3 结 论
笔者设计的基于NiosII的低码率实时H.264视频编码系统,在系统时钟频率100 MHz时,压缩一帧320×240的彩色图像需16.283 ms,在量化参数选择30时,图像压缩比达到2%,实时监控图像帧率25帧/s。系统具有资源占用较少,低成本,低码率,高清视频质量的特点,具有较好的发展前景。
图9为集成开发环境下综合仿真后系统的资源占用情况。