14.2.3 DM642下XviD CODEC优化(1)
第13章曾介绍过DM642实现视频编/解码技术的基本过程。C语言实现算法系统框架,线性汇编优化核心函数使模块尽可能软件流水,对于图像数据使用DMA双缓冲的方法,在L2的SRAM内存区开辟图像工作空间,后台开启DMA传输,配置L2 Cache,增加CPU存取数据的命中率。使用CCS开发软件的优化工具,优化组合编译开关,辅助开发人员进行算法优化。
表14-1所示的 XviD MPEG-4视频CODEC底层模块都需要汇编优化,或者Intrinsic指令优化。TI的图像算法库img64x.lib提供了图像处理的常用算法函数,有C语言、线性汇编语言和并行汇编的源代码。一方面开发人员可以直接使用这些库函数,另一方面参考、模仿其汇编优化过程和编程(www.cppentry.com)思路,对自己算法逐步深入汇编优化,如图像变换DCT,库img64x.lib就提供了并行度极高、完全建立了软件流水的函数IMG_fdct_8x8(),运动估计ME中判断块最佳匹配的SAD值函数IMG_sad_16x16()、IMG_sad_8x8()。在使用该库的时候,需特别注意输入源数据、输出结果的格式。如DCT中,输出的结果是每个元素左移了4位;计算SAD时,注意两个图像块边界是否和地址对齐,为了提高并行度尽可能使用对齐的数据存取指令。
下面对编/解码中的运动补偿MC模块作DM642优化。运动补偿的原理是根据运动向量MV的值,对当前宏块补偿出新的宏块,补偿的方式根据像素的精度有1/2、1/4、1/8之分。现在对1/2精度的函数作优化,其他精度的补偿优化读者可通过参考此例来实现。
1.水平方向插值补偿
水平方向插值的原理是图像块的第0列、第1列的元素对应取平均,结果放置在新块的第0列,图像块的第1列、第2列的元素对应取平均,结果放置新块的第1列,依次类推,直到处理完整个图像块。新块即为水平插值补偿块,C语言代码如下。
void interpolate8x8_halfpel_h(uint8_t* const dst,const uint8_t* const src, |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
上述代码首先使用地址不对齐指令读取数据源。然后右移并拼接形成4字节,接着取4对字节对应求平均,最后存储结果。每次处理两行,循环4次。
2.垂直方向插值补偿
垂直方向插值的原理是图像块的第0行、第1行的元素对应取平均,结果放置在新块的第0行,图像块的第1行、第2行的元素对应取平均,结果放置新块的第1行,依次类推,直到处理完整个图像块,新块即为垂直插值补偿块。C语言代码如下。
void interpolate8x8_halfpel_v(uint8_t* const dst,const uint8_t* const src, |
| 回书目 上一节 下一节 |